From 4d38bb9102c68e8f29124f70d4e910ffb7879b8b Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Fri, 21 Jul 2023 14:58:58 +0300 Subject: [PATCH 01/27] PMM-7 build devcontainer with gh actions (#2176) * PMM-7 add an action to build the devcontainer * PMM-7 do not build twice * PMM-7 make the workflow run on call and dispatch --- .github/workflows/devcontainer.yml | 62 ++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 .github/workflows/devcontainer.yml diff --git a/.github/workflows/devcontainer.yml b/.github/workflows/devcontainer.yml new file mode 100644 index 0000000000..1a2957e7f4 --- /dev/null +++ b/.github/workflows/devcontainer.yml @@ -0,0 +1,62 @@ +name: Devcontainer +on: + workflow_dispatch: + inputs: + branch: + description: "The branch to build the devcontainer from" + default: "main" + required: true + type: string + workflow_call: + inputs: + branch: + description: "The branch to build the devcontainer from" + default: "main" + required: true + type: string + +jobs: + devcontainer: + name: Build + runs-on: ubuntu-22.04 + timeout-minutes: 15 + strategy: + fail-fast: false + permissions: + packages: write + + env: + LAB_DEVCONTAINER_IMAGE: perconalab/pmm-server:dev-container + GH_DEVCONTAINER_IMAGE: ghcr.io/percona/pmm:dev-container + + steps: + - name: Check out code + uses: actions/checkout@v3 + with: + ref: ${{ github.event.inputs.branch }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to ghcr.io registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Login to docker.io registry + uses: docker/login-action@v2 + with: + registry: docker.io + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Build and push to registries + uses: docker/build-push-action@v4 + with: + file: ./devcontainer.Dockerfile + push: true + tags: | + ${{ env.GH_DEVCONTAINER_IMAGE }} + ${{ env.LAB_DEVCONTAINER_IMAGE }} From 0c9fdbe6593ef72db48129e0e4b4ea55a65bda69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Mon, 24 Jul 2023 07:40:57 +0200 Subject: [PATCH 02/27] PMM-10665 Func to get cache sizes from DB variables. (#2362) * PMM-10655 Func to get cache sizes from DB variables. * PMM-10665 Add logs. * PMM-10665 Fix. * PMM-10665 Add debug log. --- agent/agents/mysql/perfschema/perfschema.go | 38 +++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/agent/agents/mysql/perfschema/perfschema.go b/agent/agents/mysql/perfschema/perfschema.go index ad300484c5..648a2cb3a5 100644 --- a/agent/agents/mysql/perfschema/perfschema.go +++ b/agent/agents/mysql/perfschema/perfschema.go @@ -18,6 +18,7 @@ package perfschema import ( "context" "database/sql" + "fmt" "io" "math" "sync" @@ -119,6 +120,39 @@ type newPerfSchemaParams struct { const queryTag = "agent='perfschema'" +// getPerfschemaSummarySize returns size of rows for perfschema summary cache. +func getPerfschemaSummarySize(q reform.Querier, l *logrus.Entry) uint { + var name string + var size uint + + query := fmt.Sprintf("SHOW VARIABLES /* %s */ LIKE 'performance_schema_digests_size'", queryTag) + err := q.QueryRow(query).Scan(&name, &size) + if err != nil { + l.Debug(err) + size = summariesCacheSize + } + + l.Infof("performance_schema_digests_size=%d", size) + + return size +} + +// getPerfschemaHistorySize returns size of rows for perfschema history cache. +func getPerfschemaHistorySize(q reform.Querier, l *logrus.Entry) uint { + var name string + var size uint + query := fmt.Sprintf("SHOW VARIABLES /* %s */ LIKE 'performance_schema_events_statements_history_long_size'", queryTag) + err := q.QueryRow(query).Scan(&name, &size) + if err != nil { + l.Debug(err) + size = historyCacheSize + } + + l.Infof("performance_schema_events_statements_history_long_size=%d", size) + + return size +} + // New creates new PerfSchema QAN service. func New(params *Params, l *logrus.Entry) (*PerfSchema, error) { if params.TextFiles != nil { @@ -152,12 +186,12 @@ func New(params *Params, l *logrus.Entry) (*PerfSchema, error) { } func newPerfSchema(params *newPerfSchemaParams) (*PerfSchema, error) { - historyCache, err := newHistoryCache(historyMap{}, retainHistory, historyCacheSize, params.LogEntry) + historyCache, err := newHistoryCache(historyMap{}, retainHistory, getPerfschemaHistorySize(*params.Querier, params.LogEntry), params.LogEntry) if err != nil { return nil, errors.Wrap(err, "cannot create cache") } - summaryCache, err := newSummaryCache(summaryMap{}, retainSummaries, summariesCacheSize, params.LogEntry) + summaryCache, err := newSummaryCache(summaryMap{}, retainSummaries, getPerfschemaSummarySize(*params.Querier, params.LogEntry), params.LogEntry) if err != nil { return nil, errors.Wrap(err, "cannot create cache") } From cf336859a8ab8e73da9caa892e8d8f75cc2e1938 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Mon, 24 Jul 2023 11:51:12 +0300 Subject: [PATCH 03/27] PMM-12351 build devcontainer with gh actions (#2380) * PMM-12351 build devcontainer with gh actions This fixes the reference to docker.io secrets * PMM-12351 fix a typo --- .github/workflows/devcontainer.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/devcontainer.yml b/.github/workflows/devcontainer.yml index 1a2957e7f4..9d44ae50e7 100644 --- a/.github/workflows/devcontainer.yml +++ b/.github/workflows/devcontainer.yml @@ -49,8 +49,8 @@ jobs: uses: docker/login-action@v2 with: registry: docker.io - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Build and push to registries uses: docker/build-push-action@v4 From b8ead6d73553def227f48289e0b18d9c447be4f0 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Mon, 24 Jul 2023 18:47:42 +0300 Subject: [PATCH 04/27] PMM-7 temp disable PMM CLI tests (#2381) --- .github/workflows/admin.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/admin.yml b/.github/workflows/admin.yml index 64d05ed1ca..fbb8459402 100644 --- a/.github/workflows/admin.yml +++ b/.github/workflows/admin.yml @@ -82,6 +82,7 @@ jobs: cli-test: name: CLI Tests + if: false runs-on: ubuntu-22.04 strategy: fail-fast: false From 46ecd31e6a0ea1597bf01f44add79465dacfaf14 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Mon, 24 Jul 2023 19:00:12 +0300 Subject: [PATCH 05/27] PMM-11658 move the exporter configs away from /tmp (#2341) * PMM-11658 move TempDir inside the main dist tree * PMM-11658 add panic on error for tmp creation * PMM-11658 panic using the logger * PMM-11658 refactor old APIs PMM_11658 change the message wording * PMM-11658 throw away redundant installs * PMM-11658 cleanup the tmp directory an agent shutdown PMM-11658 remove a debug statement PMM-11658 format the code PMM-11658 fix a linter error * PMM-11658 clean TmpDir on agent stop event * PMM-11658 fix the tmp path in tests * PMM-11658 fix timing in TmpDir path assignment and creation * PMM-11658 refactor TempDir assignment logic PMM-11658 skip the failing test PMM-11658 print some debug info * PMM-11658 set a nicer user prompt for docker PMM-11658 print more debug info * PMM-11658 refactor TmpDir to be relative of cwd PMM-11658 format the code * PMM-11658 do not use root dirs in tests * PMM-11658 fix linter errors * PMM-11658 use t.Cleanup vs defer * PMM-11658 adress review comments * PMM-11658 make TempDir relative to BasePath, fix tests * PMM-11658 minor corrections * PMM-11658 fix the prompt * PMM-11658 revert .golangci.yml * PMM-11658 remove redundant TmpDir creation * PMM-11658 fix the lint error --- .github/workflows/admin.yml | 1 - agent/agents/supervisor/supervisor.go | 6 ++ agent/commands/run.go | 6 +- agent/config/config.go | 28 ++++++-- agent/config/config_test.go | 95 +++++++++++++++++++-------- build/docker/server/Dockerfile.el9 | 13 ++-- managed/cmd/pmm-managed/main.go | 16 +++-- 7 files changed, 118 insertions(+), 47 deletions(-) diff --git a/.github/workflows/admin.yml b/.github/workflows/admin.yml index fbb8459402..fbd0d26e49 100644 --- a/.github/workflows/admin.yml +++ b/.github/workflows/admin.yml @@ -127,7 +127,6 @@ jobs: - name: Setup tools run: | - sudo apt-get install -y wget jq sudo ln -sf /home/runner/go/bin/pmm /usr/bin sudo chown -R runner:docker /usr/bin/pmm diff --git a/agent/agents/supervisor/supervisor.go b/agent/agents/supervisor/supervisor.go index 3538644ba4..f33595efa6 100644 --- a/agent/agents/supervisor/supervisor.go +++ b/agent/agents/supervisor/supervisor.go @@ -359,6 +359,12 @@ func (s *Supervisor) setBuiltinAgents(builtinAgents map[string]*agentpb.SetState <-agent.done delete(s.builtinAgents, agentID) + + agentTmp := filepath.Join(s.cfg.Get().Paths.TempDir, strings.ToLower(agent.requestedState.Type.String()), agentID) + err := os.RemoveAll(agentTmp) + if err != nil { + s.l.Warnf("Failed to cleanup directory '%s': %s", agentTmp, err.Error()) + } } // restart diff --git a/agent/commands/run.go b/agent/commands/run.go index f5acd13386..22878c350b 100644 --- a/agent/commands/run.go +++ b/agent/commands/run.go @@ -40,6 +40,7 @@ import ( // Run implements `pmm-agent run` default command. func Run() { + var cfg *config.Config l := logrus.WithField("component", "main") ctx, cancel := context.WithCancel(context.Background()) defer l.Info("Done.") @@ -55,6 +56,9 @@ func Run() { s := <-signals signal.Stop(signals) l.Warnf("Got %s, shutting down...", unix.SignalName(s.(unix.Signal))) //nolint:forcetypeassert + if cfg != nil { + cleanupTmp(cfg.Paths.TempDir, l) + } cancel() }() @@ -64,7 +68,7 @@ func Run() { l.Fatalf("Failed to load configuration: %s.", err) } - cfg := configStorage.Get() + cfg = configStorage.Get() cleanupTmp(cfg.Paths.TempDir, l) connectionUptimeService := connectionuptime.NewService(cfg.WindowConnectedTime) diff --git a/agent/config/config.go b/agent/config/config.go index eebca14167..0ca42d6c96 100644 --- a/agent/config/config.go +++ b/agent/config/config.go @@ -17,6 +17,7 @@ package config import ( "fmt" + "io/fs" "net" "net/url" "os" @@ -25,6 +26,7 @@ import ( "strings" "time" + "github.com/pkg/errors" "github.com/sirupsen/logrus" "golang.org/x/sys/unix" "gopkg.in/alecthomas/kingpin.v2" @@ -34,7 +36,10 @@ import ( "github.com/percona/pmm/version" ) -const pathBaseDefault = "/usr/local/percona/pmm2" +const ( + pathBaseDefault = "/usr/local/percona/pmm2" + agentTmpPath = "tmp" // temporary directory to keep exporters' config files, relative to pathBase +) // Server represents PMM Server configuration. type Server struct { @@ -179,7 +184,7 @@ func getFromCmdLine(cfg *Config, l *logrus.Entry) (string, error) { } // get is Get for unit tests: it parses args instead of command-line. -func get(args []string, cfg *Config, l *logrus.Entry) (configFileF string, err error) { //nolint:nonamedreturns +func get(args []string, cfg *Config, l *logrus.Entry) (configFileF string, err error) { //nolint:nonamedreturns,cyclop // tweak configuration on exit to cover all return points defer func() { if cfg == nil { @@ -212,7 +217,6 @@ func get(args []string, cfg *Config, l *logrus.Entry) (configFileF string, err e &cfg.Paths.RDSExporter: "rds_exporter", &cfg.Paths.AzureExporter: "azure_exporter", &cfg.Paths.VMAgent: "vmagent", - &cfg.Paths.TempDir: os.TempDir(), &cfg.Paths.PTSummary: "tools/pt-summary", &cfg.Paths.PTPGSummary: "tools/pt-pg-summary", &cfg.Paths.PTMongoDBSummary: "tools/pt-mongodb-summary", @@ -237,6 +241,16 @@ func get(args []string, cfg *Config, l *logrus.Entry) (configFileF string, err e cfg.Paths.ExportersBase = abs } + if cfg.Paths.TempDir == "" { + cfg.Paths.TempDir = filepath.Join(cfg.Paths.PathsBase, agentTmpPath) + l.Infof("Temporary directory is not configured and will be set to %s", cfg.Paths.TempDir) + } + + if !filepath.IsAbs(cfg.Paths.TempDir) { + cfg.Paths.TempDir = filepath.Join(cfg.Paths.PathsBase, cfg.Paths.TempDir) + l.Debugf("Temporary directory is configured as %s", cfg.Paths.TempDir) + } + if !filepath.IsAbs(cfg.Paths.PTSummary) { cfg.Paths.PTSummary = filepath.Join(cfg.Paths.PathsBase, cfg.Paths.PTSummary) } @@ -308,7 +322,7 @@ func get(args []string, cfg *Config, l *logrus.Entry) (configFileF string, err e } *cfg = *fileCfg - return //nolint:nakedret + return configFileF, nil } // Application returns kingpin application that will parse command-line flags and environment variables @@ -474,7 +488,7 @@ func Application(cfg *Config) (*kingpin.Application, *string) { // Other errors are returned if file exists, but configuration can't be loaded due to permission problems, // YAML parsing problems, etc. func loadFromFile(path string) (*Config, error) { - if _, err := os.Stat(path); os.IsNotExist(err) { + if _, err := os.Stat(path); errors.Is(err, fs.ErrNotExist) { return nil, ConfigFileDoesNotExistError(path) } @@ -510,8 +524,8 @@ func SaveToFile(path string, cfg *Config, comment string) error { func IsWritable(path string) error { _, err := os.Stat(path) if err != nil { - // File doesn't exists, check if folder is writable. - if os.IsNotExist(err) { + // File doesn't exist, check if folder is writable. + if errors.Is(err, fs.ErrNotExist) { return unix.Access(filepath.Dir(path), unix.W_OK) } return err diff --git a/agent/config/config_test.go b/agent/config/config_test.go index 7099e2688b..dad8c43458 100644 --- a/agent/config/config_test.go +++ b/agent/config/config_test.go @@ -42,10 +42,15 @@ func removeConfig(t *testing.T, name string) { require.NoError(t, os.Remove(name)) } +func generateTempDirPath(t *testing.T, basePath string) string { + t.Helper() + return filepath.Join(basePath, agentTmpPath) +} + func TestLoadFromFile(t *testing.T) { t.Run("Normal", func(t *testing.T) { name := writeConfig(t, &Config{ID: "agent-id"}) - defer removeConfig(t, name) + t.Cleanup(func() { removeConfig(t, name) }) cfg, err := loadFromFile(name) require.NoError(t, err) @@ -61,7 +66,7 @@ func TestLoadFromFile(t *testing.T) { t.Run("PermissionDenied", func(t *testing.T) { name := writeConfig(t, &Config{ID: "agent-id"}) require.NoError(t, os.Chmod(name, 0o000)) - defer removeConfig(t, name) + t.Cleanup(func() { removeConfig(t, name) }) cfg, err := loadFromFile(name) require.IsType(t, (*os.PathError)(nil), err) @@ -73,7 +78,7 @@ func TestLoadFromFile(t *testing.T) { t.Run("NotYAML", func(t *testing.T) { name := writeConfig(t, nil) require.NoError(t, os.WriteFile(name, []byte(`not YAML`), 0o666)) //nolint:gosec - defer removeConfig(t, name) + t.Cleanup(func() { removeConfig(t, name) }) cfg, err := loadFromFile(name) require.IsType(t, (*yaml.TypeError)(nil), err) @@ -110,7 +115,7 @@ func TestGet(t *testing.T) { RDSExporter: "/usr/local/percona/pmm2/exporters/rds_exporter", AzureExporter: "/usr/local/percona/pmm2/exporters/azure_exporter", VMAgent: "/usr/local/percona/pmm2/exporters/vmagent", - TempDir: os.TempDir(), + TempDir: "/usr/local/percona/pmm2/tmp", PTSummary: "/usr/local/percona/pmm2/tools/pt-summary", PTPGSummary: "/usr/local/percona/pmm2/tools/pt-pg-summary", PTMySQLSummary: "/usr/local/percona/pmm2/tools/pt-mysql-summary", @@ -128,16 +133,25 @@ func TestGet(t *testing.T) { }) t.Run("OnlyConfig", func(t *testing.T) { - name := writeConfig(t, &Config{ + var name string + var actual Config + + tmpDir := generateTempDirPath(t, pathBaseDefault) + t.Cleanup(func() { + removeConfig(t, name) + }) + + name = writeConfig(t, &Config{ ID: "agent-id", ListenAddress: "0.0.0.0", Server: Server{ Address: "127.0.0.1", }, + Paths: Paths{ + TempDir: tmpDir, + }, }) - defer removeConfig(t, name) - var actual Config configFilepath, err := get([]string{ "--config-file=" + name, }, &actual, logrus.WithField("test", t.Name())) @@ -161,7 +175,7 @@ func TestGet(t *testing.T) { RDSExporter: "/usr/local/percona/pmm2/exporters/rds_exporter", AzureExporter: "/usr/local/percona/pmm2/exporters/azure_exporter", VMAgent: "/usr/local/percona/pmm2/exporters/vmagent", - TempDir: os.TempDir(), + TempDir: "/usr/local/percona/pmm2/tmp", PTSummary: "/usr/local/percona/pmm2/tools/pt-summary", PTPGSummary: "/usr/local/percona/pmm2/tools/pt-pg-summary", PTMongoDBSummary: "/usr/local/percona/pmm2/tools/pt-mongodb-summary", @@ -178,18 +192,24 @@ func TestGet(t *testing.T) { assert.Equal(t, name, configFilepath) }) - t.Run("Mix", func(t *testing.T) { - name := writeConfig(t, &Config{ + t.Run("BothFlagsAndConfig", func(t *testing.T) { + var name string + var actual Config + tmpDir := generateTempDirPath(t, "/foo/bar") + t.Cleanup(func() { + removeConfig(t, name) + }) + + name = writeConfig(t, &Config{ ID: "config-id", Server: Server{ Address: "127.0.0.1", }, }) - defer removeConfig(t, name) - var actual Config configFilepath, err := get([]string{ "--config-file=" + name, + "--paths-tempdir=" + tmpDir, "--id=flag-id", "--log-level=info", "--debug", @@ -214,7 +234,7 @@ func TestGet(t *testing.T) { RDSExporter: "/usr/local/percona/pmm2/exporters/rds_exporter", AzureExporter: "/usr/local/percona/pmm2/exporters/azure_exporter", VMAgent: "/usr/local/percona/pmm2/exporters/vmagent", - TempDir: os.TempDir(), + TempDir: "/foo/bar/tmp", PTSummary: "/usr/local/percona/pmm2/tools/pt-summary", PTPGSummary: "/usr/local/percona/pmm2/tools/pt-pg-summary", PTMySQLSummary: "/usr/local/percona/pmm2/tools/pt-mysql-summary", @@ -234,7 +254,14 @@ func TestGet(t *testing.T) { }) t.Run("MixExportersBase", func(t *testing.T) { - name := writeConfig(t, &Config{ + var name string + var actual Config + + t.Cleanup(func() { + removeConfig(t, name) + }) + + name = writeConfig(t, &Config{ ID: "config-id", Server: Server{ Address: "127.0.0.1", @@ -242,11 +269,10 @@ func TestGet(t *testing.T) { Paths: Paths{ PostgresExporter: "/bar/postgres_exporter", ProxySQLExporter: "pro_exporter", + TempDir: "tmp", }, }) - defer removeConfig(t, name) - var actual Config configFilepath, err := get([]string{ "--config-file=" + name, "--id=flag-id", @@ -275,7 +301,7 @@ func TestGet(t *testing.T) { RDSExporter: "/base/rds_exporter", // default value AzureExporter: "/base/azure_exporter", // default value VMAgent: "/base/vmagent", // default value - TempDir: os.TempDir(), + TempDir: "/usr/local/percona/pmm2/tmp", PTSummary: "/usr/local/percona/pmm2/tools/pt-summary", PTPGSummary: "/usr/local/percona/pmm2/tools/pt-pg-summary", PTMongoDBSummary: "/usr/local/percona/pmm2/tools/pt-mongodb-summary", @@ -294,7 +320,14 @@ func TestGet(t *testing.T) { }) t.Run("MixPathsBase", func(t *testing.T) { - name := writeConfig(t, &Config{ + var name string + var actual Config + + t.Cleanup(func() { + removeConfig(t, name) + }) + + name = writeConfig(t, &Config{ ID: "config-id", Server: Server{ Address: "127.0.0.1", @@ -304,9 +337,7 @@ func TestGet(t *testing.T) { ProxySQLExporter: "/base/exporters/pro_exporter", }, }) - defer removeConfig(t, name) - var actual Config configFilepath, err := get([]string{ "--config-file=" + name, "--id=flag-id", @@ -335,7 +366,7 @@ func TestGet(t *testing.T) { RDSExporter: "/base/exporters/rds_exporter", // default value AzureExporter: "/base/exporters/azure_exporter", // default value VMAgent: "/base/exporters/vmagent", // default value - TempDir: os.TempDir(), + TempDir: "/base/tmp", PTSummary: "/base/tools/pt-summary", PTPGSummary: "/base/tools/pt-pg-summary", PTMongoDBSummary: "/base/tools/pt-mongodb-summary", @@ -354,18 +385,24 @@ func TestGet(t *testing.T) { }) t.Run("MixPathsBaseExporterBase", func(t *testing.T) { - name := writeConfig(t, &Config{ + var name string + var actual Config + + t.Cleanup(func() { + removeConfig(t, name) + }) + + name = writeConfig(t, &Config{ ID: "config-id", Server: Server{ Address: "127.0.0.1", }, Paths: Paths{ ExportersBase: "/foo/exporters", + TempDir: "/foo/tmp", }, }) - defer removeConfig(t, name) - var actual Config configFilepath, err := get([]string{ "--config-file=" + name, "--id=flag-id", @@ -392,7 +429,7 @@ func TestGet(t *testing.T) { RDSExporter: "/foo/exporters/rds_exporter", // default value AzureExporter: "/foo/exporters/azure_exporter", // default value VMAgent: "/foo/exporters/vmagent", // default value - TempDir: os.TempDir(), + TempDir: "/foo/tmp", PTSummary: "/base/tools/pt-summary", PTPGSummary: "/base/tools/pt-pg-summary", PTMongoDBSummary: "/base/tools/pt-mongodb-summary", @@ -413,14 +450,18 @@ func TestGet(t *testing.T) { t.Run("NoFile", func(t *testing.T) { wd, err := os.Getwd() require.NoError(t, err) + name := t.Name() + tmpDir := generateTempDirPath(t, pathBaseDefault) var actual Config configFilepath, err := get([]string{ "--config-file=" + name, + "--paths-tempdir=" + tmpDir, "--id=flag-id", "--debug", - }, &actual, logrus.WithField("test", t.Name())) + }, &actual, logrus.WithField("test", name)) + expected := Config{ ID: "flag-id", ListenAddress: "127.0.0.1", @@ -436,7 +477,7 @@ func TestGet(t *testing.T) { RDSExporter: "/usr/local/percona/pmm2/exporters/rds_exporter", AzureExporter: "/usr/local/percona/pmm2/exporters/azure_exporter", VMAgent: "/usr/local/percona/pmm2/exporters/vmagent", - TempDir: os.TempDir(), + TempDir: "/usr/local/percona/pmm2/tmp", PTSummary: "/usr/local/percona/pmm2/tools/pt-summary", PTPGSummary: "/usr/local/percona/pmm2/tools/pt-pg-summary", PTMongoDBSummary: "/usr/local/percona/pmm2/tools/pt-mongodb-summary", diff --git a/build/docker/server/Dockerfile.el9 b/build/docker/server/Dockerfile.el9 index 603a341565..925e4e6c08 100644 --- a/build/docker/server/Dockerfile.el9 +++ b/build/docker/server/Dockerfile.el9 @@ -6,6 +6,7 @@ ARG BUILD_DATE ENV LANG=en_US.utf8 ENV LC_ALL=en_US.utf8 ENV GF_PLUGIN_DIR=/srv/grafana/plugins +ENV PS1="[\u@\h \W] # " LABEL org.opencontainers.image.created ${BUILD_DATE} LABEL org.opencontainers.image.licenses AGPL-3.0 @@ -26,10 +27,10 @@ WORKDIR /opt # yum -y install epel-release RUN microdnf -y install yum && yum -y install python3-pip && \ - yum -y install oracle-epel-release-el9 ansible-core && \ - yum -y install epel-release && \ - yum -y install glibc-langpack-en && \ - yum -y install ansible vi + yum -y install oracle-epel-release-el9 ansible-core && \ + yum -y install epel-release && \ + yum -y install glibc-langpack-en && \ + yum -y install ansible vi COPY RPMS /tmp/RPMS COPY gitCommit /tmp/gitCommit @@ -38,8 +39,8 @@ COPY ansible /opt/ansible # NOTE: this needs to be refactored, since some of the playbooks are duplicates RUN cp -r /opt/ansible/roles /opt/ansible/pmm2-docker/roles RUN ansible-playbook -vvv -i 'localhost,' -c local /opt/ansible/pmm2-docker/main.yml \ - && ansible-playbook -vvv -i 'localhost,' -c local /usr/share/pmm-update/ansible/playbook/tasks/update.yml \ - && ansible-playbook -vvv -i 'localhost,' -c local /opt/ansible/pmm2/post-build-actions.yml + && ansible-playbook -vvv -i 'localhost,' -c local /usr/share/pmm-update/ansible/playbook/tasks/update.yml \ + && ansible-playbook -vvv -i 'localhost,' -c local /opt/ansible/pmm2/post-build-actions.yml COPY entrypoint.sh /opt/entrypoint.sh HEALTHCHECK --interval=3s --timeout=2s --start-period=10s --retries=3 CMD curl -f http://127.0.0.1/v1/readyz || exit 1 diff --git a/managed/cmd/pmm-managed/main.go b/managed/cmd/pmm-managed/main.go index 962cd55166..2eac6ed7cf 100644 --- a/managed/cmd/pmm-managed/main.go +++ b/managed/cmd/pmm-managed/main.go @@ -49,6 +49,7 @@ import ( "golang.org/x/sync/semaphore" "golang.org/x/sys/unix" "google.golang.org/grpc" + "google.golang.org/grpc/backoff" channelz "google.golang.org/grpc/channelz/service" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/grpclog" @@ -558,15 +559,15 @@ func setup(ctx context.Context, deps *setupDeps) bool { deps.l.Infof("Updating supervisord configuration...") settings, err := models.GetSettings(db.Querier) if err != nil { - deps.l.Warnf("Failed to get settings: %+v.", err) + deps.l.Warnf("Failed to get settings: %s.", err) return false } ssoDetails, err := models.GetPerconaSSODetails(ctx, db.Querier) - if err != nil { - deps.l.Warnf("Failed to get Percona SSO Details: %+v.", err) + if err != nil && !errors.Is(err, models.ErrNotConnectedToPortal) { + deps.l.Warnf("Failed to get Percona SSO Details: %s.", err) } if err = deps.supervisord.UpdateConfiguration(settings, ssoDetails); err != nil { - deps.l.Warnf("Failed to update supervisord configuration: %+v.", err) + deps.l.Warnf("Failed to update supervisord configuration: %s.", err) return false } @@ -596,9 +597,14 @@ func setup(ctx context.Context, deps *setupDeps) bool { } func getQANClient(ctx context.Context, sqlDB *sql.DB, dbName, qanAPIAddr string) *qan.Client { + bc := backoff.DefaultConfig + bc.MaxDelay = time.Second + opts := []grpc.DialOption{ grpc.WithTransportCredentials(insecure.NewCredentials()), - grpc.WithBackoffMaxDelay(time.Second), //nolint:staticcheck + grpc.WithConnectParams(grpc.ConnectParams{ + Backoff: bc, + }), grpc.WithUserAgent("pmm-managed/" + version.Version), grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(gRPCMessageMaxSize)), } From a6682083ce53d8ce1e03e0d5a874aaee2acd523d Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Thu, 27 Jul 2023 12:37:30 +0300 Subject: [PATCH 06/27] PMM-12045 transition to unified grafana binary (#2368) * PMM-12045 transition to unified grafana binary * PMM-12045 make log.format explicit vs implicit * PMM-12045 use the FB image to test pmm-managed * PMM-12045 change `root_url` back to the default value * PMM-12045 revert root_url override * PMM-12045 use dev-latest for tests * PMM-12045 revert all configs * PMM-12045 test grafana server * PMM-12045 remove the log overrides * PMM-12045 remove the paths overrides * PMM-12045 fix grafana-cli * PMM-12045 add root_url to grafana.ini * PMM-12045 remove the root_url override * PMM-12045 set the domain in grafana.ini * PMM-12045 trigger the build --- .../roles/pmm2-images/files/grafana.ini | 9 +-------- build/packages/deb/postinst | 2 +- build/scripts/build-server-rpm | 2 +- managed/services/supervisord/supervisord.go | 8 +------- managed/testdata/supervisord.d/grafana.ini | 8 +------- .../playbook/tasks/files/change-admin-password | 2 +- .../tasks/roles/grafana/files/grafana.ini | 18 ++++++++++++++++++ .../tasks/roles/grafana/tasks/main.yml | 8 ++++---- 8 files changed, 28 insertions(+), 29 deletions(-) diff --git a/build/ansible/roles/pmm2-images/files/grafana.ini b/build/ansible/roles/pmm2-images/files/grafana.ini index c8ebe91b4b..0e8b05106c 100644 --- a/build/ansible/roles/pmm2-images/files/grafana.ini +++ b/build/ansible/roles/pmm2-images/files/grafana.ini @@ -4,16 +4,9 @@ [program:grafana] priority = 3 command = - /usr/sbin/grafana-server + /usr/sbin/grafana server --homepath=/usr/share/grafana --config=/etc/grafana/grafana.ini - cfg:default.paths.data=/srv/grafana - cfg:default.paths.plugins=/srv/grafana/plugins - cfg:default.paths.logs=/srv/logs - cfg:default.log.mode=console - cfg:default.log.console.format=console - cfg:default.server.root_url="https://%%(domain)s/graph" - user = grafana directory = /usr/share/grafana autorestart = true diff --git a/build/packages/deb/postinst b/build/packages/deb/postinst index 7db574a2bd..7e32b4bf93 100644 --- a/build/packages/deb/postinst +++ b/build/packages/deb/postinst @@ -25,7 +25,7 @@ case "$1" in ;; *) - echo "postinst called with unknown argument \`$1'" >&2 + echo "postinst called with unknown argument '$1'" >&2 exit 1 ;; esac diff --git a/build/scripts/build-server-rpm b/build/scripts/build-server-rpm index 09ddbb83c1..0ceccebb23 100755 --- a/build/scripts/build-server-rpm +++ b/build/scripts/build-server-rpm @@ -126,7 +126,7 @@ build() { sleep 1 done - sudo yum-builddep --randomwait=5 -y SOURCES/${spec_name}.spec + sudo yum-builddep --randomwait=1 -y SOURCES/${spec_name}.spec spectool -C SOURCES -g SOURCES/${spec_name}.spec rpmbuild --define '_rpmdir %{_topdir}/RPMS/${spec_name}-${rpm_version}' --define 'dist .${rpmbuild_dist}' -ba SOURCES/${spec_name}.spec diff --git a/managed/services/supervisord/supervisord.go b/managed/services/supervisord/supervisord.go index 0efd48d76e..64401b5192 100644 --- a/managed/services/supervisord/supervisord.go +++ b/managed/services/supervisord/supervisord.go @@ -779,15 +779,9 @@ redirect_stderr = true [program:grafana] priority = 3 command = - /usr/sbin/grafana-server + /usr/sbin/grafana server --homepath=/usr/share/grafana --config=/etc/grafana/grafana.ini - cfg:default.paths.data=/srv/grafana - cfg:default.paths.plugins=/srv/grafana/plugins - cfg:default.paths.logs=/srv/logs - cfg:default.log.mode=console - cfg:default.log.console.format=console - cfg:default.server.root_url="https://%%(domain)s/graph" {{- if .PerconaSSODetails}} cfg:default.server.domain="{{ .PMMServerAddress }}" cfg:default.auth.generic_oauth.enabled=true diff --git a/managed/testdata/supervisord.d/grafana.ini b/managed/testdata/supervisord.d/grafana.ini index b3e4213506..c6a0788699 100644 --- a/managed/testdata/supervisord.d/grafana.ini +++ b/managed/testdata/supervisord.d/grafana.ini @@ -3,15 +3,9 @@ [program:grafana] priority = 3 command = - /usr/sbin/grafana-server + /usr/sbin/grafana server --homepath=/usr/share/grafana --config=/etc/grafana/grafana.ini - cfg:default.paths.data=/srv/grafana - cfg:default.paths.plugins=/srv/grafana/plugins - cfg:default.paths.logs=/srv/logs - cfg:default.log.mode=console - cfg:default.log.console.format=console - cfg:default.server.root_url="https://%%(domain)s/graph" environment = PERCONA_TEST_POSTGRES_ADDR="", PERCONA_TEST_POSTGRES_DBNAME="", diff --git a/update/ansible/playbook/tasks/files/change-admin-password b/update/ansible/playbook/tasks/files/change-admin-password index 60f2484470..1a8b9f8819 100644 --- a/update/ansible/playbook/tasks/files/change-admin-password +++ b/update/ansible/playbook/tasks/files/change-admin-password @@ -2,4 +2,4 @@ # # Change password for default admin user in PMM -grafana-cli --config=/etc/grafana/grafana.ini --homepath /usr/share/grafana --configOverrides cfg:default.paths.data=/srv/grafana admin reset-admin-password $1 +grafana cli --config=/etc/grafana/grafana.ini --homepath /usr/share/grafana admin reset-admin-password $1 diff --git a/update/ansible/playbook/tasks/roles/grafana/files/grafana.ini b/update/ansible/playbook/tasks/roles/grafana/files/grafana.ini index 73a6ed90e7..801ff835a9 100644 --- a/update/ansible/playbook/tasks/roles/grafana/files/grafana.ini +++ b/update/ansible/playbook/tasks/roles/grafana/files/grafana.ini @@ -4,11 +4,29 @@ [paths] # Directory where grafana will automatically scan and look for plugins plugins = /srv/grafana/plugins +# Directory where grafana can store logs +logs = /srv/logs +# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used) +data = /srv/grafana + +#################################### Logging ########################## +[log] +# Either "console", "file", "syslog". Default is console and file +mode = console + +# For "console" mode only +[log.console] +# log line format, valid options are text, console and json +format = console #################################### Server #################################### [server] # enable gzip enable_gzip = true +# The public facing domain name used to access grafana from a browser +domain = 127.0.0.1 +# The full public facing url +root_url = https://%(domain)s/graph #################################### Snapshots ########################### [snapshots] diff --git a/update/ansible/playbook/tasks/roles/grafana/tasks/main.yml b/update/ansible/playbook/tasks/roles/grafana/tasks/main.yml index cce395aa28..405ed30a00 100644 --- a/update/ansible/playbook/tasks/roles/grafana/tasks/main.yml +++ b/update/ansible/playbook/tasks/roles/grafana/tasks/main.yml @@ -5,7 +5,7 @@ state: directory owner: grafana group: grafana - mode: '0775' + mode: "0775" loop: - /srv/grafana - /srv/grafana/plugins @@ -13,7 +13,7 @@ - name: Set Grafana folder for plugins on /srv partition for all users lineinfile: path: /etc/bashrc - line: 'export GF_PLUGIN_DIR=/srv/grafana/plugins' + line: "export GF_PLUGIN_DIR=/srv/grafana/plugins" - name: Copy new version of grafana.ini copy: @@ -21,7 +21,7 @@ dest: /etc/grafana/grafana.ini owner: grafana group: grafana - mode: '0444' + mode: "0444" - name: Create provisioning directory file: @@ -46,5 +46,5 @@ - dashboards - name: Upgrade grafana database (Get the latest schema) - command: grafana-cli --homepath=/usr/share/grafana admin data-migration encrypt-datasource-passwords + command: grafana cli --homepath=/usr/share/grafana admin data-migration encrypt-datasource-passwords changed_when: True From bc60ecbd2ae8d809f97893327dc57848f81aaf8e Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Thu, 27 Jul 2023 13:15:12 +0300 Subject: [PATCH 07/27] PMM-7 fix too long a delay for building specs (#2383) I'm not sure why this was needed at all and why this delay is that long, but the build script does really get paused before building most of the specs. This contributes significantly to the overall build time, since PMM Server has quite a few specs. From c913845c0ec4ff47f265293258741876a41512df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Jul 2023 11:23:42 +0000 Subject: [PATCH 08/27] Bump github.com/ClickHouse/clickhouse-go/v2 from 2.10.0 to 2.11.0 (#2379) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [github.com/ClickHouse/clickhouse-go/v2](https://github.com/ClickHouse/clickhouse-go) from 2.10.0 to 2.11.0. - [Release notes](https://github.com/ClickHouse/clickhouse-go/releases) - [Changelog](https://github.com/ClickHouse/clickhouse-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/ClickHouse/clickhouse-go/compare/v2.10.0...v2.11.0) --- updated-dependencies: - dependency-name: github.com/ClickHouse/clickhouse-go/v2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jiří Čtvrtka <62988319+JiriCtvrtka@users.noreply.github.com> --- go.mod | 9 +++++---- go.sum | 18 ++++++++++-------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index b72f50d70e..2d5552cf91 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ replace github.com/ClickHouse/clickhouse-go/151 => github.com/ClickHouse/clickho require ( github.com/AlekSi/pointer v1.2.0 github.com/ClickHouse/clickhouse-go/151 v0.0.0-00010101000000-000000000000 - github.com/ClickHouse/clickhouse-go/v2 v2.10.0 + github.com/ClickHouse/clickhouse-go/v2 v2.11.0 github.com/DATA-DOG/go-sqlmock v1.5.0 github.com/alecthomas/kong v0.8.0 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 @@ -108,7 +108,7 @@ require ( github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/go-errors/errors v1.4.2 // indirect github.com/go-ini/ini v1.67.0 // indirect - github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/gnostic v0.6.9 // indirect @@ -132,6 +132,7 @@ require ( github.com/sergi/go-diff v1.2.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/xlab/treeprint v1.1.0 // indirect + go.opentelemetry.io/otel/metric v1.16.0 // indirect go.uber.org/atomic v1.10.0 // indirect golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect golang.org/x/time v0.3.0 // indirect @@ -249,8 +250,8 @@ require ( github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect - go.opentelemetry.io/otel v1.14.0 // indirect - go.opentelemetry.io/otel/trace v1.14.0 // indirect + go.opentelemetry.io/otel v1.16.0 // indirect + go.opentelemetry.io/otel/trace v1.16.0 // indirect golang.org/x/mod v0.12.0 // indirect golang.org/x/net v0.12.0 // indirect golang.org/x/oauth2 v0.8.0 // indirect diff --git a/go.sum b/go.sum index 26ee0f7b04..5411c5ed90 100644 --- a/go.sum +++ b/go.sum @@ -72,8 +72,8 @@ github.com/ClickHouse/clickhouse-go v1.5.1 h1:I8zVFZTz80crCs0FFEBJooIxsPcV0xfthz github.com/ClickHouse/clickhouse-go v1.5.1/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= github.com/ClickHouse/clickhouse-go v1.5.4 h1:cKjXeYLNWVJIx2J1K6H2CqyRmfwVJVY1OV1coaaFcI0= github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= -github.com/ClickHouse/clickhouse-go/v2 v2.10.0 h1:0w/A50D5MfsRUYBaV6rLKwZ4LXWKLZKJ1u31QXjTIO4= -github.com/ClickHouse/clickhouse-go/v2 v2.10.0/go.mod h1:teXfZNM90iQ99Jnuht+dxQXCuhDZ8nvvMoTJOFrcmcg= +github.com/ClickHouse/clickhouse-go/v2 v2.11.0 h1:X3VIkldXb7zzBgqiha5JKsDNFkkGcdhjuoZSRIyR/2o= +github.com/ClickHouse/clickhouse-go/v2 v2.11.0/go.mod h1:W/UQ/GchOF+Q0k5iv6ZanLKQNukA4Oiyt4sMFDsv8QY= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -249,8 +249,8 @@ github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNV github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= @@ -820,11 +820,13 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM= -go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU= +go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= +go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= +go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY= -go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M= -go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= +go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= +go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20230717150657-8a3343210976 h1:7ljYNcZU84T2N0tZdDgvL7U3M4iFmglAUUU1gRFE/2Q= go.starlark.net v0.0.0-20230717150657-8a3343210976/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= From 5a88533e3090094b32afe621fdf31c4eed3cecea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Jul 2023 14:47:43 +0300 Subject: [PATCH 09/27] Bump github.com/ClickHouse/clickhouse-go/v2 from 2.11.0 to 2.12.0 (#2384) Bumps [github.com/ClickHouse/clickhouse-go/v2](https://github.com/ClickHouse/clickhouse-go) from 2.11.0 to 2.12.0. - [Release notes](https://github.com/ClickHouse/clickhouse-go/releases) - [Changelog](https://github.com/ClickHouse/clickhouse-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/ClickHouse/clickhouse-go/compare/v2.11.0...v2.12.0) --- updated-dependencies: - dependency-name: github.com/ClickHouse/clickhouse-go/v2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2d5552cf91..0f74f774f7 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ replace github.com/ClickHouse/clickhouse-go/151 => github.com/ClickHouse/clickho require ( github.com/AlekSi/pointer v1.2.0 github.com/ClickHouse/clickhouse-go/151 v0.0.0-00010101000000-000000000000 - github.com/ClickHouse/clickhouse-go/v2 v2.11.0 + github.com/ClickHouse/clickhouse-go/v2 v2.12.0 github.com/DATA-DOG/go-sqlmock v1.5.0 github.com/alecthomas/kong v0.8.0 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 diff --git a/go.sum b/go.sum index 5411c5ed90..ee78e3c92f 100644 --- a/go.sum +++ b/go.sum @@ -72,8 +72,8 @@ github.com/ClickHouse/clickhouse-go v1.5.1 h1:I8zVFZTz80crCs0FFEBJooIxsPcV0xfthz github.com/ClickHouse/clickhouse-go v1.5.1/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= github.com/ClickHouse/clickhouse-go v1.5.4 h1:cKjXeYLNWVJIx2J1K6H2CqyRmfwVJVY1OV1coaaFcI0= github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= -github.com/ClickHouse/clickhouse-go/v2 v2.11.0 h1:X3VIkldXb7zzBgqiha5JKsDNFkkGcdhjuoZSRIyR/2o= -github.com/ClickHouse/clickhouse-go/v2 v2.11.0/go.mod h1:W/UQ/GchOF+Q0k5iv6ZanLKQNukA4Oiyt4sMFDsv8QY= +github.com/ClickHouse/clickhouse-go/v2 v2.12.0 h1:k0Q0qiuwGeGZC7/6Ff9J3C9Od+rzy9FXgGOcAfIxrF0= +github.com/ClickHouse/clickhouse-go/v2 v2.12.0/go.mod h1:W/UQ/GchOF+Q0k5iv6ZanLKQNukA4Oiyt4sMFDsv8QY= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= From 146167a0fa9892ee6dc8c96aa8c57caeac3c69ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Fri, 28 Jul 2023 10:35:42 +0200 Subject: [PATCH 10/27] PMM-12151-12273 Explain, table improvements. (#2349) * PMM-12151-12273 Explain. * PMM-12151-12273 Fix. * PMM12151-12273 Helpers. * PMM-12151-12273 Fix comments. * PMM-12151-12273 Remove semicolons. * Update api/qanpb/object_details.proto Co-authored-by: Alex Tymchuk * Update api/qanpb/object_details.proto Co-authored-by: Alex Tymchuk * PMM-12151-12273 Regen. * Update qan-api2/models/metrics.go Co-authored-by: Artem Gavrilov * Update qan-api2/models/metrics.go Co-authored-by: Artem Gavrilov * Update agent/runner/actions/query_transform_test.go Co-authored-by: Artem Gavrilov * Update agent/runner/actions/query_transform_test.go Co-authored-by: Artem Gavrilov * PMM-12151-12273 Required changes. * PMM-23252-12273 Parallel. * PMM-12151-12273 Typo. * PMM-12151-12273 Gen. * PMM-12151-12273 Regen with newer mockery. * PMM-12151-12273 Add warning for trimmed queries. * PMM-12151-12273 Add test for trimmed queries. * PMM-12151-12273 Use example for explain in case of enabled examples. * PMM-12151-12273 Use same query source table even for Oracle MySQL >=8 --------- Co-authored-by: Alex Tymchuk Co-authored-by: Nurlan Moldomurov Co-authored-by: Artem Gavrilov --- agent/agents/mysql/perfschema/history.go | 10 - agent/agents/mysql/perfschema/perfschema.go | 11 +- agent/runner/actions/mysql_explain_action.go | 12 + .../actions/mysql_explain_action_test.go | 16 + agent/runner/actions/query_transform.go | 13 +- agent/runner/actions/query_transform_test.go | 222 ++- api/agentpb/agent.pb.go | 1283 +++++++++-------- api/agentpb/agent.pb.validate.go | 2 + api/agentpb/agent.proto | 1 + .../object_details/object_details_client.go | 39 + .../schema_by_query_id_parameters.go | 147 ++ .../schema_by_query_id_responses.go | 337 +++++ api/qanpb/json/qanpb.json | 77 + api/qanpb/object_details.pb.go | 479 +++--- api/qanpb/object_details.pb.gw.go | 81 ++ api/qanpb/object_details.pb.validate.go | 210 +++ api/qanpb/object_details.proto | 18 + api/qanpb/object_details_grpc.pb.go | 40 + api/swagger/swagger-dev.json | 77 + managed/services/agents/actions.go | 10 +- managed/services/agents/deps.go | 1 + managed/services/qan/client.go | 15 + qan-api2/models/metrics.go | 58 +- qan-api2/services/analytics/object_details.go | 13 + 24 files changed, 2275 insertions(+), 897 deletions(-) create mode 100644 api/qanpb/json/client/object_details/schema_by_query_id_parameters.go create mode 100644 api/qanpb/json/client/object_details/schema_by_query_id_responses.go diff --git a/agent/agents/mysql/perfschema/history.go b/agent/agents/mysql/perfschema/history.go index 3581726fbc..7fc3c30a20 100644 --- a/agent/agents/mysql/perfschema/history.go +++ b/agent/agents/mysql/perfschema/history.go @@ -53,16 +53,6 @@ func getHistory(q *reform.Querier) (historyMap, error) { return getHistoryRows(rows, q) } -func getHistory80(q *reform.Querier) (historyMap, error) { - rows, err := q.SelectRows(eventsStatementsSummaryByDigestExamplesView, "WHERE DIGEST IS NOT NULL AND QUERY_SAMPLE_TEXT IS NOT NULL") - if err != nil { - return nil, errors.Wrap(err, "failed to query events_statements_summary_by_digest") - } - defer rows.Close() //nolint:errcheck - - return getHistoryRows(rows, q) -} - func getHistoryRows(rows *sql.Rows, q *reform.Querier) (historyMap, error) { var err error res := make(historyMap) diff --git a/agent/agents/mysql/perfschema/perfschema.go b/agent/agents/mysql/perfschema/perfschema.go index 648a2cb3a5..949d277e08 100644 --- a/agent/agents/mysql/perfschema/perfschema.go +++ b/agent/agents/mysql/perfschema/perfschema.go @@ -313,16 +313,7 @@ func (m *PerfSchema) runHistoryCacheRefresher(ctx context.Context) { } func (m *PerfSchema) refreshHistoryCache() error { - mysqlVer := m.mySQLVersion() - - var err error - var current historyMap - switch { - case mysqlVer.version >= 8 && mysqlVer.vendor == "oracle": - current, err = getHistory80(m.q) - default: - current, err = getHistory(m.q) - } + current, err := getHistory(m.q) if err != nil { return err } diff --git a/agent/runner/actions/mysql_explain_action.go b/agent/runner/actions/mysql_explain_action.go index ffbafcdf89..78e8dd3f7d 100644 --- a/agent/runner/actions/mysql_explain_action.go +++ b/agent/runner/actions/mysql_explain_action.go @@ -83,6 +83,11 @@ func (a *mysqlExplainAction) Run(ctx context.Context) ([]byte, error) { return nil, errors.New("Query to EXPLAIN is empty") } + // You cant run Explain on trimmed queries. + if strings.HasSuffix(a.params.Query, "...") { + return nil, errors.New("EXPLAIN failed because the query was too long and trimmed. Set max-query-length to a larger value.") + } + // Explain is supported only for DML queries. // https://dev.mysql.com/doc/refman/8.0/en/using-explain.html if !isDMLQuery(a.params.Query) { @@ -114,6 +119,13 @@ func (a *mysqlExplainAction) Run(ctx context.Context) ([]byte, error) { IsDMLQuery: changedToSelect, } + if a.params.Schema != "" { + _, err = tx.ExecContext(ctx, fmt.Sprintf("USE %#q", a.params.Schema)) + if err != nil { + return nil, err + } + } + switch a.params.OutputFormat { case agentpb.MysqlExplainOutputFormat_MYSQL_EXPLAIN_OUTPUT_FORMAT_DEFAULT: response.ExplainResult, err = a.explainDefault(ctx, tx) diff --git a/agent/runner/actions/mysql_explain_action_test.go b/agent/runner/actions/mysql_explain_action_test.go index 5ee6843eb2..140fb8eb43 100644 --- a/agent/runner/actions/mysql_explain_action_test.go +++ b/agent/runner/actions/mysql_explain_action_test.go @@ -197,6 +197,22 @@ func TestMySQLExplain(t *testing.T) { assert.Equal(t, er.Query, `SELECT * FROM city WHERE Name='Rosario'`) }) + t.Run("Query longer than max-query-length", func(t *testing.T) { + t.Parallel() + + params := &agentpb.StartActionRequest_MySQLExplainParams{ + Dsn: dsn, + Query: `INSERT INTO city (Name)...`, + OutputFormat: agentpb.MysqlExplainOutputFormat_MYSQL_EXPLAIN_OUTPUT_FORMAT_DEFAULT, + } + a := NewMySQLExplainAction("", time.Second, params) + ctx, cancel := context.WithTimeout(context.Background(), a.Timeout()) + defer cancel() + + _, err := a.Run(ctx) + require.Error(t, err, "EXPLAIN failed because the query was too long and trimmed. Set max-query-length to a larger value.") + }) + t.Run("LittleBobbyTables", func(t *testing.T) { t.Parallel() diff --git a/agent/runner/actions/query_transform.go b/agent/runner/actions/query_transform.go index 574f9e604f..64f00a6d26 100644 --- a/agent/runner/actions/query_transform.go +++ b/agent/runner/actions/query_transform.go @@ -23,6 +23,7 @@ import ( //nolint:lll var ( dmlVerbs = []string{"select", "insert", "update", "delete", "replace"} + commentsRe = regexp.MustCompile(`(?s)\/\*(.*?)\*\/`) selectRe = regexp.MustCompile(`(?i)^select\s+(.*?)\bfrom\s+(.*?)$`) updateRe = regexp.MustCompile(`(?i)^update\s+(?:low_priority|ignore)?\s*(.*?)\s+set\s+(.*?)(?:\s+where\s+(.*?))?(?:\s+limit\s*[0-9]+(?:\s*,\s*[0-9]+)?)?$`) deleteRe = regexp.MustCompile(`(?i)^delete\s+(.*?)\bfrom\s+(.*?)$`) @@ -31,8 +32,16 @@ var ( insertSetRe = regexp.MustCompile(`(?i)(?:insert(?:\s+ignore)?|replace)\s+(?:.*?\binto)\s+(.*?)\s*set\s+(.*?)\s*(?:\blimit\b|on\s+duplicate\s+key.*)?\s*$`) ) +func prepareQuery(query string) string { + query = commentsRe.ReplaceAllString(query, "") + query = strings.ReplaceAll(query, "\t", " ") + query = strings.ReplaceAll(query, "\n", " ") + query = strings.TrimRight(query, ";") + return strings.TrimLeft(query, " ") +} + func isDMLQuery(query string) bool { - query = strings.ToLower(strings.TrimSpace(query)) + query = strings.ToLower(prepareQuery(query)) for _, verb := range dmlVerbs { if strings.HasPrefix(query, verb) { return true @@ -51,7 +60,7 @@ it able to explain DML queries on older MySQL versions and for unprivileged user // dmlToSelect returns query converted to select and boolean, if conversion were needed. func dmlToSelect(query string) (string, bool) { - query = strings.ReplaceAll(query, "\n", " ") + query = prepareQuery(query) m := selectRe.FindStringSubmatch(query) if len(m) > 1 { diff --git a/agent/runner/actions/query_transform_test.go b/agent/runner/actions/query_transform_test.go index 84831d04d1..4520dbaeb3 100644 --- a/agent/runner/actions/query_transform_test.go +++ b/agent/runner/actions/query_transform_test.go @@ -15,79 +15,163 @@ package actions import ( + "fmt" "testing" "github.com/stretchr/testify/assert" ) -func TestDMLToSelect(t *testing.T) { - q, c := dmlToSelect(`SELECT nombre FROM tabla WHERE id = 0`) - assert.False(t, c) - assert.Equal(t, `SELECT nombre FROM tabla WHERE id = 0`, q) - - q, c = dmlToSelect(`update ignore tabla set nombre = "carlos" where id = 0 limit 2`) - assert.True(t, c) - assert.Equal(t, `SELECT nombre = "carlos" FROM tabla WHERE id = 0`, q) - - q, c = dmlToSelect(`update ignore tabla set nombre = "carlos" where id = 0`) - assert.True(t, c) - assert.Equal(t, `SELECT nombre = "carlos" FROM tabla WHERE id = 0`, q) - - q, c = dmlToSelect(`update ignore tabla set nombre = "carlos" limit 1`) - assert.True(t, c) - assert.Equal(t, `SELECT nombre = "carlos" FROM tabla`, q) - - q, c = dmlToSelect(`update tabla set nombre = "carlos" where id = 0 limit 2`) - assert.True(t, c) - assert.Equal(t, `SELECT nombre = "carlos" FROM tabla WHERE id = 0`, q) - - q, c = dmlToSelect(`update tabla set nombre = "carlos" where id = 0`) - assert.True(t, c) - assert.Equal(t, `SELECT nombre = "carlos" FROM tabla WHERE id = 0`, q) - - q, c = dmlToSelect(`update tabla set nombre = "carlos" limit 1`) - assert.True(t, c) - assert.Equal(t, `SELECT nombre = "carlos" FROM tabla`, q) - - q, c = dmlToSelect(`delete from tabla`) - assert.True(t, c) - assert.Equal(t, `SELECT * FROM tabla`, q) - - q, c = dmlToSelect(`delete from tabla join tabla2 on tabla.id = tabla2.tabla2_id`) - assert.True(t, c) - assert.Equal(t, `SELECT 1 FROM tabla join tabla2 on tabla.id = tabla2.tabla2_id`, q) - - q, c = dmlToSelect(`insert into tabla (f1, f2, f3) values (1,2,3)`) - assert.True(t, c) - assert.Equal(t, `SELECT * FROM tabla WHERE f1=1 and f2=2 and f3=3`, q) - - q, c = dmlToSelect(`insert into tabla (f1, f2, f3) values (1,2)`) - assert.True(t, c) - assert.Equal(t, `SELECT * FROM tabla LIMIT 1`, q) - - q, c = dmlToSelect(`insert into tabla set f1="A1", f2="A2"`) - assert.True(t, c) - assert.Equal(t, `SELECT * FROM tabla WHERE f1="A1" AND f2="A2"`, q) - - q, c = dmlToSelect(`replace into tabla set f1="A1", f2="A2"`) - assert.True(t, c) - assert.Equal(t, `SELECT * FROM tabla WHERE f1="A1" AND f2="A2"`, q) - - q, c = dmlToSelect("insert into `tabla-1` values(12)") - assert.True(t, c) - assert.Equal(t, "SELECT * FROM `tabla-1` LIMIT 1", q) - - q, c = dmlToSelect(`UPDATE - employees2 -SET - first_name = 'Joe', - emp_no = 10 -WHERE - emp_no = 3`) - assert.True(t, c) - assert.Equal(t, "SELECT first_name = 'Joe', emp_no = 10 FROM employees2 WHERE emp_no = 3", q) +func Test_dmlToSelect(t *testing.T) { + t.Parallel() + + type testCase struct { + Query string + Converted bool + Expected string + } + + testCases := []testCase{ + { + Query: `SELECT nombre FROM tabla WHERE id = 0`, + Converted: false, + Expected: `SELECT nombre FROM tabla WHERE id = 0`, + }, + { + Query: `update ignore tabla set nombre = "carlos" where id = 0 limit 2`, + Converted: true, + Expected: `SELECT nombre = "carlos" FROM tabla WHERE id = 0`, + }, + { + Query: `update ignore tabla set nombre = "carlos" where id = 0`, + Converted: true, + Expected: `SELECT nombre = "carlos" FROM tabla WHERE id = 0`, + }, + { + Query: `update ignore tabla set nombre = "carlos" limit 1`, + Converted: true, + Expected: `SELECT nombre = "carlos" FROM tabla`, + }, + { + Query: `update tabla set nombre = "carlos" where id = 0 limit 2`, + Converted: true, + Expected: `SELECT nombre = "carlos" FROM tabla WHERE id = 0`, + }, + { + Query: `update tabla set nombre = "carlos" where id = 0`, + Converted: true, + Expected: `SELECT nombre = "carlos" FROM tabla WHERE id = 0`, + }, + { + Query: `update tabla set nombre = "carlos" limit 1`, + Converted: true, + Expected: `SELECT nombre = "carlos" FROM tabla`, + }, + { + Query: `delete from tabla`, + Converted: true, + Expected: `SELECT * FROM tabla`, + }, + { + Query: `delete from tabla join tabla2 on tabla.id = tabla2.tabla2_id`, + Converted: true, + Expected: `SELECT 1 FROM tabla join tabla2 on tabla.id = tabla2.tabla2_id`, + }, + { + Query: `insert into tabla (f1, f2, f3) values (1,2,3)`, + Converted: true, + Expected: `SELECT * FROM tabla WHERE f1=1 and f2=2 and f3=3`, + }, + { + Query: `insert into tabla (f1, f2, f3) values (1,2)`, + Converted: true, + Expected: `SELECT * FROM tabla LIMIT 1`, + }, + { + Query: `insert into tabla set f1="A1", f2="A2"`, + Converted: true, + Expected: `SELECT * FROM tabla WHERE f1="A1" AND f2="A2"`, + }, + { + Query: "insert into `tabla-1` values(12)", + Converted: true, + Expected: "SELECT * FROM `tabla-1` LIMIT 1", + }, + { + Query: `UPDATE + employees2 + SET + first_name = 'Joe', + emp_no = 10 + WHERE + emp_no = 3`, + Converted: true, + Expected: `SELECT first_name = 'Joe', emp_no = 10 FROM employees2 WHERE emp_no = 3`, + }, + { + Query: ` + /* File:movie.php Line:8 Func:update_info */ + SELECT + * + FROM + movie_info + WHERE + movie_id = 68357`, + Converted: false, + Expected: `SELECT * FROM movie_info WHERE movie_id = 68357`, + }, + { + Query: `SELECT /*+ NO_RANGE_OPTIMIZATION(t3 PRIMARY, f2_idx) */ f1 + FROM t3 WHERE f1 > 30 AND f1 < 33;`, + Converted: false, + Expected: `SELECT f1 FROM t3 WHERE f1 > 30 AND f1 < 33`, + }, + { + Query: `SELECT /*+ BKA(t1) NO_BKA(t2) */ * FROM t1 INNER JOIN t2 WHERE ...;`, + Converted: false, + Expected: `SELECT * FROM t1 INNER JOIN t2 WHERE ...`, + }, + { + Query: `SELECT /*+ NO_ICP(t1, t2) */ * FROM t1 INNER JOIN t2 WHERE ...;`, + Converted: false, + Expected: `SELECT * FROM t1 INNER JOIN t2 WHERE ...`, + }, + { + Query: `SELECT /*+ SEMIJOIN(FIRSTMATCH, LOOSESCAN) */ * FROM t1 ...;`, + Converted: false, + Expected: `SELECT * FROM t1 ...`, + }, + { + Query: `EXPLAIN SELECT /*+ NO_ICP(t1) */ * FROM t1 WHERE ...;`, + Converted: false, + Expected: ``, + }, + { + Query: `SELECT /*+ MERGE(dt) */ * FROM (SELECT * FROM t1) AS dt;`, + Converted: false, + Expected: `SELECT * FROM (SELECT * FROM t1) AS dt`, + }, + { + Query: `INSERT /*+ SET_VAR(foreign_key_checks=OFF) */ INTO t2 VALUES(2);`, + Converted: true, + Expected: `SELECT * FROM t2 LIMIT 1`, + }, + } + + for i, tc := range testCases { + tc := tc + t.Run(fmt.Sprintf("TestDMLToSelect %d. %s", i, tc.Query), func(t *testing.T) { + t.Parallel() + q, c := dmlToSelect(tc.Query) + assert.Equal(t, tc.Converted, c) + assert.Equal(t, tc.Expected, q) + }) + } +} - q, c = dmlToSelect(`UPDATE employees2 SET first_name = 'Joe', emp_no = 10 WHERE emp_no = 3`) - assert.True(t, c) - assert.Equal(t, "SELECT first_name = 'Joe', emp_no = 10 FROM employees2 WHERE emp_no = 3", q) +func Test_isDMLQuery(t *testing.T) { + assert.True(t, isDMLQuery("SELECT * FROM table")) + assert.True(t, isDMLQuery(`update tabla set nombre = "carlos" where id = 0`)) + assert.True(t, isDMLQuery("delete from tabla join tabla2 on tabla.id = tabla2.tabla2_id")) + assert.True(t, isDMLQuery("/*+ SET_VAR(foreign_key_checks=OFF) */ INSERT INTO t2 VALUES(2);")) + assert.False(t, isDMLQuery("EXPLAIN SELECT * FROM table")) } diff --git a/api/agentpb/agent.pb.go b/api/agentpb/agent.pb.go index f06a953aa9..81d6fde6bb 100644 --- a/api/agentpb/agent.pb.go +++ b/api/agentpb/agent.pb.go @@ -3637,6 +3637,7 @@ type StartActionRequest_MySQLExplainParams struct { Dsn string `protobuf:"bytes,1,opt,name=dsn,proto3" json:"dsn,omitempty"` Query string `protobuf:"bytes,2,opt,name=query,proto3" json:"query,omitempty"` Values []string `protobuf:"bytes,6,rep,name=values,proto3" json:"values,omitempty"` + Schema string `protobuf:"bytes,7,opt,name=schema,proto3" json:"schema,omitempty"` OutputFormat MysqlExplainOutputFormat `protobuf:"varint,3,opt,name=output_format,json=outputFormat,proto3,enum=agent.MysqlExplainOutputFormat" json:"output_format,omitempty"` // Contains files and their contents which can be used in DSN. TlsFiles *TextFiles `protobuf:"bytes,4,opt,name=tls_files,json=tlsFiles,proto3" json:"tls_files,omitempty"` @@ -3697,6 +3698,13 @@ func (x *StartActionRequest_MySQLExplainParams) GetValues() []string { return nil } +func (x *StartActionRequest_MySQLExplainParams) GetSchema() string { + if x != nil { + return x.Schema + } + return "" +} + func (x *StartActionRequest_MySQLExplainParams) GetOutputFormat() MysqlExplainOutputFormat { if x != nil { return x.OutputFormat @@ -6726,8 +6734,8 @@ var file_agentpb_agent_proto_rawDesc = []byte{ 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x12, 0x29, 0x0a, 0x04, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x52, 0x04, 0x64, 0x6f, 0x63, 0x73, 0x22, 0xe9, - 0x2a, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x52, 0x04, 0x64, 0x6f, 0x63, 0x73, 0x22, 0x81, + 0x2b, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x60, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6c, @@ -6889,63 +6897,35 @@ var file_agentpb_agent_proto_rawDesc = []byte{ 0x72, 0x61, 0x6d, 0x73, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 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, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x1a, 0xf1, 0x01, 0x0a, 0x12, 0x4d, 0x79, + 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x1a, 0x89, 0x02, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x12, 0x44, 0x0a, 0x0d, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, - 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x9b, 0x01, - 0x0a, 0x1a, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, - 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, - 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x9b, 0x01, 0x0a, 0x1a, - 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, - 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, - 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x95, 0x01, 0x0a, 0x14, 0x4d, 0x79, - 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, - 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, - 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, - 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x1a, 0xa0, 0x01, 0x0a, 0x1f, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, - 0x53, 0x68, 0x6f, 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2d, 0x0a, - 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, - 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x1a, 0x9a, 0x01, 0x0a, 0x19, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x44, 0x0a, 0x0d, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1f, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, + 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x52, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x2d, + 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x9b, 0x01, 0x0a, 0x1a, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, + 0x68, 0x6f, 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x09, + 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, + 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x1a, 0x9b, 0x01, 0x0a, 0x1a, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, + 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, @@ -6954,601 +6934,630 @@ var file_agentpb_agent_proto_rawDesc = []byte{ 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x1a, 0x6f, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6c, - 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x79, 0x1a, 0x95, 0x01, 0x0a, 0x14, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, - 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x1a, 0x11, 0x0a, 0x0f, 0x50, 0x54, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x73, 0x0a, 0x11, 0x50, 0x54, 0x50, 0x67, 0x53, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, - 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, - 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x1a, 0x78, 0x0a, 0x16, 0x50, 0x54, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x1a, 0x8e, 0x01, 0x0a, 0x14, 0x50, 0x54, 0x4d, 0x79, 0x53, 0x51, 0x4c, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x1a, 0x95, 0x01, 0x0a, 0x14, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x53, 0x68, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, - 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, - 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, - 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x97, 0x01, - 0x0a, 0x16, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, - 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x84, 0x01, 0x0a, 0x19, 0x50, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x68, 0x6f, 0x77, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, - 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, - 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, - 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x9c, - 0x01, 0x0a, 0x1b, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, - 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, - 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, - 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x63, 0x0a, - 0x1e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, - 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, - 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x1a, 0x60, 0x0a, 0x1b, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x65, 0x0a, 0x20, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x4f, 0x70, - 0x74, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, - 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x67, 0x0a, 0x22, 0x4d, - 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x53, - 0x65, 0x74, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, + 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0xa0, 0x01, 0x0a, 0x1f, 0x50, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, + 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, + 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, + 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x9a, 0x01, 0x0a, + 0x19, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, + 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, + 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x6f, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x68, 0x0a, 0x23, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, - 0x63, 0x44, 0x61, 0x74, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, - 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, - 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, + 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, + 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x11, 0x0a, 0x0f, 0x50, 0x54, + 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x73, 0x0a, + 0x11, 0x50, 0x54, 0x50, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x1a, 0x78, 0x0a, 0x16, 0x50, 0x54, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, + 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x1a, 0x8e, 0x01, 0x0a, + 0x14, 0x50, 0x54, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x1a, 0x95, 0x01, + 0x0a, 0x14, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x68, 0x6f, 0x77, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2d, + 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0xcf, - 0x01, 0x0a, 0x1a, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x69, 0x0a, - 0x0e, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x42, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x53, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0d, 0x73, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x46, 0x0a, 0x0d, 0x53, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x59, 0x53, - 0x54, 0x45, 0x4d, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x10, - 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x42, 0x4d, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x02, - 0x42, 0x08, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x30, 0x0a, 0x11, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x22, 0x14, 0x0a, 0x12, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x74, 0x0a, 0x13, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, - 0x16, 0x0a, 0x14, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x73, 0x0a, 0x14, 0x50, 0x42, 0x4d, 0x53, 0x77, - 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, - 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, - 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x2d, 0x0a, 0x15, - 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x43, 0x0a, 0x10, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x22, 0x67, 0x0a, 0x11, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x3e, 0x0a, 0x1c, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, - 0x6e, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x18, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x6f, 0x67, 0x4c, - 0x69, 0x6e, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xe4, 0x01, 0x0a, 0x16, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, - 0x73, 0x6e, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 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, 0x07, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, - 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, - 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x22, 0x95, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x12, 0x3a, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x1a, 0x28, - 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x10, 0x4a, 0x6f, 0x62, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, - 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, - 0x62, 0x49, 0x64, 0x22, 0x29, 0x0a, 0x11, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x76, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x22, 0xb2, - 0x01, 0x0a, 0x10, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1d, - 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, - 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, - 0x0a, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x0a, 0x18, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x22, 0xc3, 0x0f, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x33, - 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 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, 0x07, 0x74, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x12, 0x47, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, - 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x14, - 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x4d, 0x0a, 0x0e, 0x6d, - 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, - 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, - 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x63, 0x0a, 0x16, 0x6d, 0x6f, - 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, - 0x64, 0x62, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, - 0x93, 0x02, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, - 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, - 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, + 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x97, 0x01, 0x0a, 0x16, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, + 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, + 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, + 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, + 0x84, 0x01, 0x0a, 0x19, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x53, 0x68, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, + 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, + 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, + 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x9c, 0x01, 0x0a, 0x1b, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2d, + 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x63, 0x0a, 0x1e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, + 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, + 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x60, 0x0a, 0x1b, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, + 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x65, 0x0a, 0x20, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x43, + 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x4f, 0x70, 0x74, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, + 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, + 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x1a, 0x67, 0x0a, 0x22, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, + 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x68, 0x0a, 0x23, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x44, + 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0xcf, 0x01, 0x0a, 0x1a, 0x52, 0x65, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x69, 0x0a, 0x0e, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x42, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x0d, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x22, 0x46, 0x0a, 0x0d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x5f, 0x53, 0x45, 0x52, 0x56, + 0x49, 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x42, 0x4d, + 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x42, 0x08, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x0a, 0x11, 0x53, 0x74, 0x6f, + 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x14, 0x0a, 0x12, 0x53, + 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x74, 0x0a, 0x13, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x6f, 0x6e, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x16, 0x0a, 0x14, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x73, 0x0a, 0x14, 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, + 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, + 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x22, 0x2d, 0x0a, 0x15, 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, 0x74, 0x63, + 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x43, 0x0a, 0x10, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x67, 0x0a, 0x11, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x67, + 0x73, 0x12, 0x3e, 0x0a, 0x1c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x18, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x22, 0xe4, 0x01, 0x0a, 0x16, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 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, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, + 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, + 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x22, 0x95, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x3a, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x1a, 0x28, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, + 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x29, 0x0a, 0x10, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x29, 0x0a, 0x11, 0x4a, + 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x22, 0xb2, 0x01, 0x0a, 0x10, 0x53, 0x33, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x0a, 0x18, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0xc3, 0x0f, 0x0a, 0x0f, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 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, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x47, 0x0a, 0x0c, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, + 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x12, 0x4d, 0x0a, 0x0e, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x12, 0x63, 0x0a, 0x16, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, + 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, + 0x00, 0x52, 0x14, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x93, 0x02, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, + 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, + 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, + 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, + 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xc3, 0x01, + 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, + 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x1a, 0xf9, 0x03, 0x0a, 0x0d, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, + 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, + 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x04, 0x70, + 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x70, + 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x69, + 0x74, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x50, 0x69, 0x74, 0x72, 0x12, 0x33, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x09, + 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x0b, - 0x10, 0x0c, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xc3, 0x01, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, - 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, - 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x42, - 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xf9, 0x03, 0x0a, 0x0d, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x16, 0x0a, - 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, - 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x73, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, - 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x69, 0x74, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x69, 0x74, 0x72, 0x12, 0x33, 0x0a, 0x0a, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x14, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, - 0x6c, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, + 0x67, 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, - 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, 0x6c, - 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, - 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, - 0x72, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xa8, 0x04, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, - 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x12, 0x16, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, - 0x18, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, - 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, - 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, - 0x18, 0x01, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x41, - 0x0a, 0x0e, 0x70, 0x69, 0x74, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 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, 0x0d, 0x70, 0x69, 0x74, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, + 0x10, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, + 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, + 0xa8, 0x04, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, + 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x12, 0x1c, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, + 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, + 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x70, 0x69, 0x74, 0x72, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 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, 0x0d, 0x70, 0x69, 0x74, 0x72, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, - 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, 0x6c, - 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, - 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, - 0x72, 0x12, 0x39, 0x0a, 0x0c, 0x70, 0x62, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x62, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x0b, 0x70, 0x62, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, - 0x64, 0x73, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, - 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, - 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x42, 0x05, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x28, 0x0a, 0x10, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x22, 0x27, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, - 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0xdb, 0x05, 0x0a, 0x09, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x15, 0x0a, - 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, - 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x41, - 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x12, 0x57, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x47, 0x0a, 0x0e, 0x6d, 0x6f, - 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x16, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x72, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x6f, - 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x1a, 0x21, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x6e, 0x0a, 0x0d, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, - 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x61, - 0x72, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x53, 0x68, 0x61, 0x72, 0x64, 0x65, 0x64, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3e, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x16, 0x0a, 0x14, 0x4d, - 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa7, 0x03, - 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x15, 0x0a, + 0x10, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0c, 0x70, 0x62, 0x6d, + 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x62, 0x6d, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x70, 0x62, 0x6d, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, + 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, + 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x05, 0x0a, 0x03, 0x6a, 0x6f, + 0x62, 0x22, 0x28, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x27, 0x0a, 0x0e, 0x53, + 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, - 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x43, - 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, - 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x12, 0x59, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, - 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2d, - 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, + 0x6f, 0x62, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdb, 0x05, 0x0a, 0x09, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, + 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, + 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, + 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x57, 0x0a, 0x14, 0x6d, 0x79, 0x73, + 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, + 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x12, 0x47, 0x0a, 0x0e, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, + 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x16, 0x6d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x21, 0x0a, 0x05, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x6e, 0x0a, + 0x0d, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2c, + 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x53, 0x68, + 0x61, 0x72, 0x64, 0x65, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3e, 0x0a, + 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2f, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x0a, + 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x1a, 0x16, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x42, 0x08, 0x0a, 0x06, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa7, 0x03, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x43, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x2e, 0x4c, 0x6f, 0x67, 0x73, 0x48, 0x00, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x1a, 0x0d, 0x0a, - 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x14, 0x0a, 0x12, - 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x1a, 0x49, 0x0a, 0x04, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x6e, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x42, 0x08, 0x0a, - 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x9d, 0x04, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, - 0x0a, 0x09, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f, 0x66, - 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x09, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x73, - 0x1a, 0x08, 0x0a, 0x06, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x1a, 0x0c, 0x0a, 0x0a, 0x58, 0x74, - 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x09, 0x0a, 0x07, 0x58, 0x62, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x1a, 0x08, 0x0a, 0x06, 0x51, 0x70, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x09, 0x0a, - 0x07, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x1a, 0x05, 0x0a, 0x03, 0x50, 0x42, 0x4d, 0x1a, - 0x85, 0x03, 0x0a, 0x08, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x12, 0x3a, 0x0a, 0x06, - 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x48, 0x00, - 0x52, 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x12, 0x46, 0x0a, 0x0a, 0x78, 0x74, 0x72, 0x61, - 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x58, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x48, 0x00, 0x52, 0x0a, 0x78, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x12, 0x3d, 0x0a, 0x07, 0x78, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x58, 0x62, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x48, 0x00, 0x52, 0x07, 0x78, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, - 0x3a, 0x0a, 0x06, 0x71, 0x70, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x51, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x48, 0x00, 0x52, 0x06, 0x71, 0x70, 0x72, 0x65, 0x73, 0x73, 0x12, 0x3b, 0x0a, 0x06, 0x6d, - 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x48, 0x00, - 0x52, 0x06, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x12, 0x31, 0x0a, 0x03, 0x70, 0x62, 0x6d, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, - 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x50, 0x42, 0x4d, 0x48, 0x00, 0x52, 0x03, 0x70, 0x62, 0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x73, - 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x90, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3e, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, - 0x39, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xbb, 0x08, 0x0a, 0x0c, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, - 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x41, 0x0a, 0x0d, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, - 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3b, - 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, - 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, - 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x31, - 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x12, 0x37, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x6a, - 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x6f, - 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x36, 0x0a, - 0x09, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, - 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, - 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x74, 0x6f, - 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x39, - 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x09, - 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x67, 0x65, 0x74, - 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x67, - 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x46, 0x0a, 0x0f, 0x70, 0x62, - 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x69, 0x74, 0x72, 0x18, 0x13, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x53, - 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x62, 0x6d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x69, - 0x74, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x73, - 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x48, 0x00, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x42, 0x09, 0x0a, - 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xc9, 0x07, 0x0a, 0x0d, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, - 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, - 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3c, - 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, - 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x42, 0x0a, 0x0d, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, + 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, + 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x59, 0x0a, 0x14, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4d, 0x79, + 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2d, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x14, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4c, 0x6f, 0x67, 0x73, 0x48, 0x00, 0x52, + 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x1a, 0x0d, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x14, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x49, 0x0a, 0x04, 0x4c, 0x6f, + 0x67, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, + 0x9d, 0x04, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x09, 0x73, + 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x73, 0x1a, 0x08, 0x0a, 0x06, 0x4d, 0x79, 0x53, 0x51, + 0x4c, 0x64, 0x1a, 0x0c, 0x0a, 0x0a, 0x58, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x1a, 0x09, 0x0a, 0x07, 0x58, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x1a, 0x08, 0x0a, 0x06, 0x51, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x09, 0x0a, 0x07, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, + 0x1a, 0x05, 0x0a, 0x03, 0x50, 0x42, 0x4d, 0x1a, 0x85, 0x03, 0x0a, 0x08, 0x53, 0x6f, 0x66, 0x74, + 0x77, 0x61, 0x72, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, + 0x12, 0x46, 0x0a, 0x0a, 0x78, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x58, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0a, 0x78, 0x74, + 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x3d, 0x0a, 0x07, 0x78, 0x62, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x58, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x48, 0x00, 0x52, 0x07, + 0x78, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x71, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x51, 0x70, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x06, 0x71, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x3b, 0x0a, 0x06, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, + 0x12, 0x31, 0x0a, 0x03, 0x70, 0x62, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x48, 0x00, 0x52, 0x03, + 0x70, 0x62, 0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, + 0x90, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x39, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0xbb, 0x08, 0x0a, 0x0c, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, + 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, - 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, - 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, - 0x52, 0x08, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x0b, 0x73, 0x74, - 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x6f, - 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x48, 0x00, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6a, 0x6f, 0x62, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, - 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x74, - 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x38, - 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6a, - 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3e, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x67, 0x65, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x45, 0x0a, 0x0f, 0x70, 0x62, 0x6d, 0x5f, - 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x69, 0x74, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, - 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, - 0x52, 0x0d, 0x70, 0x62, 0x6d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x69, 0x74, 0x72, 0x12, - 0x38, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x13, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x09, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x2a, 0xc4, 0x01, 0x0a, 0x18, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, - 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, - 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, - 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, - 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, - 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, - 0x54, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, - 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, - 0x41, 0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x30, 0x0a, 0x2c, 0x4d, 0x59, 0x53, + 0x69, 0x6e, 0x67, 0x12, 0x41, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x09, + 0x6a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x37, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, + 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x6a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, + 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, + 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, + 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, + 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, + 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x10, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, + 0x62, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, + 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, + 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x39, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x46, 0x0a, 0x0f, 0x70, 0x62, 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x5f, 0x70, 0x69, 0x74, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, + 0x52, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x62, 0x6d, + 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x69, 0x74, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x22, 0xc9, 0x07, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x21, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, + 0x6e, 0x67, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, + 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x09, 0x73, + 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x4a, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, + 0x6f, 0x62, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, + 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x07, 0x73, + 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x38, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x3e, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, + 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x48, 0x00, 0x52, 0x0b, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x45, 0x0a, 0x0f, 0x70, 0x62, 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5f, 0x70, + 0x69, 0x74, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x62, 0x6d, 0x53, 0x77, 0x69, + 0x74, 0x63, 0x68, 0x50, 0x69, 0x74, 0x72, 0x12, 0x38, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, + 0x73, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2a, 0xc4, 0x01, 0x0a, + 0x18, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, - 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x54, 0x49, - 0x4f, 0x4e, 0x41, 0x4c, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x03, 0x32, 0x41, 0x0a, 0x05, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, - 0x13, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x1a, 0x14, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x6f, - 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, - 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, - 0x41, 0x58, 0x58, 0xaa, 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x05, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x11, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, + 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, + 0x54, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x4d, + 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, + 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, + 0x02, 0x12, 0x30, 0x0a, 0x2c, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, + 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, + 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x5f, 0x4a, 0x53, 0x4f, + 0x4e, 0x10, 0x03, 0x32, 0x41, 0x0a, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x13, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x14, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x6f, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, + 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x05, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0xca, 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x11, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/agentpb/agent.pb.validate.go b/api/agentpb/agent.pb.validate.go index a3bf0afae2..75971959e9 100644 --- a/api/agentpb/agent.pb.validate.go +++ b/api/agentpb/agent.pb.validate.go @@ -8041,6 +8041,8 @@ func (m *StartActionRequest_MySQLExplainParams) validate(all bool) error { // no validation rules for Query + // no validation rules for Schema + // no validation rules for OutputFormat if all { diff --git a/api/agentpb/agent.proto b/api/agentpb/agent.proto index 6aafb4a4ed..737640c198 100644 --- a/api/agentpb/agent.proto +++ b/api/agentpb/agent.proto @@ -157,6 +157,7 @@ message StartActionRequest { string dsn = 1; string query = 2; repeated string values = 6; + string schema = 7; MysqlExplainOutputFormat output_format = 3; // Contains files and their contents which can be used in DSN. TextFiles tls_files = 4; diff --git a/api/qanpb/json/client/object_details/object_details_client.go b/api/qanpb/json/client/object_details/object_details_client.go index c882f603b4..97e83c5de8 100644 --- a/api/qanpb/json/client/object_details/object_details_client.go +++ b/api/qanpb/json/client/object_details/object_details_client.go @@ -42,6 +42,8 @@ type ClientService interface { QueryExists(params *QueryExistsParams, opts ...ClientOption) (*QueryExistsOK, error) + SchemaByQueryID(params *SchemaByQueryIDParams, opts ...ClientOption) (*SchemaByQueryIDOK, error) + SetTransport(transport runtime.ClientTransport) } @@ -304,6 +306,43 @@ func (a *Client) QueryExists(params *QueryExistsParams, opts ...ClientOption) (* return nil, runtime.NewAPIError("unexpected success response: content available as default response in error", unexpectedSuccess, unexpectedSuccess.Code()) } +/* +SchemaByQueryID schemas by query ID returns schema for given query ID and service ID +*/ +func (a *Client) SchemaByQueryID(params *SchemaByQueryIDParams, opts ...ClientOption) (*SchemaByQueryIDOK, error) { + // TODO: Validate the params before sending + if params == nil { + params = NewSchemaByQueryIDParams() + } + op := &runtime.ClientOperation{ + ID: "SchemaByQueryID", + Method: "POST", + PathPattern: "/v0/qan/ObjectDetails/SchemaByQueryID", + ProducesMediaTypes: []string{"application/json"}, + ConsumesMediaTypes: []string{"application/json"}, + Schemes: []string{"http", "https"}, + Params: params, + Reader: &SchemaByQueryIDReader{formats: a.formats}, + Context: params.Context, + Client: params.HTTPClient, + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) + if err != nil { + return nil, err + } + success, ok := result.(*SchemaByQueryIDOK) + if ok { + return success, nil + } + // unexpected success response + unexpectedSuccess := result.(*SchemaByQueryIDDefault) + return nil, runtime.NewAPIError("unexpected success response: content available as default response in error", unexpectedSuccess, unexpectedSuccess.Code()) +} + // SetTransport changes the transport on the client func (a *Client) SetTransport(transport runtime.ClientTransport) { a.transport = transport diff --git a/api/qanpb/json/client/object_details/schema_by_query_id_parameters.go b/api/qanpb/json/client/object_details/schema_by_query_id_parameters.go new file mode 100644 index 0000000000..71b0ad19b2 --- /dev/null +++ b/api/qanpb/json/client/object_details/schema_by_query_id_parameters.go @@ -0,0 +1,147 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package object_details + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + "time" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + cr "github.com/go-openapi/runtime/client" + "github.com/go-openapi/strfmt" +) + +// NewSchemaByQueryIDParams creates a new SchemaByQueryIDParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. +func NewSchemaByQueryIDParams() *SchemaByQueryIDParams { + return &SchemaByQueryIDParams{ + timeout: cr.DefaultTimeout, + } +} + +// NewSchemaByQueryIDParamsWithTimeout creates a new SchemaByQueryIDParams object +// with the ability to set a timeout on a request. +func NewSchemaByQueryIDParamsWithTimeout(timeout time.Duration) *SchemaByQueryIDParams { + return &SchemaByQueryIDParams{ + timeout: timeout, + } +} + +// NewSchemaByQueryIDParamsWithContext creates a new SchemaByQueryIDParams object +// with the ability to set a context for a request. +func NewSchemaByQueryIDParamsWithContext(ctx context.Context) *SchemaByQueryIDParams { + return &SchemaByQueryIDParams{ + Context: ctx, + } +} + +// NewSchemaByQueryIDParamsWithHTTPClient creates a new SchemaByQueryIDParams object +// with the ability to set a custom HTTPClient for a request. +func NewSchemaByQueryIDParamsWithHTTPClient(client *http.Client) *SchemaByQueryIDParams { + return &SchemaByQueryIDParams{ + HTTPClient: client, + } +} + +/* +SchemaByQueryIDParams contains all the parameters to send to the API endpoint + + for the schema by query ID operation. + + Typically these are written to a http.Request. +*/ +type SchemaByQueryIDParams struct { + /* Body. + + SchemaByQueryIDRequest returns schema for given query ID and service ID. + */ + Body SchemaByQueryIDBody + + timeout time.Duration + Context context.Context + HTTPClient *http.Client +} + +// WithDefaults hydrates default values in the schema by query ID params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *SchemaByQueryIDParams) WithDefaults() *SchemaByQueryIDParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the schema by query ID params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *SchemaByQueryIDParams) SetDefaults() { + // no default values defined for this parameter +} + +// WithTimeout adds the timeout to the schema by query ID params +func (o *SchemaByQueryIDParams) WithTimeout(timeout time.Duration) *SchemaByQueryIDParams { + o.SetTimeout(timeout) + return o +} + +// SetTimeout adds the timeout to the schema by query ID params +func (o *SchemaByQueryIDParams) SetTimeout(timeout time.Duration) { + o.timeout = timeout +} + +// WithContext adds the context to the schema by query ID params +func (o *SchemaByQueryIDParams) WithContext(ctx context.Context) *SchemaByQueryIDParams { + o.SetContext(ctx) + return o +} + +// SetContext adds the context to the schema by query ID params +func (o *SchemaByQueryIDParams) SetContext(ctx context.Context) { + o.Context = ctx +} + +// WithHTTPClient adds the HTTPClient to the schema by query ID params +func (o *SchemaByQueryIDParams) WithHTTPClient(client *http.Client) *SchemaByQueryIDParams { + o.SetHTTPClient(client) + return o +} + +// SetHTTPClient adds the HTTPClient to the schema by query ID params +func (o *SchemaByQueryIDParams) SetHTTPClient(client *http.Client) { + o.HTTPClient = client +} + +// WithBody adds the body to the schema by query ID params +func (o *SchemaByQueryIDParams) WithBody(body SchemaByQueryIDBody) *SchemaByQueryIDParams { + o.SetBody(body) + return o +} + +// SetBody adds the body to the schema by query ID params +func (o *SchemaByQueryIDParams) SetBody(body SchemaByQueryIDBody) { + o.Body = body +} + +// WriteToRequest writes these params to a swagger request +func (o *SchemaByQueryIDParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { + if err := r.SetTimeout(o.timeout); err != nil { + return err + } + var res []error + if err := r.SetBodyParam(o.Body); err != nil { + return err + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/api/qanpb/json/client/object_details/schema_by_query_id_responses.go b/api/qanpb/json/client/object_details/schema_by_query_id_responses.go new file mode 100644 index 0000000000..d0df17bfdc --- /dev/null +++ b/api/qanpb/json/client/object_details/schema_by_query_id_responses.go @@ -0,0 +1,337 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package object_details + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "fmt" + "io" + "strconv" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// SchemaByQueryIDReader is a Reader for the SchemaByQueryID structure. +type SchemaByQueryIDReader struct { + formats strfmt.Registry +} + +// ReadResponse reads a server response into the received o. +func (o *SchemaByQueryIDReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { + switch response.Code() { + case 200: + result := NewSchemaByQueryIDOK() + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + return result, nil + default: + result := NewSchemaByQueryIDDefault(response.Code()) + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + if response.Code()/100 == 2 { + return result, nil + } + return nil, result + } +} + +// NewSchemaByQueryIDOK creates a SchemaByQueryIDOK with default headers values +func NewSchemaByQueryIDOK() *SchemaByQueryIDOK { + return &SchemaByQueryIDOK{} +} + +/* +SchemaByQueryIDOK describes a response with status code 200, with default header values. + +A successful response. +*/ +type SchemaByQueryIDOK struct { + Payload *SchemaByQueryIDOKBody +} + +func (o *SchemaByQueryIDOK) Error() string { + return fmt.Sprintf("[POST /v0/qan/ObjectDetails/SchemaByQueryID][%d] schemaByQueryIdOk %+v", 200, o.Payload) +} + +func (o *SchemaByQueryIDOK) GetPayload() *SchemaByQueryIDOKBody { + return o.Payload +} + +func (o *SchemaByQueryIDOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + o.Payload = new(SchemaByQueryIDOKBody) + + // response payload + if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} + +// NewSchemaByQueryIDDefault creates a SchemaByQueryIDDefault with default headers values +func NewSchemaByQueryIDDefault(code int) *SchemaByQueryIDDefault { + return &SchemaByQueryIDDefault{ + _statusCode: code, + } +} + +/* +SchemaByQueryIDDefault describes a response with status code -1, with default header values. + +An unexpected error response. +*/ +type SchemaByQueryIDDefault struct { + _statusCode int + + Payload *SchemaByQueryIDDefaultBody +} + +// Code gets the status code for the schema by query ID default response +func (o *SchemaByQueryIDDefault) Code() int { + return o._statusCode +} + +func (o *SchemaByQueryIDDefault) Error() string { + return fmt.Sprintf("[POST /v0/qan/ObjectDetails/SchemaByQueryID][%d] SchemaByQueryID default %+v", o._statusCode, o.Payload) +} + +func (o *SchemaByQueryIDDefault) GetPayload() *SchemaByQueryIDDefaultBody { + return o.Payload +} + +func (o *SchemaByQueryIDDefault) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + o.Payload = new(SchemaByQueryIDDefaultBody) + + // response payload + if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} + +/* +SchemaByQueryIDBody SchemaByQueryIDRequest returns schema for given query ID and service ID. +swagger:model SchemaByQueryIDBody +*/ +type SchemaByQueryIDBody struct { + // service id + ServiceID string `json:"service_id,omitempty"` + + // query id + QueryID string `json:"query_id,omitempty"` +} + +// Validate validates this schema by query ID body +func (o *SchemaByQueryIDBody) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this schema by query ID body based on context it is used +func (o *SchemaByQueryIDBody) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *SchemaByQueryIDBody) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *SchemaByQueryIDBody) UnmarshalBinary(b []byte) error { + var res SchemaByQueryIDBody + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + +/* +SchemaByQueryIDDefaultBody schema by query ID default body +swagger:model SchemaByQueryIDDefaultBody +*/ +type SchemaByQueryIDDefaultBody struct { + // code + Code int32 `json:"code,omitempty"` + + // message + Message string `json:"message,omitempty"` + + // details + Details []*SchemaByQueryIDDefaultBodyDetailsItems0 `json:"details"` +} + +// Validate validates this schema by query ID default body +func (o *SchemaByQueryIDDefaultBody) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateDetails(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *SchemaByQueryIDDefaultBody) validateDetails(formats strfmt.Registry) error { + if swag.IsZero(o.Details) { // not required + return nil + } + + for i := 0; i < len(o.Details); i++ { + if swag.IsZero(o.Details[i]) { // not required + continue + } + + if o.Details[i] != nil { + if err := o.Details[i].Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("SchemaByQueryID default" + "." + "details" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("SchemaByQueryID default" + "." + "details" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +// ContextValidate validate this schema by query ID default body based on the context it is used +func (o *SchemaByQueryIDDefaultBody) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateDetails(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *SchemaByQueryIDDefaultBody) contextValidateDetails(ctx context.Context, formats strfmt.Registry) error { + for i := 0; i < len(o.Details); i++ { + if o.Details[i] != nil { + if err := o.Details[i].ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("SchemaByQueryID default" + "." + "details" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("SchemaByQueryID default" + "." + "details" + "." + strconv.Itoa(i)) + } + return err + } + } + } + + return nil +} + +// MarshalBinary interface implementation +func (o *SchemaByQueryIDDefaultBody) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *SchemaByQueryIDDefaultBody) UnmarshalBinary(b []byte) error { + var res SchemaByQueryIDDefaultBody + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + +/* +SchemaByQueryIDDefaultBodyDetailsItems0 schema by query ID default body details items0 +swagger:model SchemaByQueryIDDefaultBodyDetailsItems0 +*/ +type SchemaByQueryIDDefaultBodyDetailsItems0 struct { + // at type + AtType string `json:"@type,omitempty"` +} + +// Validate validates this schema by query ID default body details items0 +func (o *SchemaByQueryIDDefaultBodyDetailsItems0) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this schema by query ID default body details items0 based on context it is used +func (o *SchemaByQueryIDDefaultBodyDetailsItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *SchemaByQueryIDDefaultBodyDetailsItems0) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *SchemaByQueryIDDefaultBodyDetailsItems0) UnmarshalBinary(b []byte) error { + var res SchemaByQueryIDDefaultBodyDetailsItems0 + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + +/* +SchemaByQueryIDOKBody SchemaByQueryIDReply is schema for given query ID and service ID. +swagger:model SchemaByQueryIDOKBody +*/ +type SchemaByQueryIDOKBody struct { + // schema + Schema string `json:"schema,omitempty"` +} + +// Validate validates this schema by query ID OK body +func (o *SchemaByQueryIDOKBody) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this schema by query ID OK body based on context it is used +func (o *SchemaByQueryIDOKBody) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *SchemaByQueryIDOKBody) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *SchemaByQueryIDOKBody) UnmarshalBinary(b []byte) error { + var res SchemaByQueryIDOKBody + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/qanpb/json/qanpb.json b/api/qanpb/json/qanpb.json index 3a17f462ec..08adc4f289 100644 --- a/api/qanpb/json/qanpb.json +++ b/api/qanpb/json/qanpb.json @@ -2149,6 +2149,83 @@ } } } + }, + "/v0/qan/ObjectDetails/SchemaByQueryID": { + "post": { + "tags": [ + "ObjectDetails" + ], + "summary": "SchemaByQueryID returns schema for given queryID and serviceID.", + "operationId": "SchemaByQueryID", + "parameters": [ + { + "description": "SchemaByQueryIDRequest returns schema for given query ID and service ID.", + "name": "body", + "in": "body", + "required": true, + "schema": { + "description": "SchemaByQueryIDRequest returns schema for given query ID and service ID.", + "type": "object", + "properties": { + "query_id": { + "type": "string", + "x-order": 1 + }, + "service_id": { + "type": "string", + "x-order": 0 + } + } + } + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "description": "SchemaByQueryIDReply is schema for given query ID and service ID.", + "type": "object", + "properties": { + "schema": { + "type": "string", + "x-order": 0 + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32", + "x-order": 0 + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "x-order": 0 + } + }, + "additionalProperties": false + }, + "x-order": 2 + }, + "message": { + "type": "string", + "x-order": 1 + } + } + } + } + } + } } }, "tags": [ diff --git a/api/qanpb/object_details.pb.go b/api/qanpb/object_details.pb.go index 96f43d9a71..782db83254 100644 --- a/api/qanpb/object_details.pb.go +++ b/api/qanpb/object_details.pb.go @@ -1149,6 +1149,110 @@ func (x *QueryExistsRequest) GetQuery() string { return "" } +// SchemaByQueryIDRequest returns schema for given query ID and service ID. +type SchemaByQueryIDRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ServiceId string `protobuf:"bytes,1,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"` + QueryId string `protobuf:"bytes,2,opt,name=query_id,json=queryId,proto3" json:"query_id,omitempty"` +} + +func (x *SchemaByQueryIDRequest) Reset() { + *x = SchemaByQueryIDRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_qanpb_object_details_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchemaByQueryIDRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchemaByQueryIDRequest) ProtoMessage() {} + +func (x *SchemaByQueryIDRequest) ProtoReflect() protoreflect.Message { + mi := &file_qanpb_object_details_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 SchemaByQueryIDRequest.ProtoReflect.Descriptor instead. +func (*SchemaByQueryIDRequest) Descriptor() ([]byte, []int) { + return file_qanpb_object_details_proto_rawDescGZIP(), []int{16} +} + +func (x *SchemaByQueryIDRequest) GetServiceId() string { + if x != nil { + return x.ServiceId + } + return "" +} + +func (x *SchemaByQueryIDRequest) GetQueryId() string { + if x != nil { + return x.QueryId + } + return "" +} + +// SchemaByQueryIDReply is schema for given query ID and service ID. +type SchemaByQueryIDReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Schema string `protobuf:"bytes,1,opt,name=schema,proto3" json:"schema,omitempty"` +} + +func (x *SchemaByQueryIDReply) Reset() { + *x = SchemaByQueryIDReply{} + if protoimpl.UnsafeEnabled { + mi := &file_qanpb_object_details_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SchemaByQueryIDReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SchemaByQueryIDReply) ProtoMessage() {} + +func (x *SchemaByQueryIDReply) ProtoReflect() protoreflect.Message { + mi := &file_qanpb_object_details_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SchemaByQueryIDReply.ProtoReflect.Descriptor instead. +func (*SchemaByQueryIDReply) Descriptor() ([]byte, []int) { + return file_qanpb_object_details_proto_rawDescGZIP(), []int{17} +} + +func (x *SchemaByQueryIDReply) GetSchema() string { + if x != nil { + return x.Schema + } + return "" +} + // ExplainFingerprintByQueryIDRequest get explain fingerprint for given query ID. type ExplainFingerprintByQueryIDRequest struct { state protoimpl.MessageState @@ -1162,7 +1266,7 @@ type ExplainFingerprintByQueryIDRequest struct { func (x *ExplainFingerprintByQueryIDRequest) Reset() { *x = ExplainFingerprintByQueryIDRequest{} if protoimpl.UnsafeEnabled { - mi := &file_qanpb_object_details_proto_msgTypes[16] + mi := &file_qanpb_object_details_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1175,7 +1279,7 @@ func (x *ExplainFingerprintByQueryIDRequest) String() string { func (*ExplainFingerprintByQueryIDRequest) ProtoMessage() {} func (x *ExplainFingerprintByQueryIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_qanpb_object_details_proto_msgTypes[16] + mi := &file_qanpb_object_details_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1188,7 +1292,7 @@ func (x *ExplainFingerprintByQueryIDRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ExplainFingerprintByQueryIDRequest.ProtoReflect.Descriptor instead. func (*ExplainFingerprintByQueryIDRequest) Descriptor() ([]byte, []int) { - return file_qanpb_object_details_proto_rawDescGZIP(), []int{16} + return file_qanpb_object_details_proto_rawDescGZIP(), []int{18} } func (x *ExplainFingerprintByQueryIDRequest) GetServiceid() string { @@ -1218,7 +1322,7 @@ type ExplainFingerprintByQueryIDReply struct { func (x *ExplainFingerprintByQueryIDReply) Reset() { *x = ExplainFingerprintByQueryIDReply{} if protoimpl.UnsafeEnabled { - mi := &file_qanpb_object_details_proto_msgTypes[17] + mi := &file_qanpb_object_details_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1231,7 +1335,7 @@ func (x *ExplainFingerprintByQueryIDReply) String() string { func (*ExplainFingerprintByQueryIDReply) ProtoMessage() {} func (x *ExplainFingerprintByQueryIDReply) ProtoReflect() protoreflect.Message { - mi := &file_qanpb_object_details_proto_msgTypes[17] + mi := &file_qanpb_object_details_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1244,7 +1348,7 @@ func (x *ExplainFingerprintByQueryIDReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ExplainFingerprintByQueryIDReply.ProtoReflect.Descriptor instead. func (*ExplainFingerprintByQueryIDReply) Descriptor() ([]byte, []int) { - return file_qanpb_object_details_proto_rawDescGZIP(), []int{17} + return file_qanpb_object_details_proto_rawDescGZIP(), []int{19} } func (x *ExplainFingerprintByQueryIDReply) GetExplainFingerprint() string { @@ -1284,7 +1388,7 @@ type GetSelectedQueryMetadataReply struct { func (x *GetSelectedQueryMetadataReply) Reset() { *x = GetSelectedQueryMetadataReply{} if protoimpl.UnsafeEnabled { - mi := &file_qanpb_object_details_proto_msgTypes[18] + mi := &file_qanpb_object_details_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1297,7 +1401,7 @@ func (x *GetSelectedQueryMetadataReply) String() string { func (*GetSelectedQueryMetadataReply) ProtoMessage() {} func (x *GetSelectedQueryMetadataReply) ProtoReflect() protoreflect.Message { - mi := &file_qanpb_object_details_proto_msgTypes[18] + mi := &file_qanpb_object_details_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1310,7 +1414,7 @@ func (x *GetSelectedQueryMetadataReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSelectedQueryMetadataReply.ProtoReflect.Descriptor instead. func (*GetSelectedQueryMetadataReply) Descriptor() ([]byte, []int) { - return file_qanpb_object_details_proto_rawDescGZIP(), []int{18} + return file_qanpb_object_details_proto_rawDescGZIP(), []int{20} } func (x *GetSelectedQueryMetadataReply) GetServiceName() string { @@ -1603,117 +1707,134 @@ var file_qanpb_object_details_proto_rawDesc = []byte{ 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x22, 0x5d, 0x0a, 0x22, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6e, 0x67, - 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x44, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x79, 0x49, 0x64, - 0x22, 0x82, 0x01, 0x0a, 0x20, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6e, 0x67, - 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x44, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2f, 0x0a, 0x13, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, - 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x12, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6e, 0x67, 0x65, - 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, - 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x11, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x8c, 0x03, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1a, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x21, 0x0a, - 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0a, 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, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, - 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x32, 0xc2, 0x07, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x71, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x19, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2b, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x22, 0x20, 0x2f, 0x76, 0x30, 0x2f, 0x71, 0x61, 0x6e, - 0x2f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x47, - 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x20, 0x2e, - 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x76, 0x30, 0x2f, - 0x71, 0x61, 0x6e, 0x2f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x2f, 0x47, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x12, 0x87, 0x01, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, - 0x27, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, 0x1f, 0x2f, 0x76, 0x30, 0x2f, - 0x71, 0x61, 0x6e, 0x2f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x2f, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x79, 0x0a, 0x0c, 0x47, - 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x1d, 0x2e, 0x71, 0x61, - 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, - 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x71, 0x61, 0x6e, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6c, - 0x61, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, - 0x01, 0x2a, 0x22, 0x22, 0x2f, 0x76, 0x30, 0x2f, 0x71, 0x61, 0x6e, 0x2f, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x47, 0x65, 0x74, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x79, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x1d, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, - 0x76, 0x30, 0x2f, 0x71, 0x61, 0x6e, 0x2f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x47, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x12, 0x78, 0x0a, 0x0b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, - 0x12, 0x1f, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2c, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x3a, 0x01, 0x2a, 0x22, 0x21, 0x2f, 0x76, 0x30, 0x2f, 0x71, 0x61, - 0x6e, 0x2f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2f, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0xbb, 0x01, 0x0a, 0x1b, - 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, - 0x6e, 0x74, 0x42, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x44, 0x12, 0x2f, 0x2e, 0x71, 0x61, - 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, - 0x6e, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x79, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x71, - 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6c, 0x61, - 0x69, 0x6e, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x79, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x49, 0x44, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x3c, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x36, 0x3a, 0x01, 0x2a, 0x22, 0x31, 0x2f, 0x76, 0x30, 0x2f, 0x71, 0x61, 0x6e, 0x2f, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x45, 0x78, + 0x79, 0x22, 0x52, 0x0a, 0x16, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x42, 0x79, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x49, 0x64, 0x22, 0x2e, 0x0a, 0x14, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x42, + 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x44, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x5d, 0x0a, 0x22, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, + 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x79, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x49, 0x64, 0x22, 0x82, 0x01, 0x0a, 0x20, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, + 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x79, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x49, 0x44, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2f, 0x0a, 0x13, 0x65, 0x78, 0x70, + 0x6c, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x46, + 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, + 0x64, 0x65, 0x72, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x8c, 0x03, 0x0a, 0x1d, 0x47, 0x65, + 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x27, + 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x0a, 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, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x32, 0xd0, 0x08, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x71, 0x0a, 0x0a, 0x47, 0x65, + 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x1b, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x22, 0x20, 0x2f, 0x76, 0x30, + 0x2f, 0x71, 0x61, 0x6e, 0x2f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x2f, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x85, 0x01, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x12, 0x20, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, + 0x2f, 0x76, 0x30, 0x2f, 0x71, 0x61, 0x6e, 0x2f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x47, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x87, 0x01, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x12, 0x27, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x71, + 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, 0x1f, + 0x2f, 0x76, 0x30, 0x2f, 0x71, 0x61, 0x6e, 0x2f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, + 0x79, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6c, 0x61, 0x6e, 0x12, + 0x1d, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, + 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2d, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, 0x76, 0x30, 0x2f, 0x71, 0x61, 0x6e, 0x2f, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x47, 0x65, + 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x79, 0x0a, 0x0c, 0x47, 0x65, + 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x1d, 0x2e, 0x71, 0x61, 0x6e, + 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, + 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x71, 0x61, 0x6e, 0x2e, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x01, + 0x2a, 0x22, 0x22, 0x2f, 0x76, 0x30, 0x2f, 0x71, 0x61, 0x6e, 0x2f, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x47, 0x65, 0x74, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x78, 0x0a, 0x0b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, + 0x69, 0x73, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x3a, 0x01, 0x2a, 0x22, 0x21, 0x2f, 0x76, + 0x30, 0x2f, 0x71, 0x61, 0x6e, 0x2f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x2f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, + 0xbb, 0x01, 0x0a, 0x1b, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6e, 0x67, 0x65, + 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x42, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x44, 0x12, + 0x2f, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, - 0x42, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x44, 0x42, 0x9f, 0x01, 0x0a, 0x0f, 0x63, 0x6f, - 0x6d, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, 0x12, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x50, 0x01, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x71, 0x61, 0x6e, 0x70, 0x62, 0x3b, 0x71, 0x61, 0x6e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0xa2, 0x02, 0x03, 0x51, 0x58, 0x58, 0xaa, 0x02, 0x0b, 0x51, 0x61, 0x6e, 0x2e, 0x56, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0xca, 0x02, 0x0b, 0x51, 0x61, 0x6e, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0xe2, 0x02, 0x17, 0x51, 0x61, 0x6e, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0c, 0x51, - 0x61, 0x6e, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x42, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x44, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2d, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, + 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x42, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x44, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x3a, 0x01, 0x2a, 0x22, 0x31, 0x2f, 0x76, 0x30, 0x2f, + 0x71, 0x61, 0x6e, 0x2f, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x2f, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x42, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x44, 0x12, 0x8b, 0x01, + 0x0a, 0x0f, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x42, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, + 0x44, 0x12, 0x23, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x42, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x44, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x42, 0x79, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x49, 0x44, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x76, 0x30, 0x2f, 0x71, 0x61, 0x6e, 0x2f, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x42, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x44, 0x42, 0x9f, 0x01, 0x0a, 0x0f, + 0x63, 0x6f, 0x6d, 0x2e, 0x71, 0x61, 0x6e, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, + 0x12, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x71, 0x61, 0x6e, 0x70, 0x62, 0x3b, 0x71, 0x61, 0x6e, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0xa2, 0x02, 0x03, 0x51, 0x58, 0x58, 0xaa, 0x02, 0x0b, 0x51, 0x61, 0x6e, 0x2e, 0x56, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xca, 0x02, 0x0b, 0x51, 0x61, 0x6e, 0x5c, 0x56, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x17, 0x51, 0x61, 0x6e, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, + 0x0c, 0x51, 0x61, 0x6e, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1729,7 +1850,7 @@ func file_qanpb_object_details_proto_rawDescGZIP() []byte { } var ( - file_qanpb_object_details_proto_msgTypes = make([]protoimpl.MessageInfo, 23) + file_qanpb_object_details_proto_msgTypes = make([]protoimpl.MessageInfo, 25) file_qanpb_object_details_proto_goTypes = []interface{}{ (*MetricsRequest)(nil), // 0: qan.v1beta1.MetricsRequest (*MetricsReply)(nil), // 1: qan.v1beta1.MetricsReply @@ -1747,43 +1868,45 @@ var ( (*HistogramReply)(nil), // 13: qan.v1beta1.HistogramReply (*HistogramItem)(nil), // 14: qan.v1beta1.HistogramItem (*QueryExistsRequest)(nil), // 15: qan.v1beta1.QueryExistsRequest - (*ExplainFingerprintByQueryIDRequest)(nil), // 16: qan.v1beta1.ExplainFingerprintByQueryIDRequest - (*ExplainFingerprintByQueryIDReply)(nil), // 17: qan.v1beta1.ExplainFingerprintByQueryIDReply - (*GetSelectedQueryMetadataReply)(nil), // 18: qan.v1beta1.GetSelectedQueryMetadataReply - nil, // 19: qan.v1beta1.MetricsReply.MetricsEntry - nil, // 20: qan.v1beta1.MetricsReply.TextMetricsEntry - nil, // 21: qan.v1beta1.MetricsReply.TotalsEntry - nil, // 22: qan.v1beta1.ObjectDetailsLabelsReply.LabelsEntry - (*timestamppb.Timestamp)(nil), // 23: google.protobuf.Timestamp - (*MapFieldEntry)(nil), // 24: qan.v1beta1.MapFieldEntry - (*Point)(nil), // 25: qan.v1beta1.Point - (ExampleFormat)(0), // 26: qan.v1beta1.ExampleFormat - (ExampleType)(0), // 27: qan.v1beta1.ExampleType - (*wrapperspb.BoolValue)(nil), // 28: google.protobuf.BoolValue + (*SchemaByQueryIDRequest)(nil), // 16: qan.v1beta1.SchemaByQueryIDRequest + (*SchemaByQueryIDReply)(nil), // 17: qan.v1beta1.SchemaByQueryIDReply + (*ExplainFingerprintByQueryIDRequest)(nil), // 18: qan.v1beta1.ExplainFingerprintByQueryIDRequest + (*ExplainFingerprintByQueryIDReply)(nil), // 19: qan.v1beta1.ExplainFingerprintByQueryIDReply + (*GetSelectedQueryMetadataReply)(nil), // 20: qan.v1beta1.GetSelectedQueryMetadataReply + nil, // 21: qan.v1beta1.MetricsReply.MetricsEntry + nil, // 22: qan.v1beta1.MetricsReply.TextMetricsEntry + nil, // 23: qan.v1beta1.MetricsReply.TotalsEntry + nil, // 24: qan.v1beta1.ObjectDetailsLabelsReply.LabelsEntry + (*timestamppb.Timestamp)(nil), // 25: google.protobuf.Timestamp + (*MapFieldEntry)(nil), // 26: qan.v1beta1.MapFieldEntry + (*Point)(nil), // 27: qan.v1beta1.Point + (ExampleFormat)(0), // 28: qan.v1beta1.ExampleFormat + (ExampleType)(0), // 29: qan.v1beta1.ExampleType + (*wrapperspb.BoolValue)(nil), // 30: google.protobuf.BoolValue } ) var file_qanpb_object_details_proto_depIdxs = []int32{ - 23, // 0: qan.v1beta1.MetricsRequest.period_start_from:type_name -> google.protobuf.Timestamp - 23, // 1: qan.v1beta1.MetricsRequest.period_start_to:type_name -> google.protobuf.Timestamp - 24, // 2: qan.v1beta1.MetricsRequest.labels:type_name -> qan.v1beta1.MapFieldEntry - 19, // 3: qan.v1beta1.MetricsReply.metrics:type_name -> qan.v1beta1.MetricsReply.MetricsEntry - 20, // 4: qan.v1beta1.MetricsReply.text_metrics:type_name -> qan.v1beta1.MetricsReply.TextMetricsEntry - 25, // 5: qan.v1beta1.MetricsReply.sparkline:type_name -> qan.v1beta1.Point - 21, // 6: qan.v1beta1.MetricsReply.totals:type_name -> qan.v1beta1.MetricsReply.TotalsEntry - 18, // 7: qan.v1beta1.MetricsReply.metadata:type_name -> qan.v1beta1.GetSelectedQueryMetadataReply - 23, // 8: qan.v1beta1.QueryExampleRequest.period_start_from:type_name -> google.protobuf.Timestamp - 23, // 9: qan.v1beta1.QueryExampleRequest.period_start_to:type_name -> google.protobuf.Timestamp - 24, // 10: qan.v1beta1.QueryExampleRequest.labels:type_name -> qan.v1beta1.MapFieldEntry + 25, // 0: qan.v1beta1.MetricsRequest.period_start_from:type_name -> google.protobuf.Timestamp + 25, // 1: qan.v1beta1.MetricsRequest.period_start_to:type_name -> google.protobuf.Timestamp + 26, // 2: qan.v1beta1.MetricsRequest.labels:type_name -> qan.v1beta1.MapFieldEntry + 21, // 3: qan.v1beta1.MetricsReply.metrics:type_name -> qan.v1beta1.MetricsReply.MetricsEntry + 22, // 4: qan.v1beta1.MetricsReply.text_metrics:type_name -> qan.v1beta1.MetricsReply.TextMetricsEntry + 27, // 5: qan.v1beta1.MetricsReply.sparkline:type_name -> qan.v1beta1.Point + 23, // 6: qan.v1beta1.MetricsReply.totals:type_name -> qan.v1beta1.MetricsReply.TotalsEntry + 20, // 7: qan.v1beta1.MetricsReply.metadata:type_name -> qan.v1beta1.GetSelectedQueryMetadataReply + 25, // 8: qan.v1beta1.QueryExampleRequest.period_start_from:type_name -> google.protobuf.Timestamp + 25, // 9: qan.v1beta1.QueryExampleRequest.period_start_to:type_name -> google.protobuf.Timestamp + 26, // 10: qan.v1beta1.QueryExampleRequest.labels:type_name -> qan.v1beta1.MapFieldEntry 6, // 11: qan.v1beta1.QueryExampleReply.query_examples:type_name -> qan.v1beta1.QueryExample - 26, // 12: qan.v1beta1.QueryExample.example_format:type_name -> qan.v1beta1.ExampleFormat - 27, // 13: qan.v1beta1.QueryExample.example_type:type_name -> qan.v1beta1.ExampleType - 23, // 14: qan.v1beta1.ObjectDetailsLabelsRequest.period_start_from:type_name -> google.protobuf.Timestamp - 23, // 15: qan.v1beta1.ObjectDetailsLabelsRequest.period_start_to:type_name -> google.protobuf.Timestamp - 22, // 16: qan.v1beta1.ObjectDetailsLabelsReply.labels:type_name -> qan.v1beta1.ObjectDetailsLabelsReply.LabelsEntry - 23, // 17: qan.v1beta1.HistogramRequest.period_start_from:type_name -> google.protobuf.Timestamp - 23, // 18: qan.v1beta1.HistogramRequest.period_start_to:type_name -> google.protobuf.Timestamp - 24, // 19: qan.v1beta1.HistogramRequest.labels:type_name -> qan.v1beta1.MapFieldEntry + 28, // 12: qan.v1beta1.QueryExample.example_format:type_name -> qan.v1beta1.ExampleFormat + 29, // 13: qan.v1beta1.QueryExample.example_type:type_name -> qan.v1beta1.ExampleType + 25, // 14: qan.v1beta1.ObjectDetailsLabelsRequest.period_start_from:type_name -> google.protobuf.Timestamp + 25, // 15: qan.v1beta1.ObjectDetailsLabelsRequest.period_start_to:type_name -> google.protobuf.Timestamp + 24, // 16: qan.v1beta1.ObjectDetailsLabelsReply.labels:type_name -> qan.v1beta1.ObjectDetailsLabelsReply.LabelsEntry + 25, // 17: qan.v1beta1.HistogramRequest.period_start_from:type_name -> google.protobuf.Timestamp + 25, // 18: qan.v1beta1.HistogramRequest.period_start_to:type_name -> google.protobuf.Timestamp + 26, // 19: qan.v1beta1.HistogramRequest.labels:type_name -> qan.v1beta1.MapFieldEntry 14, // 20: qan.v1beta1.HistogramReply.histogram_items:type_name -> qan.v1beta1.HistogramItem 2, // 21: qan.v1beta1.MetricsReply.MetricsEntry.value:type_name -> qan.v1beta1.MetricValues 2, // 22: qan.v1beta1.MetricsReply.TotalsEntry.value:type_name -> qan.v1beta1.MetricValues @@ -1794,16 +1917,18 @@ var file_qanpb_object_details_proto_depIdxs = []int32{ 10, // 27: qan.v1beta1.ObjectDetails.GetQueryPlan:input_type -> qan.v1beta1.QueryPlanRequest 12, // 28: qan.v1beta1.ObjectDetails.GetHistogram:input_type -> qan.v1beta1.HistogramRequest 15, // 29: qan.v1beta1.ObjectDetails.QueryExists:input_type -> qan.v1beta1.QueryExistsRequest - 16, // 30: qan.v1beta1.ObjectDetails.ExplainFingerprintByQueryID:input_type -> qan.v1beta1.ExplainFingerprintByQueryIDRequest - 1, // 31: qan.v1beta1.ObjectDetails.GetMetrics:output_type -> qan.v1beta1.MetricsReply - 5, // 32: qan.v1beta1.ObjectDetails.GetQueryExample:output_type -> qan.v1beta1.QueryExampleReply - 8, // 33: qan.v1beta1.ObjectDetails.GetLabels:output_type -> qan.v1beta1.ObjectDetailsLabelsReply - 11, // 34: qan.v1beta1.ObjectDetails.GetQueryPlan:output_type -> qan.v1beta1.QueryPlanReply - 13, // 35: qan.v1beta1.ObjectDetails.GetHistogram:output_type -> qan.v1beta1.HistogramReply - 28, // 36: qan.v1beta1.ObjectDetails.QueryExists:output_type -> google.protobuf.BoolValue - 17, // 37: qan.v1beta1.ObjectDetails.ExplainFingerprintByQueryID:output_type -> qan.v1beta1.ExplainFingerprintByQueryIDReply - 31, // [31:38] is the sub-list for method output_type - 24, // [24:31] is the sub-list for method input_type + 18, // 30: qan.v1beta1.ObjectDetails.ExplainFingerprintByQueryID:input_type -> qan.v1beta1.ExplainFingerprintByQueryIDRequest + 16, // 31: qan.v1beta1.ObjectDetails.SchemaByQueryID:input_type -> qan.v1beta1.SchemaByQueryIDRequest + 1, // 32: qan.v1beta1.ObjectDetails.GetMetrics:output_type -> qan.v1beta1.MetricsReply + 5, // 33: qan.v1beta1.ObjectDetails.GetQueryExample:output_type -> qan.v1beta1.QueryExampleReply + 8, // 34: qan.v1beta1.ObjectDetails.GetLabels:output_type -> qan.v1beta1.ObjectDetailsLabelsReply + 11, // 35: qan.v1beta1.ObjectDetails.GetQueryPlan:output_type -> qan.v1beta1.QueryPlanReply + 13, // 36: qan.v1beta1.ObjectDetails.GetHistogram:output_type -> qan.v1beta1.HistogramReply + 30, // 37: qan.v1beta1.ObjectDetails.QueryExists:output_type -> google.protobuf.BoolValue + 19, // 38: qan.v1beta1.ObjectDetails.ExplainFingerprintByQueryID:output_type -> qan.v1beta1.ExplainFingerprintByQueryIDReply + 17, // 39: qan.v1beta1.ObjectDetails.SchemaByQueryID:output_type -> qan.v1beta1.SchemaByQueryIDReply + 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 @@ -2009,7 +2134,7 @@ func file_qanpb_object_details_proto_init() { } } file_qanpb_object_details_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExplainFingerprintByQueryIDRequest); i { + switch v := v.(*SchemaByQueryIDRequest); i { case 0: return &v.state case 1: @@ -2021,7 +2146,7 @@ func file_qanpb_object_details_proto_init() { } } file_qanpb_object_details_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExplainFingerprintByQueryIDReply); i { + switch v := v.(*SchemaByQueryIDReply); i { case 0: return &v.state case 1: @@ -2033,6 +2158,30 @@ func file_qanpb_object_details_proto_init() { } } file_qanpb_object_details_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExplainFingerprintByQueryIDRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_qanpb_object_details_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExplainFingerprintByQueryIDReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_qanpb_object_details_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetSelectedQueryMetadataReply); i { case 0: return &v.state @@ -2051,7 +2200,7 @@ func file_qanpb_object_details_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_qanpb_object_details_proto_rawDesc, NumEnums: 0, - NumMessages: 23, + NumMessages: 25, NumExtensions: 0, NumServices: 1, }, diff --git a/api/qanpb/object_details.pb.gw.go b/api/qanpb/object_details.pb.gw.go index f035cdbe11..08f454da3e 100644 --- a/api/qanpb/object_details.pb.gw.go +++ b/api/qanpb/object_details.pb.gw.go @@ -257,6 +257,38 @@ func local_request_ObjectDetails_ExplainFingerprintByQueryID_0(ctx context.Conte return msg, metadata, err } +func request_ObjectDetails_SchemaByQueryID_0(ctx context.Context, marshaler runtime.Marshaler, client ObjectDetailsClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SchemaByQueryIDRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.SchemaByQueryID(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_ObjectDetails_SchemaByQueryID_0(ctx context.Context, marshaler runtime.Marshaler, server ObjectDetailsServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SchemaByQueryIDRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SchemaByQueryID(ctx, &protoReq) + return msg, metadata, err +} + // RegisterObjectDetailsHandlerServer registers the http handlers for service ObjectDetails to "mux". // UnaryRPC :call ObjectDetailsServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -430,6 +462,30 @@ func RegisterObjectDetailsHandlerServer(ctx context.Context, mux *runtime.ServeM forward_ObjectDetails_ExplainFingerprintByQueryID_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle("POST", pattern_ObjectDetails_SchemaByQueryID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/qan.v1beta1.ObjectDetails/SchemaByQueryID", runtime.WithHTTPPathPattern("/v0/qan/ObjectDetails/SchemaByQueryID")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_ObjectDetails_SchemaByQueryID_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ObjectDetails_SchemaByQueryID_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil } @@ -617,6 +673,27 @@ func RegisterObjectDetailsHandlerClient(ctx context.Context, mux *runtime.ServeM forward_ObjectDetails_ExplainFingerprintByQueryID_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle("POST", pattern_ObjectDetails_SchemaByQueryID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/qan.v1beta1.ObjectDetails/SchemaByQueryID", runtime.WithHTTPPathPattern("/v0/qan/ObjectDetails/SchemaByQueryID")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ObjectDetails_SchemaByQueryID_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_ObjectDetails_SchemaByQueryID_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil } @@ -634,6 +711,8 @@ var ( pattern_ObjectDetails_QueryExists_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v0", "qan", "ObjectDetails", "QueryExists"}, "")) pattern_ObjectDetails_ExplainFingerprintByQueryID_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v0", "qan", "ObjectDetails", "ExplainFingerprintByQueryID"}, "")) + + pattern_ObjectDetails_SchemaByQueryID_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v0", "qan", "ObjectDetails", "SchemaByQueryID"}, "")) ) var ( @@ -650,4 +729,6 @@ var ( forward_ObjectDetails_QueryExists_0 = runtime.ForwardResponseMessage forward_ObjectDetails_ExplainFingerprintByQueryID_0 = runtime.ForwardResponseMessage + + forward_ObjectDetails_SchemaByQueryID_0 = runtime.ForwardResponseMessage ) diff --git a/api/qanpb/object_details.pb.validate.go b/api/qanpb/object_details.pb.validate.go index b59b656fb9..01720554cb 100644 --- a/api/qanpb/object_details.pb.validate.go +++ b/api/qanpb/object_details.pb.validate.go @@ -2317,6 +2317,216 @@ var _ interface { ErrorName() string } = QueryExistsRequestValidationError{} +// Validate checks the field values on SchemaByQueryIDRequest with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *SchemaByQueryIDRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on SchemaByQueryIDRequest with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// SchemaByQueryIDRequestMultiError, or nil if none found. +func (m *SchemaByQueryIDRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *SchemaByQueryIDRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for ServiceId + + // no validation rules for QueryId + + if len(errors) > 0 { + return SchemaByQueryIDRequestMultiError(errors) + } + + return nil +} + +// SchemaByQueryIDRequestMultiError is an error wrapping multiple validation +// errors returned by SchemaByQueryIDRequest.ValidateAll() if the designated +// constraints aren't met. +type SchemaByQueryIDRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m SchemaByQueryIDRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m SchemaByQueryIDRequestMultiError) AllErrors() []error { return m } + +// SchemaByQueryIDRequestValidationError is the validation error returned by +// SchemaByQueryIDRequest.Validate if the designated constraints aren't met. +type SchemaByQueryIDRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e SchemaByQueryIDRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e SchemaByQueryIDRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e SchemaByQueryIDRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e SchemaByQueryIDRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e SchemaByQueryIDRequestValidationError) ErrorName() string { + return "SchemaByQueryIDRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e SchemaByQueryIDRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sSchemaByQueryIDRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = SchemaByQueryIDRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = SchemaByQueryIDRequestValidationError{} + +// Validate checks the field values on SchemaByQueryIDReply with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *SchemaByQueryIDReply) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on SchemaByQueryIDReply with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// SchemaByQueryIDReplyMultiError, or nil if none found. +func (m *SchemaByQueryIDReply) ValidateAll() error { + return m.validate(true) +} + +func (m *SchemaByQueryIDReply) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Schema + + if len(errors) > 0 { + return SchemaByQueryIDReplyMultiError(errors) + } + + return nil +} + +// SchemaByQueryIDReplyMultiError is an error wrapping multiple validation +// errors returned by SchemaByQueryIDReply.ValidateAll() if the designated +// constraints aren't met. +type SchemaByQueryIDReplyMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m SchemaByQueryIDReplyMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m SchemaByQueryIDReplyMultiError) AllErrors() []error { return m } + +// SchemaByQueryIDReplyValidationError is the validation error returned by +// SchemaByQueryIDReply.Validate if the designated constraints aren't met. +type SchemaByQueryIDReplyValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e SchemaByQueryIDReplyValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e SchemaByQueryIDReplyValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e SchemaByQueryIDReplyValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e SchemaByQueryIDReplyValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e SchemaByQueryIDReplyValidationError) ErrorName() string { + return "SchemaByQueryIDReplyValidationError" +} + +// Error satisfies the builtin error interface +func (e SchemaByQueryIDReplyValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sSchemaByQueryIDReply.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = SchemaByQueryIDReplyValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = SchemaByQueryIDReplyValidationError{} + // Validate checks the field values on ExplainFingerprintByQueryIDRequest with // the rules defined in the proto definition for this message. If any rules // are violated, the first error encountered is returned, or nil if there are diff --git a/api/qanpb/object_details.proto b/api/qanpb/object_details.proto index b96472e76b..31e0e43945 100644 --- a/api/qanpb/object_details.proto +++ b/api/qanpb/object_details.proto @@ -60,6 +60,13 @@ service ObjectDetails { body: "*" }; } + // SchemaByQueryID returns schema for given queryID and serviceID. + rpc SchemaByQueryID(SchemaByQueryIDRequest) returns (SchemaByQueryIDReply) { + option (google.api.http) = { + post: "/v0/qan/ObjectDetails/SchemaByQueryID" + body: "*" + }; + } } // MetricsRequest defines filtering of metrics for specific value of dimension (ex.: host=hostname1 or queryid=1D410B4BE5060972. @@ -195,6 +202,17 @@ message QueryExistsRequest { string query = 2; } +// SchemaByQueryIDRequest returns schema for given query ID and service ID. +message SchemaByQueryIDRequest { + string service_id = 1; + string query_id = 2; +} + +// SchemaByQueryIDReply is schema for given query ID and service ID. +message SchemaByQueryIDReply { + string schema = 1; +} + // ExplainFingerprintByQueryIDRequest get explain fingerprint for given query ID. message ExplainFingerprintByQueryIDRequest { string serviceid = 1; diff --git a/api/qanpb/object_details_grpc.pb.go b/api/qanpb/object_details_grpc.pb.go index b2386e8f30..26a2bbc5c2 100644 --- a/api/qanpb/object_details_grpc.pb.go +++ b/api/qanpb/object_details_grpc.pb.go @@ -28,6 +28,7 @@ const ( ObjectDetails_GetHistogram_FullMethodName = "/qan.v1beta1.ObjectDetails/GetHistogram" ObjectDetails_QueryExists_FullMethodName = "/qan.v1beta1.ObjectDetails/QueryExists" ObjectDetails_ExplainFingerprintByQueryID_FullMethodName = "/qan.v1beta1.ObjectDetails/ExplainFingerprintByQueryID" + ObjectDetails_SchemaByQueryID_FullMethodName = "/qan.v1beta1.ObjectDetails/SchemaByQueryID" ) // ObjectDetailsClient is the client API for ObjectDetails service. @@ -48,6 +49,8 @@ type ObjectDetailsClient interface { QueryExists(ctx context.Context, in *QueryExistsRequest, opts ...grpc.CallOption) (*wrapperspb.BoolValue, error) // ExplainFingerprintByQueryID get explain fingerprint for given query ID. ExplainFingerprintByQueryID(ctx context.Context, in *ExplainFingerprintByQueryIDRequest, opts ...grpc.CallOption) (*ExplainFingerprintByQueryIDReply, error) + // SchemaByQueryID returns schema for given queryID and serviceID. + SchemaByQueryID(ctx context.Context, in *SchemaByQueryIDRequest, opts ...grpc.CallOption) (*SchemaByQueryIDReply, error) } type objectDetailsClient struct { @@ -121,6 +124,15 @@ func (c *objectDetailsClient) ExplainFingerprintByQueryID(ctx context.Context, i return out, nil } +func (c *objectDetailsClient) SchemaByQueryID(ctx context.Context, in *SchemaByQueryIDRequest, opts ...grpc.CallOption) (*SchemaByQueryIDReply, error) { + out := new(SchemaByQueryIDReply) + err := c.cc.Invoke(ctx, ObjectDetails_SchemaByQueryID_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ObjectDetailsServer is the server API for ObjectDetails service. // All implementations must embed UnimplementedObjectDetailsServer // for forward compatibility @@ -139,6 +151,8 @@ type ObjectDetailsServer interface { QueryExists(context.Context, *QueryExistsRequest) (*wrapperspb.BoolValue, error) // ExplainFingerprintByQueryID get explain fingerprint for given query ID. ExplainFingerprintByQueryID(context.Context, *ExplainFingerprintByQueryIDRequest) (*ExplainFingerprintByQueryIDReply, error) + // SchemaByQueryID returns schema for given queryID and serviceID. + SchemaByQueryID(context.Context, *SchemaByQueryIDRequest) (*SchemaByQueryIDReply, error) mustEmbedUnimplementedObjectDetailsServer() } @@ -172,6 +186,10 @@ func (UnimplementedObjectDetailsServer) QueryExists(context.Context, *QueryExist func (UnimplementedObjectDetailsServer) ExplainFingerprintByQueryID(context.Context, *ExplainFingerprintByQueryIDRequest) (*ExplainFingerprintByQueryIDReply, error) { return nil, status.Errorf(codes.Unimplemented, "method ExplainFingerprintByQueryID not implemented") } + +func (UnimplementedObjectDetailsServer) SchemaByQueryID(context.Context, *SchemaByQueryIDRequest) (*SchemaByQueryIDReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SchemaByQueryID not implemented") +} func (UnimplementedObjectDetailsServer) mustEmbedUnimplementedObjectDetailsServer() {} // UnsafeObjectDetailsServer may be embedded to opt out of forward compatibility for this service. @@ -311,6 +329,24 @@ func _ObjectDetails_ExplainFingerprintByQueryID_Handler(srv interface{}, ctx con return interceptor(ctx, in, info, handler) } +func _ObjectDetails_SchemaByQueryID_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SchemaByQueryIDRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ObjectDetailsServer).SchemaByQueryID(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ObjectDetails_SchemaByQueryID_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ObjectDetailsServer).SchemaByQueryID(ctx, req.(*SchemaByQueryIDRequest)) + } + return interceptor(ctx, in, info, handler) +} + // ObjectDetails_ServiceDesc is the grpc.ServiceDesc for ObjectDetails service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -346,6 +382,10 @@ var ObjectDetails_ServiceDesc = grpc.ServiceDesc{ MethodName: "ExplainFingerprintByQueryID", Handler: _ObjectDetails_ExplainFingerprintByQueryID_Handler, }, + { + MethodName: "SchemaByQueryID", + Handler: _ObjectDetails_SchemaByQueryID_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "qanpb/object_details.proto", diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index be8c3f4c7c..63af6135a9 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -2199,6 +2199,83 @@ } } }, + "/v0/qan/ObjectDetails/SchemaByQueryID": { + "post": { + "tags": [ + "ObjectDetails" + ], + "summary": "SchemaByQueryID returns schema for given queryID and serviceID.", + "operationId": "SchemaByQueryID", + "parameters": [ + { + "description": "SchemaByQueryIDRequest returns schema for given query ID and service ID.", + "name": "body", + "in": "body", + "required": true, + "schema": { + "description": "SchemaByQueryIDRequest returns schema for given query ID and service ID.", + "type": "object", + "properties": { + "service_id": { + "type": "string", + "x-order": 0 + }, + "query_id": { + "type": "string", + "x-order": 1 + } + } + } + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "description": "SchemaByQueryIDReply is schema for given query ID and service ID.", + "type": "object", + "properties": { + "schema": { + "type": "string", + "x-order": 0 + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32", + "x-order": 0 + }, + "message": { + "type": "string", + "x-order": 1 + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "x-order": 0 + } + }, + "additionalProperties": false + }, + "x-order": 2 + } + } + } + } + } + } + }, "/v1/AWSInstanceCheck": { "post": { "description": "Checks AWS EC2 instance ID.", diff --git a/managed/services/agents/actions.go b/managed/services/agents/actions.go index d8a206b4e4..c2834b8c3a 100644 --- a/managed/services/agents/actions.go +++ b/managed/services/agents/actions.go @@ -66,7 +66,7 @@ func (s *ActionsService) StartMySQLExplainAction( return status.Error(codes.FailedPrecondition, "query or query_id is required") } - var q string + var q, schema string switch { case queryID != "": res, err := s.qanClient.ExplainFingerprintByQueryID(ctx, serviceID, queryID) @@ -77,8 +77,13 @@ func (s *ActionsService) StartMySQLExplainAction( if res.PlaceholdersCount != uint32(len(placeholders)) { return status.Error(codes.FailedPrecondition, "placeholders count is not correct") } - q = res.ExplainFingerprint + + s, err := s.qanClient.SchemaByQueryID(ctx, serviceID, queryID) + if err != nil { + return err + } + schema = s.Schema default: err := s.qanClient.QueryExists(ctx, serviceID, query) if err != nil { @@ -99,6 +104,7 @@ func (s *ActionsService) StartMySQLExplainAction( Dsn: dsn, Query: q, Values: placeholders, + Schema: schema, OutputFormat: format, TlsFiles: &agentpb.TextFiles{ Files: files, diff --git a/managed/services/agents/deps.go b/managed/services/agents/deps.go index e4b0c36014..0a321d944d 100644 --- a/managed/services/agents/deps.go +++ b/managed/services/agents/deps.go @@ -39,6 +39,7 @@ type qanClient interface { Collect(ctx context.Context, metricsBuckets []*agentpb.MetricsBucket) error QueryExists(ctx context.Context, serviceID, query string) error ExplainFingerprintByQueryID(ctx context.Context, serviceID, queryID string) (*qanpb.ExplainFingerprintByQueryIDReply, error) + SchemaByQueryID(ctx context.Context, serviceID, queryID string) (*qanpb.SchemaByQueryIDReply, error) } // retentionService is a subset of methods of backup.Client used by this package. diff --git a/managed/services/qan/client.go b/managed/services/qan/client.go index 4b48c8e172..b6adaef8d7 100644 --- a/managed/services/qan/client.go +++ b/managed/services/qan/client.go @@ -141,6 +141,21 @@ func (c *Client) ExplainFingerprintByQueryID(ctx context.Context, serviceID, que return res, nil } +// SchemaByQueryID returns schema for given queryID and serviceID. +func (c *Client) SchemaByQueryID(ctx context.Context, serviceID, queryID string) (*qanpb.SchemaByQueryIDReply, error) { + qanReq := &qanpb.SchemaByQueryIDRequest{ + ServiceId: serviceID, + QueryId: queryID, + } + c.l.Debugf("%+v", qanReq) + res, err := c.odc.SchemaByQueryID(ctx, qanReq) + if err != nil { + return nil, err + } + + return res, nil +} + // Collect adds labels to the data from pmm-agent and sends it to qan-api. func (c *Client) Collect(ctx context.Context, metricsBuckets []*agentpb.MetricsBucket) error { start := time.Now() diff --git a/qan-api2/models/metrics.go b/qan-api2/models/metrics.go index 604cd06659..4b34dcb178 100644 --- a/qan-api2/models/metrics.go +++ b/qan-api2/models/metrics.go @@ -978,7 +978,53 @@ func (m *Metrics) QueryExists(ctx context.Context, serviceID, query string) (boo return false, nil } -const queryByQueryIDTmpl = `SELECT explain_fingerprint, fingerprint, placeholders_count FROM metrics +const schemaByQueryIDTmpl = `SELECT schema FROM metrics +WHERE service_id = :service_id AND queryid = :query_id LIMIT 1;` + +// SchemaByQueryID returns schema for given queryID and serviceID. +func (m *Metrics) SchemaByQueryID(ctx context.Context, serviceID, queryID string) (*qanpb.SchemaByQueryIDReply, error) { + arg := map[string]interface{}{ + "service_id": serviceID, + "query_id": queryID, + } + + var queryBuffer bytes.Buffer + queryBuffer.WriteString(schemaByQueryIDTmpl) + + query, args, err := sqlx.Named(queryBuffer.String(), arg) + if err != nil { + return nil, errors.Wrap(err, cannotPrepare) + } + query, args, err = sqlx.In(query, args...) + if err != nil { + return nil, errors.Wrap(err, cannotPopulate) + } + query = m.db.Rebind(query) + + queryCtx, cancel := context.WithTimeout(ctx, queryTimeout) + defer cancel() + + rows, err := m.db.QueryxContext(queryCtx, query, args...) + if err != nil { + return nil, errors.Wrap(err, cannotExecute) + } + defer rows.Close() //nolint:errcheck + + res := &qanpb.SchemaByQueryIDReply{} + for rows.Next() { + err = rows.Scan(&res.Schema) + + if err != nil { + return res, errors.Wrap(err, "failed to scan query") + } + + return res, nil //nolint:staticcheck + } + + return res, nil +} + +const queryByQueryIDTmpl = `SELECT explain_fingerprint, fingerprint, example, placeholders_count FROM metrics WHERE service_id = :service_id AND queryid = :query_id LIMIT 1; ` @@ -1012,17 +1058,25 @@ func (m *Metrics) ExplainFingerprintByQueryID(ctx context.Context, serviceID, qu } defer rows.Close() //nolint:errcheck - var fingerprint string + var fingerprint, example string for rows.Next() { err = rows.Scan( &res.ExplainFingerprint, &fingerprint, + &example, &res.PlaceholdersCount) if err != nil { return res, errors.Wrap(err, "failed to scan query") } + if example != "" { + res.ExplainFingerprint = example + res.PlaceholdersCount = 0 + + return res, nil + } + if res.ExplainFingerprint == "" { res.ExplainFingerprint = fingerprint } diff --git a/qan-api2/services/analytics/object_details.go b/qan-api2/services/analytics/object_details.go index 79ffa56ea2..72024f41b9 100644 --- a/qan-api2/services/analytics/object_details.go +++ b/qan-api2/services/analytics/object_details.go @@ -377,3 +377,16 @@ func (s *Service) ExplainFingerprintByQueryID(ctx context.Context, in *qanpb.Exp return res, nil } + +// SchemaByQueryID returns schema for given queryID and serviceID. +func (s *Service) SchemaByQueryID(ctx context.Context, in *qanpb.SchemaByQueryIDRequest) (*qanpb.SchemaByQueryIDReply, error) { + res, err := s.mm.SchemaByQueryID( + ctx, + in.ServiceId, + in.QueryId) + if err != nil { + return nil, fmt.Errorf("error in checking query:%w", err) + } + + return res, nil +} From feaf7af4af07d1c8221197247526636790e53ccd Mon Sep 17 00:00:00 2001 From: Artem Gavrilov Date: Fri, 28 Jul 2023 18:32:07 +0200 Subject: [PATCH 11/27] PMM-11206 Remove limit for custom templates upload (#2166) * PMM-11206 Refactoring * PMM-11206 Regenerate mocks * PMM-11206 Refactoring * PMM-11206 Update comment * PMM-11206 Allow to upload multiple templates at once, improve error messages * PMM-11206 Fix * PMM-11206 Add API test * PMM-11206 Fix linter warning * PMM-11206 Cleanup * PMM-11206 Fix API tests * PMM-11206 Update saas dependency * PMM-11206 Fix * PMM-11206 Fix API test * PMM-11206 Update saas dependency * PMM-11206 Fix --- .../management/alerting/alerting_test.go | 40 ++- api-tests/pmm-api-tests-output.txt | 0 api-tests/testdata/ia/multiple-templates.yaml | 49 +++ api/managementpb/alerting/alerting.pb.go | 6 +- api/managementpb/alerting/alerting.proto | 6 +- api/managementpb/alerting/json/alerting.json | 6 +- .../alerting/create_template_responses.go | 2 +- .../alerting/list_templates_responses.go | 2 +- .../alerting/update_template_responses.go | 2 +- api/swagger/swagger-dev.json | 6 +- api/swagger/swagger.json | 6 +- go.mod | 6 +- go.sum | 12 +- managed/models/models.go | 7 + managed/models/template_helpers.go | 79 +++-- managed/models/template_helpers_test.go | 4 +- managed/models/template_model.go | 2 +- .../services/management/alerting/service.go | 317 +++++++----------- managed/services/management/ia/deps.go | 4 +- .../ia/mock_templates_service_test.go | 10 +- .../services/management/ia/rules_service.go | 17 +- 21 files changed, 316 insertions(+), 267 deletions(-) create mode 100644 api-tests/pmm-api-tests-output.txt create mode 100644 api-tests/testdata/ia/multiple-templates.yaml diff --git a/api-tests/management/alerting/alerting_test.go b/api-tests/management/alerting/alerting_test.go index 960500e36e..f68107683f 100644 --- a/api-tests/management/alerting/alerting_test.go +++ b/api-tests/management/alerting/alerting_test.go @@ -114,6 +114,10 @@ func assertTemplate(t *testing.T, expectedTemplate alert.Template, listTemplates assert.Equal(t, expectedTemplate.Labels, tmpl.Labels) assert.Equal(t, expectedTemplate.Annotations, tmpl.Annotations) + expectedYAML, err := alert.ToYAML([]alert.Template{expectedTemplate}) + require.NoError(t, err) + assert.Equal(t, expectedYAML, tmpl.Yaml) + assert.NotEmpty(t, tmpl.CreatedAt) } @@ -124,6 +128,9 @@ func TestTemplatesAPI(t *testing.T) { templateData, err := os.ReadFile("../../testdata/ia/template.yaml") require.NoError(t, err) + multipleTemplatesData, err := os.ReadFile("../../testdata/ia/multiple-templates.yaml") + require.NoError(t, err) + invalidTemplateData, err := os.ReadFile("../../testdata/ia/invalid-template.yaml") require.NoError(t, err) @@ -156,6 +163,35 @@ func TestTemplatesAPI(t *testing.T) { assertTemplate(t, alertTemplates[0], resp.Payload.Templates) }) + t.Run("multiple templates at once", func(t *testing.T) { + t.Parallel() + + alertTemplates, yml := formatTemplateYaml(t, string(multipleTemplatesData)) + _, err := client.CreateTemplate(&alerting.CreateTemplateParams{ + Body: alerting.CreateTemplateBody{ + Yaml: yml, + }, + Context: pmmapitests.Context, + }) + require.NoError(t, err) + require.Len(t, alertTemplates, 2) + t.Cleanup(func() { + deleteTemplate(t, client, alertTemplates[0].Name) + deleteTemplate(t, client, alertTemplates[1].Name) + }) + + resp, err := client.ListTemplates(&alerting.ListTemplatesParams{ + Body: alerting.ListTemplatesBody{ + Reload: true, + }, + Context: pmmapitests.Context, + }) + require.NoError(t, err) + + assertTemplate(t, alertTemplates[0], resp.Payload.Templates) + assertTemplate(t, alertTemplates[1], resp.Payload.Templates) + }) + t.Run("duplicate", func(t *testing.T) { t.Parallel() @@ -188,7 +224,7 @@ func TestTemplatesAPI(t *testing.T) { }, Context: pmmapitests.Context, }) - pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Failed to parse rule template.") + pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Failed to parse rule template") }) t.Run("invalid template", func(t *testing.T) { @@ -201,7 +237,7 @@ func TestTemplatesAPI(t *testing.T) { Context: pmmapitests.Context, }) - pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Failed to parse rule template.") + pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Failed to parse rule template") }) }) diff --git a/api-tests/pmm-api-tests-output.txt b/api-tests/pmm-api-tests-output.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/api-tests/testdata/ia/multiple-templates.yaml b/api-tests/testdata/ia/multiple-templates.yaml new file mode 100644 index 0000000000..c2dcec7554 --- /dev/null +++ b/api-tests/testdata/ia/multiple-templates.yaml @@ -0,0 +1,49 @@ +--- +templates: + - name: test_template_1 + version: 1 + summary: Test summary 1 + tiers: [ anonymous, registered ] + expr: "test expression" + params: + - name: param1 + summary: first parameter with default value and defined range + unit: s + type: float + range: [ 0, 100 ] + value: 80 + - name: param2 + summary: second parameter without default value and defined range + unit: s + type: float + for: 300s + severity: warning + labels: + foo: bar + annotations: + description: test description + summary: test summary + + - name: test_template_2 + version: 1 + summary: Test summary 2 + tiers: [ anonymous, registered ] + expr: "test expression" + params: + - name: param1 + summary: first parameter with default value and defined range + unit: s + type: float + range: [ 0, 100 ] + value: 80 + - name: param2 + summary: second parameter without default value and defined range + unit: s + type: float + for: 300s + severity: warning + labels: + foo: bar + annotations: + description: test description + summary: test summary diff --git a/api/managementpb/alerting/alerting.pb.go b/api/managementpb/alerting/alerting.pb.go index 7d6f223563..13ec12832d 100644 --- a/api/managementpb/alerting/alerting.pb.go +++ b/api/managementpb/alerting/alerting.pb.go @@ -500,7 +500,7 @@ type Template struct { Source TemplateSource `protobuf:"varint,9,opt,name=source,proto3,enum=alerting.v1.TemplateSource" json:"source,omitempty"` // Template creation time. Empty for built-in and SaaS templates. CreatedAt *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - // YAML (or JSON) template file content. Empty for built-in and SaaS templates. + // YAML template file content. Empty for built-in and SaaS templates. Yaml string `protobuf:"bytes,11,opt,name=yaml,proto3" json:"yaml,omitempty"` } @@ -731,7 +731,7 @@ type CreateTemplateRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // YAML (or JSON) template file content. + // YAML template file content. Yaml string `protobuf:"bytes,1,opt,name=yaml,proto3" json:"yaml,omitempty"` } @@ -819,7 +819,7 @@ type UpdateTemplateRequest struct { // Machine-readable name (ID). Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // YAML (or JSON) template file content. + // YAML template file content. Yaml string `protobuf:"bytes,2,opt,name=yaml,proto3" json:"yaml,omitempty"` } diff --git a/api/managementpb/alerting/alerting.proto b/api/managementpb/alerting/alerting.proto index 82d8df2f01..2356bb6b34 100644 --- a/api/managementpb/alerting/alerting.proto +++ b/api/managementpb/alerting/alerting.proto @@ -98,7 +98,7 @@ message Template { TemplateSource source = 9; // Template creation time. Empty for built-in and SaaS templates. google.protobuf.Timestamp created_at = 10; - // YAML (or JSON) template file content. Empty for built-in and SaaS templates. + // YAML template file content. Empty for built-in and SaaS templates. string yaml = 11; } @@ -116,7 +116,7 @@ message ListTemplatesResponse { } message CreateTemplateRequest { - // YAML (or JSON) template file content. + // YAML template file content. string yaml = 1 [(validate.rules).string.min_len = 1]; } @@ -125,7 +125,7 @@ message CreateTemplateResponse {} message UpdateTemplateRequest { // Machine-readable name (ID). string name = 1 [(validate.rules).string.min_len = 1]; - // YAML (or JSON) template file content. + // YAML template file content. string yaml = 2 [(validate.rules).string.min_len = 1]; } diff --git a/api/managementpb/alerting/json/alerting.json b/api/managementpb/alerting/json/alerting.json index a9c0e57d1f..31a3e0fe4f 100644 --- a/api/managementpb/alerting/json/alerting.json +++ b/api/managementpb/alerting/json/alerting.json @@ -215,7 +215,7 @@ "type": "object", "properties": { "yaml": { - "description": "YAML (or JSON) template file content.", + "description": "YAML template file content.", "type": "string", "x-order": 0 } @@ -575,7 +575,7 @@ "x-order": 1 }, "yaml": { - "description": "YAML (or JSON) template file content. Empty for built-in and SaaS templates.", + "description": "YAML template file content. Empty for built-in and SaaS templates.", "type": "string", "x-order": 10 } @@ -660,7 +660,7 @@ "x-order": 0 }, "yaml": { - "description": "YAML (or JSON) template file content.", + "description": "YAML template file content.", "type": "string", "x-order": 1 } diff --git a/api/managementpb/alerting/json/client/alerting/create_template_responses.go b/api/managementpb/alerting/json/client/alerting/create_template_responses.go index b7f4dd8f7d..ab5c000932 100644 --- a/api/managementpb/alerting/json/client/alerting/create_template_responses.go +++ b/api/managementpb/alerting/json/client/alerting/create_template_responses.go @@ -121,7 +121,7 @@ CreateTemplateBody create template body swagger:model CreateTemplateBody */ type CreateTemplateBody struct { - // YAML (or JSON) template file content. + // YAML template file content. Yaml string `json:"yaml,omitempty"` } diff --git a/api/managementpb/alerting/json/client/alerting/list_templates_responses.go b/api/managementpb/alerting/json/client/alerting/list_templates_responses.go index cee8c814a3..a4f455229a 100644 --- a/api/managementpb/alerting/json/client/alerting/list_templates_responses.go +++ b/api/managementpb/alerting/json/client/alerting/list_templates_responses.go @@ -539,7 +539,7 @@ type ListTemplatesOKBodyTemplatesItems0 struct { // Format: date-time CreatedAt strfmt.DateTime `json:"created_at,omitempty"` - // YAML (or JSON) template file content. Empty for built-in and SaaS templates. + // YAML template file content. Empty for built-in and SaaS templates. Yaml string `json:"yaml,omitempty"` } diff --git a/api/managementpb/alerting/json/client/alerting/update_template_responses.go b/api/managementpb/alerting/json/client/alerting/update_template_responses.go index 3d051b737b..242e579151 100644 --- a/api/managementpb/alerting/json/client/alerting/update_template_responses.go +++ b/api/managementpb/alerting/json/client/alerting/update_template_responses.go @@ -124,7 +124,7 @@ type UpdateTemplateBody struct { // Machine-readable name (ID). Name string `json:"name,omitempty"` - // YAML (or JSON) template file content. + // YAML template file content. Yaml string `json:"yaml,omitempty"` } diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index 63af6135a9..4e04d3fe73 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -31110,7 +31110,7 @@ "type": "object", "properties": { "yaml": { - "description": "YAML (or JSON) template file content.", + "description": "YAML template file content.", "type": "string", "x-order": 0 } @@ -31470,7 +31470,7 @@ "x-order": 9 }, "yaml": { - "description": "YAML (or JSON) template file content. Empty for built-in and SaaS templates.", + "description": "YAML template file content. Empty for built-in and SaaS templates.", "type": "string", "x-order": 10 } @@ -31555,7 +31555,7 @@ "x-order": 0 }, "yaml": { - "description": "YAML (or JSON) template file content.", + "description": "YAML template file content.", "type": "string", "x-order": 1 } diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index f91076ead0..908e2702de 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -21220,7 +21220,7 @@ "type": "object", "properties": { "yaml": { - "description": "YAML (or JSON) template file content.", + "description": "YAML template file content.", "type": "string", "x-order": 0 } @@ -21580,7 +21580,7 @@ "x-order": 9 }, "yaml": { - "description": "YAML (or JSON) template file content. Empty for built-in and SaaS templates.", + "description": "YAML template file content. Empty for built-in and SaaS templates.", "type": "string", "x-order": 10 } @@ -21665,7 +21665,7 @@ "x-order": 0 }, "yaml": { - "description": "YAML (or JSON) template file content.", + "description": "YAML template file content.", "type": "string", "x-order": 1 } diff --git a/go.mod b/go.mod index 0f74f774f7..5d3d35016a 100644 --- a/go.mod +++ b/go.mod @@ -55,7 +55,7 @@ require ( github.com/operator-framework/api v0.17.6 github.com/operator-framework/operator-lifecycle-manager v0.24.0 github.com/percona-platform/dbaas-api v0.0.0-20230103182808-d79c449a9f4c - github.com/percona-platform/saas v0.0.0-20230713134421-bb403194c5f7 + github.com/percona-platform/saas v0.0.0-20230728161159-ad6bdeb8a3d9 github.com/percona/dbaas-operator v0.1.6 github.com/percona/exporter_shared v0.7.4 github.com/percona/go-mysql v0.0.0-20210427141028-73d29c6da78c @@ -133,7 +133,7 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/xlab/treeprint v1.1.0 // indirect go.opentelemetry.io/otel/metric v1.16.0 // indirect - go.uber.org/atomic v1.10.0 // indirect + go.uber.org/atomic v1.11.0 // indirect golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect golang.org/x/time v0.3.0 // indirect google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e // indirect @@ -172,7 +172,7 @@ require ( github.com/andybalholm/brotli v1.0.5 // indirect github.com/armon/go-metrics v0.4.0 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cenkalti/backoff/v4 v4.2.0 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/charmbracelet/harmonica v0.2.0 // indirect github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 // indirect diff --git a/go.sum b/go.sum index ee78e3c92f..c420e69174 100644 --- a/go.sum +++ b/go.sum @@ -144,8 +144,8 @@ github.com/brianvoe/gofakeit v3.18.0+incompatible/go.mod h1:kfwdRA90vvNhPutZWfH7 github.com/brianvoe/gofakeit/v6 v6.23.0 h1:pgVhyWpYq4e0GEVCh2gdZnS/nBX+8SnyTBliHg5xjks= github.com/brianvoe/gofakeit/v6 v6.23.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4= -github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -645,8 +645,8 @@ github.com/percona-lab/crypto v0.0.0-20220811043533-d164de3c7f08 h1:NprWeXddFZJS github.com/percona-lab/crypto v0.0.0-20220811043533-d164de3c7f08/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= github.com/percona-platform/dbaas-api v0.0.0-20230103182808-d79c449a9f4c h1:1JySfwdjVfc9ahl0466OX7nSQ7Z4SjQkLe3ZdLkMOJI= github.com/percona-platform/dbaas-api v0.0.0-20230103182808-d79c449a9f4c/go.mod h1:/jgle33awfHq1va/T6NnNS5wWAETSnl6wUZ1bew+CJ0= -github.com/percona-platform/saas v0.0.0-20230713134421-bb403194c5f7 h1:9XwfsWsQjWLWZpm9ouuAMZGZ3g4bT4pt0E/fr0Tc/Vo= -github.com/percona-platform/saas v0.0.0-20230713134421-bb403194c5f7/go.mod h1:lZuFcqj0EoQWx28SYkTcdhJOCQEbRcAyahYPfRMY7tc= +github.com/percona-platform/saas v0.0.0-20230728161159-ad6bdeb8a3d9 h1:KkOH+Y4sVRP7qvRtTDmfPFNjjQcwU2054/jNl9DZhEo= +github.com/percona-platform/saas v0.0.0-20230728161159-ad6bdeb8a3d9/go.mod h1:lZuFcqj0EoQWx28SYkTcdhJOCQEbRcAyahYPfRMY7tc= github.com/percona/dbaas-operator v0.1.6 h1:NsZXDKcPXk38kET+X6r8Es+3Supyu5XJZMS0gqPejKs= github.com/percona/dbaas-operator v0.1.6/go.mod h1:52B/kh+Jmtfv0JiZgDcc34qgbwwEi9U4A3311JBxIZg= github.com/percona/exporter_shared v0.7.4 h1:S+xnfK/CySiYqr4XqLiLAfO3rxgEOUFK+m6lCBi3mgc= @@ -832,8 +832,8 @@ go.starlark.net v0.0.0-20230717150657-8a3343210976 h1:7ljYNcZU84T2N0tZdDgvL7U3M4 go.starlark.net v0.0.0-20230717150657-8a3343210976/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= diff --git a/managed/models/models.go b/managed/models/models.go index 871e3766b3..b65d461cd4 100644 --- a/managed/models/models.go +++ b/managed/models/models.go @@ -230,3 +230,10 @@ const ( Bool = ParamType("bool") String = ParamType("string") ) + +type ParamUnit string + +const ( + Percent = ParamUnit("%") + Seconds = ParamUnit("s") +) diff --git a/managed/models/template_helpers.go b/managed/models/template_helpers.go index e89f749f2d..2aae1437b6 100644 --- a/managed/models/template_helpers.go +++ b/managed/models/template_helpers.go @@ -44,17 +44,15 @@ func checkUniqueTemplateName(q *reform.Querier, name string) error { } // FindTemplates returns saved notification rule templates. -func FindTemplates(q *reform.Querier) ([]Template, error) { +func FindTemplates(q *reform.Querier) ([]*Template, error) { structs, err := q.SelectAllFrom(TemplateTable, "") if err != nil { return nil, errors.Wrap(err, "failed to select notification rule templates") } - templates := make([]Template, len(structs)) + templates := make([]*Template, len(structs)) for i, s := range structs { - c := s.(*Template) //nolint:forcetypeassert - - templates[i] = *c + templates[i] = s.(*Template) //nolint:forcetypeassert } return templates, nil @@ -81,7 +79,6 @@ func FindTemplateByName(q *reform.Querier, name string) (*Template, error) { // CreateTemplateParams are params for creating new rule template. type CreateTemplateParams struct { Template *alert.Template - Yaml string Source Source } @@ -92,33 +89,13 @@ func CreateTemplate(q *reform.Querier, params *CreateTemplateParams) (*Template, return nil, status.Errorf(codes.InvalidArgument, "Invalid rule template: %v.", err) } - if err := checkUniqueTemplateName(q, params.Template.Name); err != nil { + if err := checkUniqueTemplateName(q, template.Name); err != nil { return nil, err } - p, err := ConvertParamsDefinitions(params.Template.Params) + row, err := ConvertTemplate(template, params.Source) if err != nil { - return nil, status.Errorf(codes.InvalidArgument, "Invalid rule template parameters: %v.", err) - } - - row := &Template{ - Name: template.Name, - Version: template.Version, - Summary: template.Summary, - Expr: template.Expr, - Params: p, - For: time.Duration(template.For), - Severity: Severity(template.Severity), - Source: params.Source, - Yaml: params.Yaml, - } - - if err := row.SetLabels(template.Labels); err != nil { - return nil, err - } - - if err := row.SetAnnotations(template.Annotations); err != nil { - return nil, err + return nil, status.Errorf(codes.InvalidArgument, "Failed to convert template: %v.", err) } if err = q.Insert(row); err != nil { @@ -132,7 +109,6 @@ func CreateTemplate(q *reform.Querier, params *CreateTemplateParams) (*Template, type ChangeTemplateParams struct { Template *alert.Template Name string - Yaml string } // ChangeTemplate updates existing rule template. @@ -151,6 +127,11 @@ func ChangeTemplate(q *reform.Querier, params *ChangeTemplateParams) (*Template, return nil, status.Errorf(codes.InvalidArgument, "Invalid rule template: %v.", err) } + yaml, err := alert.ToYAML([]alert.Template{*template}) + if err != nil { + return nil, errors.WithStack(err) + } + p, err := ConvertParamsDefinitions(params.Template.Params) if err != nil { return nil, status.Errorf(codes.InvalidArgument, "Invalid rule template parameters: %v.", err) @@ -163,7 +144,7 @@ func ChangeTemplate(q *reform.Querier, params *ChangeTemplateParams) (*Template, row.Params = p row.For = time.Duration(template.For) row.Severity = Severity(template.Severity) - row.Yaml = params.Yaml + row.Yaml = yaml if err = row.SetLabels(template.Labels); err != nil { return nil, err @@ -193,6 +174,40 @@ func RemoveTemplate(q *reform.Querier, name string) error { return nil } +func ConvertTemplate(template *alert.Template, source Source) (*Template, error) { + p, err := ConvertParamsDefinitions(template.Params) + if err != nil { + return nil, errors.Errorf("invalid rule template parameters: %v.", err) + } + + yaml, err := alert.ToYAML([]alert.Template{*template}) + if err != nil { + return nil, errors.WithStack(err) + } + + res := &Template{ + Name: template.Name, + Version: template.Version, + Summary: template.Summary, + Expr: template.Expr, + Params: p, + For: time.Duration(template.For), + Severity: Severity(template.Severity), + Source: source, + Yaml: yaml, + } + + if err := res.SetLabels(template.Labels); err != nil { + return nil, err + } + + if err := res.SetAnnotations(template.Annotations); err != nil { + return nil, err + } + + return res, nil +} + // ConvertParamsDefinitions converts parameters definitions to the model. func ConvertParamsDefinitions(params []alert.Parameter) (AlertExprParamsDefinitions, error) { res := make(AlertExprParamsDefinitions, 0, len(params)) @@ -200,7 +215,7 @@ func ConvertParamsDefinitions(params []alert.Parameter) (AlertExprParamsDefiniti p := AlertExprParamDefinition{ Name: param.Name, Summary: param.Summary, - Unit: string(param.Unit), + Unit: ParamUnit(param.Unit), Type: ParamType(param.Type), } diff --git a/managed/models/template_helpers_test.go b/managed/models/template_helpers_test.go index 9e7bc11465..b364ae06ba 100644 --- a/managed/models/template_helpers_test.go +++ b/managed/models/template_helpers_test.go @@ -60,7 +60,7 @@ func TestRuleTemplates(t *testing.T) { models.AlertExprParamsDefinitions{{ Name: params.Template.Params[0].Name, Summary: params.Template.Params[0].Summary, - Unit: string(params.Template.Params[0].Unit), + Unit: models.ParamUnit(params.Template.Params[0].Unit), Type: models.Float, FloatParam: &models.FloatParam{ Default: pointer.ToFloat64(params.Template.Params[0].Value.(float64)), @@ -110,7 +110,7 @@ func TestRuleTemplates(t *testing.T) { models.AlertExprParamsDefinitions{{ Name: updateParams.Template.Params[0].Name, Summary: updateParams.Template.Params[0].Summary, - Unit: string(updateParams.Template.Params[0].Unit), + Unit: models.ParamUnit(updateParams.Template.Params[0].Unit), Type: models.Float, FloatParam: &models.FloatParam{ Default: pointer.ToFloat64(updateParams.Template.Params[0].Value.(float64)), diff --git a/managed/models/template_model.go b/managed/models/template_model.go index 71dc652228..622028827a 100644 --- a/managed/models/template_model.go +++ b/managed/models/template_model.go @@ -111,7 +111,7 @@ func (p *AlertExprParamsDefinitions) Scan(src interface{}) error { return jsonSc type AlertExprParamDefinition struct { Name string `json:"name"` Summary string `json:"summary"` - Unit string `json:"unit"` + Unit ParamUnit `json:"unit"` Type ParamType `json:"type"` FloatParam *FloatParam `json:"float_param"` diff --git a/managed/services/management/alerting/service.go b/managed/services/management/alerting/service.go index 040e5188bf..47e2f23fe3 100644 --- a/managed/services/management/alerting/service.go +++ b/managed/services/management/alerting/service.go @@ -32,7 +32,6 @@ import ( "github.com/AlekSi/pointer" "github.com/percona-platform/saas/pkg/alert" "github.com/percona-platform/saas/pkg/common" - "github.com/percona/promconfig" "github.com/pkg/errors" "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" @@ -59,18 +58,6 @@ const ( dirPerm = os.FileMode(0o775) ) -// TemplateInfo represents alerting rule template information from various sources. -// -// TODO We already have models.Template, iav1beta1.Template, and alert.Template. -// -// We probably can remove that type. -type TemplateInfo struct { - alert.Template - Yaml string - Source alerting.TemplateSource - CreatedAt *time.Time -} - // Service is responsible alerting templates and rules creation from them. type Service struct { db *reform.DB @@ -81,7 +68,7 @@ type Service struct { platformPublicKeys []string rw sync.RWMutex - templates map[string]TemplateInfo + templates map[string]models.Template alerting.UnimplementedAlertingServer } @@ -108,7 +95,7 @@ func NewService(db *reform.DB, platformClient *platform.Client, grafanaClient gr grafanaClient: grafanaClient, userTemplatesPath: templatesDir, platformPublicKeys: platformPublicKeys, - templates: make(map[string]TemplateInfo), + templates: make(map[string]models.Template), } return s, nil @@ -125,11 +112,11 @@ func (s *Service) Enabled() bool { } // GetTemplates return collected templates. -func (s *Service) GetTemplates() map[string]TemplateInfo { +func (s *Service) GetTemplates() map[string]models.Template { s.rw.RLock() defer s.rw.RUnlock() - res := make(map[string]TemplateInfo, len(s.templates)) + res := make(map[string]models.Template, len(s.templates)) for n, r := range s.templates { res[n] = r } @@ -142,23 +129,27 @@ func (s *Service) GetTemplates() map[string]TemplateInfo { // User file templates: read from yaml files created by the user in `/srv/alerting/templates`. // User API templates: in the DB created using the API. func (s *Service) CollectTemplates(ctx context.Context) { + var templates []*models.Template builtInTemplates, err := s.loadTemplatesFromAssets(ctx) if err != nil { s.l.Errorf("Failed to load built-in rule templates: %s.", err) return } + templates = append(templates, builtInTemplates...) userDefinedTemplates, err := s.loadTemplatesFromUserFiles(ctx) if err != nil { s.l.Errorf("Failed to load user-defined rule templates: %s.", err) return } + templates = append(templates, userDefinedTemplates...) dbTemplates, err := s.loadTemplatesFromDB() if err != nil { s.l.Errorf("Failed to load rule templates from DB: %s.", err) return } + templates = append(templates, dbTemplates...) saasTemplates, err := s.downloadTemplates(ctx) if err != nil { @@ -166,48 +157,20 @@ func (s *Service) CollectTemplates(ctx context.Context) { // we should still collect and show the Built-In templates. s.l.Errorf("Failed to download rule templates from SaaS: %s.", err) } - - templates := make([]TemplateInfo, 0, len(builtInTemplates)+len(userDefinedTemplates)+len(dbTemplates)+len(saasTemplates)) - - for _, t := range builtInTemplates { - templates = append(templates, TemplateInfo{ - Template: t, - Source: alerting.TemplateSource_BUILT_IN, - }) - } - - for _, t := range userDefinedTemplates { - templates = append(templates, TemplateInfo{ - Template: t, - Source: alerting.TemplateSource_USER_FILE, - }) - } - - for _, t := range saasTemplates { - templates = append(templates, TemplateInfo{ - Template: t, - Source: alerting.TemplateSource_SAAS, - }) - } - - templates = append(templates, dbTemplates...) + templates = append(templates, saasTemplates...) // replace previously stored templates with newly collected ones. s.rw.Lock() defer s.rw.Unlock() - s.templates = make(map[string]TemplateInfo, len(templates)) + s.templates = make(map[string]models.Template, len(templates)) for _, t := range templates { - // TODO Check for name clashes? Allow users to re-define built-in templates? - // Reserve prefix for built-in or user-defined templates? - // https://jira.percona.com/browse/PMM-7023 - - s.templates[t.Name] = t + s.templates[t.Name] = *t } } // loadTemplatesFromAssets loads built-in alerting rule templates from pmm-managed binary's assets. -func (s *Service) loadTemplatesFromAssets(ctx context.Context) ([]alert.Template, error) { - var res []alert.Template +func (s *Service) loadTemplatesFromAssets(ctx context.Context) ([]*models.Template, error) { + var res []*models.Template walkDirFunc := func(path string, d fs.DirEntry, err error) error { if err != nil { return errors.Wrapf(err, "error occurred while traversing templates folder: %s", path) @@ -259,24 +222,28 @@ func (s *Service) loadTemplatesFromAssets(ctx context.Context) ([]alert.Template return errors.Errorf("%s %q: template should contain exactly two annotations: summary and description", path, t.Name) } - res = append(res, t) + tm, err := models.ConvertTemplate(&t, models.BuiltInSource) + if err != nil { + return errors.Wrap(err, "failed to convert alert rule template") + } + + res = append(res, tm) return nil } - err := fs.WalkDir(data.IATemplates, ".", walkDirFunc) - if err != nil { + if err := fs.WalkDir(data.IATemplates, ".", walkDirFunc); err != nil { return nil, err } return res, nil } // loadTemplatesFromUserFiles loads user's alerting rule templates from /srv/alerting/templates. -func (s *Service) loadTemplatesFromUserFiles(ctx context.Context) ([]alert.Template, error) { +func (s *Service) loadTemplatesFromUserFiles(ctx context.Context) ([]*models.Template, error) { paths, err := dir.FindFilesWithExtensions(s.userTemplatesPath, "yml", "yaml") if err != nil { return nil, errors.Wrap(err, "failed to get paths") } - res := make([]alert.Template, 0, len(paths)) + res := make([]*models.Template, 0, len(paths)) for _, path := range paths { if ctx.Err() != nil { return nil, ctx.Err() @@ -300,89 +267,39 @@ func (s *Service) loadTemplatesFromUserFiles(ctx context.Context) ([]alert.Templ } for _, t := range templates { - if err = validateUserTemplate(&t); err != nil { //nolint:gosec + t := t + if err = validateUserTemplate(&t); err != nil { s.l.Warnf("%s %s", path, err) continue } - res = append(res, t) + tm, err := models.ConvertTemplate(&t, models.UserFileSource) + if err != nil { + return nil, errors.Wrap(err, "failed to convert alert rule template") + } + + res = append(res, tm) } } return res, nil } -func (s *Service) loadTemplatesFromDB() ([]TemplateInfo, error) { - var templates []models.Template - e := s.db.InTransaction(func(tx *reform.TX) error { +func (s *Service) loadTemplatesFromDB() ([]*models.Template, error) { + var templates []*models.Template + errTx := s.db.InTransaction(func(tx *reform.TX) error { var err error templates, err = models.FindTemplates(tx.Querier) return err }) - if e != nil { - return nil, errors.Wrap(e, "failed to load rule templates from DB") + if errTx != nil { + return nil, errors.Wrap(errTx, "failed to load rule templates from DB") } - res := make([]TemplateInfo, 0, len(templates)) - for _, t := range templates { - t := t - params := make([]alert.Parameter, 0, len(t.Params)) - for _, param := range t.Params { - p := alert.Parameter{ - Name: param.Name, - Summary: param.Summary, - Unit: alert.Unit(param.Unit), - Type: alert.Type(param.Type), - } - - if alert.Type(param.Type) == alert.Float { - f := param.FloatParam - - if f.Default != nil { - p.Value = *f.Default - } - - if f.Min != nil && f.Max != nil { - p.Range = []interface{}{*f.Min, *f.Max} - } - } - - params = append(params, p) - } - - labels, err := t.GetLabels() - if err != nil { - return nil, errors.Wrap(err, "failed to load template labels") - } - - annotations, err := t.GetAnnotations() - if err != nil { - return nil, errors.Wrap(err, "failed to load template annotations") - } - - res = append(res, - TemplateInfo{ - Template: alert.Template{ - Name: t.Name, - Version: t.Version, - Summary: t.Summary, - Expr: t.Expr, - Params: params, - For: promconfig.Duration(t.For), - Severity: common.Severity(t.Severity), - Labels: labels, - Annotations: annotations, - }, - Yaml: t.Yaml, - Source: convertSource(t.Source), - CreatedAt: &t.CreatedAt, - }, - ) - } - return res, nil + return templates, nil } -// downloadTemplates downloads IA templates from SaaS. -func (s *Service) downloadTemplates(ctx context.Context) ([]alert.Template, error) { +// downloadTemplates downloads alerting templates from SaaS. +func (s *Service) downloadTemplates(ctx context.Context) ([]*models.Template, error) { settings, err := models.GetSettings(s.db) if err != nil { return nil, err @@ -415,7 +332,17 @@ func (s *Service) downloadTemplates(ctx context.Context) ([]alert.Template, erro return nil, err } - return templates, nil + res := make([]*models.Template, 0, len(templates)) + for _, t := range templates { + t := t + tm, err := models.ConvertTemplate(&t, models.SAASSource) + if err != nil { + return nil, errors.Wrap(err, "failed to convert alert rule template") + } + res = append(res, tm) + } + + return res, nil } // validateUserTemplate validates user-provided template (API or file). @@ -468,14 +395,19 @@ func convertSource(source models.Source) alerting.TemplateSource { } } -func convertParamType(t alert.Type) alerting.ParamType { - // TODO: add another types. +func convertParamType(t models.ParamType) alerting.ParamType { switch t { - case alert.Float: + case models.Float: return alerting.ParamType_FLOAT - default: - return alerting.ParamType_PARAM_TYPE_INVALID + case models.Bool: + return alerting.ParamType_BOOL + case models.String: + return alerting.ParamType_STRING } + + // do not add `default:` to make exhaustive linter do its job + + return alerting.ParamType_PARAM_TYPE_INVALID } // ListTemplates returns a list of all collected Alert Rule Templates. @@ -544,32 +476,34 @@ func (s *Service) CreateTemplate(ctx context.Context, req *alerting.CreateTempla templates, err := alert.Parse(strings.NewReader(req.Yaml), pParams) if err != nil { s.l.Errorf("failed to parse rule template form request: +%v", err) - return nil, status.Error(codes.InvalidArgument, "Failed to parse rule template.") - } - - if len(templates) != 1 { - return nil, status.Error(codes.InvalidArgument, "Request should contain exactly one rule template.") + return nil, status.Errorf(codes.InvalidArgument, "Failed to parse rule template: %v.", err) } + uniqueNames := make(map[string]struct{}, len(templates)) for _, t := range templates { + if _, ok := uniqueNames[t.Name]; ok { + return nil, status.Errorf(codes.InvalidArgument, "Template with name '%s' declared more that once.", t.Name) + } + uniqueNames[t.Name] = struct{}{} if err = validateUserTemplate(&t); err != nil { //nolint:gosec return nil, status.Errorf(codes.InvalidArgument, "%s.", err) } } - params := &models.CreateTemplateParams{ - Template: &templates[0], - Yaml: req.Yaml, - Source: models.UserAPISource, - } - - e := s.db.InTransaction(func(tx *reform.TX) error { - var err error - _, err = models.CreateTemplate(tx.Querier, params) - return err + errTx := s.db.InTransaction(func(tx *reform.TX) error { + for _, t := range templates { + t := t + if _, err = models.CreateTemplate(tx.Querier, &models.CreateTemplateParams{ + Template: &t, + Source: models.UserAPISource, + }); err != nil { + return err + } + } + return nil }) - if e != nil { - return nil, e + if errTx != nil { + return nil, errTx } s.CollectTemplates(ctx) @@ -603,7 +537,6 @@ func (s *Service) UpdateTemplate(ctx context.Context, req *alerting.UpdateTempla changeParams := &models.ChangeTemplateParams{ Template: &tmpl, Name: req.Name, - Yaml: req.Yaml, } e := s.db.InTransaction(func(tx *reform.TX) error { @@ -634,37 +567,38 @@ func (s *Service) DeleteTemplate(ctx context.Context, req *alerting.DeleteTempla return &alerting.DeleteTemplateResponse{}, nil } -func convertTemplate(l *logrus.Entry, template TemplateInfo) (*alerting.Template, error) { - var err error +func convertTemplate(l *logrus.Entry, template models.Template) (*alerting.Template, error) { + labels, err := template.GetLabels() + if err != nil { + return nil, errors.WithStack(err) + } + annotations, err := template.GetAnnotations() + if err != nil { + return nil, errors.WithStack(err) + } + t := &alerting.Template{ Name: template.Name, Summary: template.Summary, Expr: template.Expr, - Params: make([]*alerting.ParamDefinition, 0, len(template.Params)), - For: durationpb.New(time.Duration(template.For)), + Params: convertParamDefinitions(l, template.Params), + For: durationpb.New(template.For), Severity: managementpb.Severity(template.Severity), - Labels: template.Labels, - Annotations: template.Annotations, - Source: template.Source, + Labels: labels, + Annotations: annotations, + Source: convertSource(template.Source), Yaml: template.Yaml, } - if template.CreatedAt != nil { - t.CreatedAt = timestamppb.New(*template.CreatedAt) - if err = t.CreatedAt.CheckValid(); err != nil { - return nil, err - } - } - - t.Params, err = convertParamDefinitions(l, template.Params) - if err != nil { + t.CreatedAt = timestamppb.New(template.CreatedAt) + if err = t.CreatedAt.CheckValid(); err != nil { return nil, err } return t, nil } -func convertParamDefinitions(l *logrus.Entry, params []alert.Parameter) ([]*alerting.ParamDefinition, error) { +func convertParamDefinitions(l *logrus.Entry, params models.AlertExprParamsDefinitions) []*alerting.ParamDefinition { res := make([]*alerting.ParamDefinition, 0, len(params)) for _, p := range params { pd := &alerting.ParamDefinition{ @@ -674,37 +608,37 @@ func convertParamDefinitions(l *logrus.Entry, params []alert.Parameter) ([]*aler Type: convertParamType(p.Type), } - var err error switch p.Type { - case alert.Float: + case models.Float: var fp alerting.FloatParamDefinition - if p.Value != nil { - fp.Default, err = p.GetValueForFloat() - if err != nil { - return nil, errors.Wrap(err, "failed to get value for float parameter") + if p.FloatParam != nil { + if p.FloatParam.Default != nil { + fp.Default = *p.FloatParam.Default + fp.HasDefault = true + } + + if p.FloatParam.Min != nil { + fp.Min = *p.FloatParam.Min + fp.HasMin = true } - fp.HasDefault = true - } - if len(p.Range) != 0 { - fp.Min, fp.Max, err = p.GetRangeForFloat() - if err != nil { - return nil, errors.Wrap(err, "failed to get range for float parameter") + if p.FloatParam.Max != nil { + fp.Max = *p.FloatParam.Max + fp.HasMax = true } - fp.HasMin, fp.HasMax = true, true } pd.Value = &alerting.ParamDefinition_Float{Float: &fp} res = append(res, pd) - case alert.Bool, alert.String: + case models.Bool, models.String: l.Warnf("Skipping unsupported parameter type %q.", p.Type) } // do not add `default:` to make exhaustive linter do its job } - return res, nil + return res } // CreateRule creates alert rule from the given template. @@ -736,21 +670,16 @@ func (s *Service) CreateRule(ctx context.Context, req *alerting.CreateRuleReques return nil, status.Errorf(codes.NotFound, "Unknown template %s.", req.TemplateName) } - paramsDefinitions, err := models.ConvertParamsDefinitions(template.Params) - if err != nil { - return nil, err - } - paramsValues, err := convertParamsValuesToModel(req.Params) if err != nil { return nil, err } - if err := validateParameters(paramsDefinitions, paramsValues); err != nil { + if err := validateParameters(template.Params, paramsValues); err != nil { return nil, err } - forDuration := time.Duration(template.For) + forDuration := template.For if req.For != nil { forDuration = req.For.AsDuration() } @@ -771,9 +700,14 @@ func (s *Service) CreateRule(ctx context.Context, req *alerting.CreateRuleReques } } + ta, err := template.GetAnnotations() + if err != nil { + return nil, errors.Wrap(err, "failed to get template annotations") + } + // Copy annotations form template annotations := make(map[string]string) - if err = transformMaps(template.Annotations, annotations, paramsValues.AsStringMap()); err != nil { + if err = transformMaps(ta, annotations, paramsValues.AsStringMap()); err != nil { return nil, errors.Wrap(err, "failed to fill template annotations placeholders") } @@ -783,8 +717,13 @@ func (s *Service) CreateRule(ctx context.Context, req *alerting.CreateRuleReques return nil, errors.Wrap(err, "failed to fill rule labels placeholders") } + tl, err := template.GetLabels() + if err != nil { + return nil, errors.Wrap(err, "failed to get template labels") + } + // Add rule labels - if err = transformMaps(template.Labels, labels, paramsValues.AsStringMap()); err != nil { + if err = transformMaps(tl, labels, paramsValues.AsStringMap()); err != nil { return nil, errors.Wrap(err, "failed to fill template labels placeholders") } @@ -869,11 +808,11 @@ func transformMaps(src map[string]string, dest map[string]string, data map[strin return nil } -func convertParamUnit(u alert.Unit) alerting.ParamUnit { +func convertParamUnit(u models.ParamUnit) alerting.ParamUnit { switch u { - case alert.Percentage: + case models.Percent: return alerting.ParamUnit_PERCENTAGE - case alert.Seconds: + case models.Seconds: return alerting.ParamUnit_SECONDS } diff --git a/managed/services/management/ia/deps.go b/managed/services/management/ia/deps.go index 12f19bc0a4..1a9d39b33d 100644 --- a/managed/services/management/ia/deps.go +++ b/managed/services/management/ia/deps.go @@ -19,8 +19,8 @@ import ( "context" "github.com/percona/pmm/api/alertmanager/ammodels" + "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services" - "github.com/percona/pmm/managed/services/management/alerting" ) //go:generate ../../../../bin/mockery --name=alertManager --case=snake --inpackage --testonly @@ -44,5 +44,5 @@ type vmAlert interface { } type templatesService interface { - GetTemplates() map[string]alerting.TemplateInfo + GetTemplates() map[string]models.Template } diff --git a/managed/services/management/ia/mock_templates_service_test.go b/managed/services/management/ia/mock_templates_service_test.go index 11c5f28e0e..478779eda2 100644 --- a/managed/services/management/ia/mock_templates_service_test.go +++ b/managed/services/management/ia/mock_templates_service_test.go @@ -5,7 +5,7 @@ package ia import ( mock "github.com/stretchr/testify/mock" - alerting "github.com/percona/pmm/managed/services/management/alerting" + models "github.com/percona/pmm/managed/models" ) // mockTemplatesService is an autogenerated mock type for the templatesService type @@ -14,15 +14,15 @@ type mockTemplatesService struct { } // GetTemplates provides a mock function with given fields: -func (_m *mockTemplatesService) GetTemplates() map[string]alerting.TemplateInfo { +func (_m *mockTemplatesService) GetTemplates() map[string]models.Template { ret := _m.Called() - var r0 map[string]alerting.TemplateInfo - if rf, ok := ret.Get(0).(func() map[string]alerting.TemplateInfo); ok { + var r0 map[string]models.Template + if rf, ok := ret.Get(0).(func() map[string]models.Template); ok { r0 = rf() } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(map[string]alerting.TemplateInfo) + r0 = ret.Get(0).(map[string]models.Template) } } diff --git a/managed/services/management/ia/rules_service.go b/managed/services/management/ia/rules_service.go index 134b2c60a5..7ea8f672a1 100644 --- a/managed/services/management/ia/rules_service.go +++ b/managed/services/management/ia/rules_service.go @@ -22,7 +22,6 @@ import ( "os" "path/filepath" "strings" - "time" "github.com/AlekSi/pointer" "github.com/percona-platform/saas/pkg/alert" @@ -384,14 +383,18 @@ func (s *RulesService) CreateAlertRule(ctx context.Context, req *iav1beta1.Creat params.TemplateName = template.Name params.Summary = template.Summary params.ExprTemplate = template.Expr - params.DefaultFor = time.Duration(template.For) - params.DefaultSeverity = models.Severity(template.Severity) - params.Labels = template.Labels - params.Annotations = template.Annotations + params.DefaultFor = template.For + params.DefaultSeverity = template.Severity + params.ParamsDefinitions = template.Params - params.ParamsDefinitions, err = models.ConvertParamsDefinitions(template.Params) + params.Labels, err = template.GetLabels() if err != nil { - return nil, err + return nil, errors.WithStack(err) + } + + params.Annotations, err = template.GetAnnotations() + if err != nil { + return nil, errors.WithStack(err) } } else { sourceRule, err := models.FindRuleByID(s.db.Querier, req.SourceRuleId) From a4d7b3e54ad4ca14f37fd64f3774b8cda3444a41 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jul 2023 11:04:03 +0200 Subject: [PATCH 12/27] Bump eslint-plugin-import from 2.27.5 to 2.28.0 in /cli-tests (#2385) Bumps [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import) from 2.27.5 to 2.28.0. - [Release notes](https://github.com/import-js/eslint-plugin-import/releases) - [Changelog](https://github.com/import-js/eslint-plugin-import/blob/main/CHANGELOG.md) - [Commits](https://github.com/import-js/eslint-plugin-import/compare/v2.27.5...v2.28.0) --- updated-dependencies: - dependency-name: eslint-plugin-import dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 444 +++++++++++++++++++++++++++++++----- cli-tests/package.json | 2 +- 2 files changed, 387 insertions(+), 59 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index 115fcb5f9f..210ccc4ae4 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -25,7 +25,7 @@ "eslint": "8.45", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", - "eslint-plugin-import": "^2.27.5", + "eslint-plugin-import": "^2.28.0", "eslint-plugin-playwright": "^0.15.2" } }, @@ -589,6 +589,19 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-includes": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", @@ -617,6 +630,25 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", + "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", @@ -653,6 +685,38 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -784,9 +848,9 @@ "dev": true }, "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { "has-property-descriptors": "^1.0.0", @@ -840,35 +904,50 @@ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" }, "node_modules/es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -877,6 +956,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -1033,9 +1126,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -1059,26 +1152,29 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz", + "integrity": "sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==", "dev": true, "dependencies": { "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", "array.prototype.flat": "^1.3.1", "array.prototype.flatmap": "^1.3.1", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", + "eslint-module-utils": "^2.8.0", "has": "^1.0.3", - "is-core-module": "^2.11.0", + "is-core-module": "^2.12.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "resolve": "^1.22.3", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "engines": { "node": ">=4" @@ -1109,9 +1205,9 @@ } }, "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -1373,6 +1469,15 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1424,13 +1529,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -1499,6 +1605,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -1519,6 +1640,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -1566,6 +1699,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -1642,12 +1787,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.2.0", "has": "^1.0.3", "side-channel": "^1.0.4" }, @@ -1663,6 +1808,20 @@ "node": ">= 0.10" } }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -1704,9 +1863,9 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dependencies": { "has": "^1.0.3" }, @@ -1853,6 +2012,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -1865,6 +2039,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1995,9 +2175,9 @@ } }, "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2022,9 +2202,9 @@ "dev": true }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2071,6 +2251,35 @@ "node": ">= 0.4" } }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", + "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "get-intrinsic": "^1.2.1" + } + }, "node_modules/object.values": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", @@ -2295,14 +2504,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -2312,11 +2521,11 @@ } }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz", + "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.12.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -2392,6 +2601,24 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", @@ -2481,6 +2708,23 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", @@ -2584,13 +2828,13 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } @@ -2640,6 +2884,71 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", @@ -2707,6 +3016,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/cli-tests/package.json b/cli-tests/package.json index 8b11bd842b..a8bd092b6a 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -29,7 +29,7 @@ "eslint": "8.45", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", - "eslint-plugin-import": "^2.27.5", + "eslint-plugin-import": "^2.28.0", "eslint-plugin-playwright": "^0.15.2" } } From 9ae637650f2ea6f475316ecbdfea305727e6d4ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jul 2023 09:18:14 +0000 Subject: [PATCH 13/27] Bump eslint from 8.45.0 to 8.46.0 in /cli-tests (#2386) Bumps [eslint](https://github.com/eslint/eslint) from 8.45.0 to 8.46.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.45.0...v8.46.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 64 ++++++++++++++++++------------------- cli-tests/package.json | 2 +- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index 210ccc4ae4..2c156575df 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -22,7 +22,7 @@ "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^5.61.0", "@typescript-eslint/parser": "^5.62.0", - "eslint": "8.45", + "eslint": "8.46", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", "eslint-plugin-import": "^2.28.0", @@ -54,18 +54,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", - "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", + "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -86,9 +86,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", + "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -523,9 +523,9 @@ } }, "node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1009,27 +1009,27 @@ } }, "node_modules/eslint": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", - "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", + "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.1", + "@eslint/js": "^8.46.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.2", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -1242,9 +1242,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", + "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1254,9 +1254,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -1279,9 +1279,9 @@ } }, "node_modules/espree": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", - "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { "acorn": "^8.9.0", diff --git a/cli-tests/package.json b/cli-tests/package.json index a8bd092b6a..49502e8393 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -26,7 +26,7 @@ "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^5.61.0", "@typescript-eslint/parser": "^5.62.0", - "eslint": "8.45", + "eslint": "8.46", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", "eslint-plugin-import": "^2.28.0", From 6f47f057fac9ac57f07381219eea94b5ee92a649 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 31 Jul 2023 09:33:31 +0000 Subject: [PATCH 14/27] Bump @typescript-eslint/eslint-plugin from 5.61.0 to 6.2.0 in /cli-tests (#2382) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.61.0 to 6.2.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.2.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 171 +++++++++++++++++------------------- cli-tests/package.json | 2 +- 2 files changed, 82 insertions(+), 91 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index 2c156575df..1e426b5066 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -20,7 +20,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^5.61.0", + "@typescript-eslint/eslint-plugin": "^6.2.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "8.46", "eslint-config-airbnb-base": "^15.0.0", @@ -39,9 +39,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", - "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" @@ -261,32 +261,34 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz", - "integrity": "sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.2.0.tgz", + "integrity": "sha512-rClGrMuyS/3j0ETa1Ui7s6GkLhfZGKZL3ZrChLeAiACBE/tRc1wq8SNZESUuluxhLj9FkUefRs2l6bCIArWBiQ==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.61.0", - "@typescript-eslint/type-utils": "5.61.0", - "@typescript-eslint/utils": "5.61.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.2.0", + "@typescript-eslint/type-utils": "6.2.0", + "@typescript-eslint/utils": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0", "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.2.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -396,16 +398,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.61.0.tgz", - "integrity": "sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.2.0.tgz", + "integrity": "sha512-1ZMNVgm5nnHURU8ZSJ3snsHzpFeNK84rdZjluEVBGNu7jDymfqceB3kdIZ6A4xCfEFFhRIB6rF8q/JIqJd2R0Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/visitor-keys": "5.61.0" + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -413,25 +415,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.61.0.tgz", - "integrity": "sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.2.0.tgz", + "integrity": "sha512-DnGZuNU2JN3AYwddYIqrVkYW0uUQdv0AY+kz2M25euVNlujcN2u+rJgfJsBFlUEzBB6OQkUqSZPyuTLf2bP5mw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.61.0", - "@typescript-eslint/utils": "5.61.0", + "@typescript-eslint/typescript-estree": "6.2.0", + "@typescript-eslint/utils": "6.2.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -440,12 +442,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.61.0.tgz", - "integrity": "sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.2.0.tgz", + "integrity": "sha512-1nRRaDlp/XYJQLvkQJG5F3uBTno5SHPT7XVcJ5n1/k2WfNI28nJsvLakxwZRNY5spuatEKO7d5nZWsQpkqXwBA==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -453,21 +455,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.61.0.tgz", - "integrity": "sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.2.0.tgz", + "integrity": "sha512-Mts6+3HQMSM+LZCglsc2yMIny37IhUgp1Qe8yJUYVyO6rHP7/vN0vajKu3JvHCBIy8TSiKddJ/Zwu80jhnGj1w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/visitor-keys": "5.61.0", + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -480,42 +482,41 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.61.0.tgz", - "integrity": "sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.2.0.tgz", + "integrity": "sha512-RCFrC1lXiX1qEZN8LmLrxYRhOkElEsPKTVSNout8DMzf8PeWoQG7Rxz2SadpJa3VSh5oYKGwt7j7X/VRg+Y3OQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.61.0", - "@typescript-eslint/types": "5.61.0", - "@typescript-eslint/typescript-estree": "5.61.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.2.0", + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/typescript-estree": "6.2.0", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz", - "integrity": "sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.2.0.tgz", + "integrity": "sha512-QbaYUQVKKo9bgCzpjz45llCfwakyoxHetIy8CAvYCtd16Zu1KrpzNHofwF8kGkpPOxZB2o6kz+0nqH8ZkIzuoQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.61.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.2.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1228,19 +1229,6 @@ } } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/eslint-visitor-keys": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", @@ -1337,15 +1325,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -1739,9 +1718,9 @@ } }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -2634,9 +2613,9 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -2827,6 +2806,18 @@ "node": ">=8.0" } }, + "node_modules/ts-api-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", + "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", diff --git a/cli-tests/package.json b/cli-tests/package.json index 49502e8393..e50fa7f78f 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^5.61.0", + "@typescript-eslint/eslint-plugin": "^6.2.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "8.46", "eslint-config-airbnb-base": "^15.0.0", From 47d3da75a2ef0f3534ba21d21dc3357ba6e9b1bc Mon Sep 17 00:00:00 2001 From: PMM Jenkins Date: Tue, 1 Aug 2023 07:16:30 +0000 Subject: [PATCH 15/27] Update descriptors --- descriptor.bin | Bin 726545 -> 762873 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/descriptor.bin b/descriptor.bin index c3bddb1e35a91817f0e0ae20ef7eb8df260e660a..49bb49b8ead4af41119bc713bc8bda21fb4e6ff6 100644 GIT binary patch delta 128962 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 Xt+{(+PICV7MlU?*+1{t*f%N|deu`;? delta 98881 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

&0IA;!e2OE1!k@?}OYW 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 F{10Y+DWd=Y From fba350688bfe047bea6c34057418d7760b115dbe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Aug 2023 15:35:31 +0000 Subject: [PATCH 16/27] Bump github.com/go-co-op/gocron from 1.30.0 to 1.31.0 (#2387) Bumps [github.com/go-co-op/gocron](https://github.com/go-co-op/gocron) from 1.30.0 to 1.31.0. - [Release notes](https://github.com/go-co-op/gocron/releases) - [Commits](https://github.com/go-co-op/gocron/compare/v1.30.0...v1.31.0) --- updated-dependencies: - dependency-name: github.com/go-co-op/gocron dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5d3d35016a..30079bfe78 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/docker/docker v23.0.4+incompatible github.com/docker/go-connections v0.4.0 github.com/envoyproxy/protoc-gen-validate v1.0.1 - github.com/go-co-op/gocron v1.30.0 + github.com/go-co-op/gocron v1.31.0 github.com/go-openapi/errors v0.20.3 github.com/go-openapi/runtime v0.26.0 github.com/go-openapi/strfmt v0.21.7 diff --git a/go.sum b/go.sum index c420e69174..cb3af8a9c0 100644 --- a/go.sum +++ b/go.sum @@ -223,8 +223,8 @@ github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoD github.com/frankban/quicktest v1.5.0/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-co-op/gocron v1.30.0 h1:7nDCO++3HqQb+gSyd0NWRjsNbyPcK9cKVepBQWWaP6E= -github.com/go-co-op/gocron v1.30.0/go.mod h1:39f6KNSGVOU1LO/ZOoZfcSxwlsJDQOKSu8erN0SH48Y= +github.com/go-co-op/gocron v1.31.0 h1:8VaWk7ARDpsVYFP8SmjvHrBZQkcPQ7HyAzF7acG57yE= +github.com/go-co-op/gocron v1.31.0/go.mod h1:39f6KNSGVOU1LO/ZOoZfcSxwlsJDQOKSu8erN0SH48Y= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= From 0ba4c676a0825a0c8d02ab7c5a8bf3e62b6c4e01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Aug 2023 04:16:31 +0100 Subject: [PATCH 17/27] Bump modernc.org/sqlite from 1.24.0 to 1.25.0 (#2389) Bumps [modernc.org/sqlite](https://gitlab.com/cznic/sqlite) from 1.24.0 to 1.25.0. - [Commits](https://gitlab.com/cznic/sqlite/compare/v1.24.0...v1.25.0) --- updated-dependencies: - dependency-name: modernc.org/sqlite dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 30079bfe78..2bd0f1b5ea 100644 --- a/go.mod +++ b/go.mod @@ -92,7 +92,7 @@ require ( k8s.io/cli-runtime v0.27.2 k8s.io/client-go v0.27.2 k8s.io/kubectl v0.27.2 - modernc.org/sqlite v1.24.0 + modernc.org/sqlite v1.25.0 sigs.k8s.io/controller-runtime v0.14.6 ) @@ -145,9 +145,9 @@ require ( lukechampine.com/uint128 v1.2.0 // indirect modernc.org/cc/v3 v3.40.0 // indirect modernc.org/ccgo/v3 v3.16.13 // indirect - modernc.org/libc v1.22.5 // indirect + modernc.org/libc v1.24.1 // indirect modernc.org/mathutil v1.5.0 // indirect - modernc.org/memory v1.5.0 // indirect + modernc.org/memory v1.6.0 // indirect modernc.org/opt v0.1.3 // indirect modernc.org/strutil v1.1.3 // indirect modernc.org/token v1.0.1 // indirect diff --git a/go.sum b/go.sum index cb3af8a9c0..7856c33a56 100644 --- a/go.sum +++ b/go.sum @@ -1257,16 +1257,16 @@ modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= -modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE= -modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= +modernc.org/libc v1.24.1 h1:uvJSeCKL/AgzBo2yYIPPTy82v21KgGnizcGYfBHaNuM= +modernc.org/libc v1.24.1/go.mod h1:FmfO1RLrU3MHJfyi9eYYmZBfi/R+tqZ6+hQ3yQQUkak= modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= -modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.6.0 h1:i6mzavxrE9a30whzMfwf7XWVODx2r5OYXvU46cirX7o= +modernc.org/memory v1.6.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.24.0 h1:EsClRIWHGhLTCX44p+Ri/JLD+vFGo0QGjasg2/F9TlI= -modernc.org/sqlite v1.24.0/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= +modernc.org/sqlite v1.25.0 h1:AFweiwPNd/b3BoKnBOfFm+Y260guGMF+0UFk0savqeA= +modernc.org/sqlite v1.25.0/go.mod h1:FL3pVXie73rg3Rii6V/u5BoHlSoyeZeIgKZEgHARyCU= modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= From de3d7610f285901d4a6bb1a24ef8cadd6cc78b1e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Aug 2023 03:33:23 +0000 Subject: [PATCH 18/27] Bump golang.org/x/sys from 0.10.0 to 0.11.0 (#2390) Bumps [golang.org/x/sys](https://github.com/golang/sys) from 0.10.0 to 0.11.0. - [Commits](https://github.com/golang/sys/compare/v0.10.0...v0.11.0) --- updated-dependencies: - dependency-name: golang.org/x/sys dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2bd0f1b5ea..cbc2e05b45 100644 --- a/go.mod +++ b/go.mod @@ -76,7 +76,7 @@ require ( go.starlark.net v0.0.0-20230717150657-8a3343210976 golang.org/x/crypto v0.11.0 golang.org/x/sync v0.3.0 - golang.org/x/sys v0.10.0 + golang.org/x/sys v0.11.0 golang.org/x/text v0.11.0 golang.org/x/tools v0.11.0 google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc diff --git a/go.sum b/go.sum index 7856c33a56..999af02ed5 100644 --- a/go.sum +++ b/go.sum @@ -1004,8 +1004,8 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= From d3eb708658c74b6bab4495783b02be604ed74371 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Aug 2023 03:54:09 +0000 Subject: [PATCH 19/27] Bump golang.org/x/text from 0.11.0 to 0.12.0 (#2391) Bumps [golang.org/x/text](https://github.com/golang/text) from 0.11.0 to 0.12.0. - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.11.0...v0.12.0) --- updated-dependencies: - dependency-name: golang.org/x/text dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index cbc2e05b45..f849fb08ab 100644 --- a/go.mod +++ b/go.mod @@ -77,7 +77,7 @@ require ( golang.org/x/crypto v0.11.0 golang.org/x/sync v0.3.0 golang.org/x/sys v0.11.0 - golang.org/x/text v0.11.0 + golang.org/x/text v0.12.0 golang.org/x/tools v0.11.0 google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc diff --git a/go.sum b/go.sum index 999af02ed5..b72218de6d 100644 --- a/go.sum +++ b/go.sum @@ -1024,8 +1024,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 5a0c0022a191c4c05e20fa84543b6993fb6eb9d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Aug 2023 12:15:11 +0200 Subject: [PATCH 20/27] Bump golang.org/x/tools from 0.11.0 to 0.12.0 in /tools (#2397) Bumps [golang.org/x/tools](https://github.com/golang/tools) from 0.11.0 to 0.12.0. - [Release notes](https://github.com/golang/tools/releases) - [Commits](https://github.com/golang/tools/compare/v0.11.0...v0.12.0) --- updated-dependencies: - dependency-name: golang.org/x/tools dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/go.mod | 12 ++++++------ tools/go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/tools/go.mod b/tools/go.mod index 060dd70031..3da065a5c1 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -22,7 +22,7 @@ require ( github.com/vburenin/ifacemaker v1.2.1 github.com/vektra/mockery/v2 v2.32.0 golang.org/x/perf v0.0.0-20211012211434-03971e389cd3 - golang.org/x/tools v0.11.0 + golang.org/x/tools v0.12.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 google.golang.org/protobuf v1.31.0 gopkg.in/reform.v1 v1.5.1 @@ -182,15 +182,15 @@ require ( go.uber.org/zap v1.24.0 // indirect golang.org/x/arch v0.0.0-20190927153633-4e8777c89be4 // indirect golang.org/x/build v0.0.0-20200616162219-07bebbe343e9 // indirect - golang.org/x/crypto v0.11.0 // indirect + golang.org/x/crypto v0.12.0 // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.12.0 // indirect + golang.org/x/net v0.14.0 // indirect golang.org/x/oauth2 v0.8.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.10.0 // indirect - golang.org/x/term v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/term v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect golang.org/x/time v0.1.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.114.0 // indirect diff --git a/tools/go.sum b/tools/go.sum index e0d214b5ec..ae3aa461d9 100644 --- a/tools/go.sum +++ b/tools/go.sum @@ -775,8 +775,8 @@ golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220518034528-6f7dac969898/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -858,8 +858,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220517181318-183a9ca12b87/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/oauth2 v0.0.0-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -953,13 +953,13 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220906165534-d0df966e6959/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -969,8 +969,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1036,8 +1036,8 @@ golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8= -golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= +golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= +golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 09d8738db6bf953c242c340bc8918dd9dacb1943 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Aug 2023 11:10:14 +0000 Subject: [PATCH 21/27] Bump golang.org/x/tools from 0.11.0 to 0.12.0 (#2394) Bumps [golang.org/x/tools](https://github.com/golang/tools) from 0.11.0 to 0.12.0. - [Release notes](https://github.com/golang/tools/releases) - [Commits](https://github.com/golang/tools/compare/v0.11.0...v0.12.0) --- updated-dependencies: - dependency-name: golang.org/x/tools dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index f849fb08ab..d8d3744db3 100644 --- a/go.mod +++ b/go.mod @@ -74,11 +74,11 @@ require ( github.com/stretchr/testify v1.8.4 go.mongodb.org/mongo-driver v1.12.0 go.starlark.net v0.0.0-20230717150657-8a3343210976 - golang.org/x/crypto v0.11.0 + golang.org/x/crypto v0.12.0 golang.org/x/sync v0.3.0 golang.org/x/sys v0.11.0 golang.org/x/text v0.12.0 - golang.org/x/tools v0.11.0 + golang.org/x/tools v0.12.0 google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc google.golang.org/grpc v1.57.0-dev @@ -253,9 +253,9 @@ require ( go.opentelemetry.io/otel v1.16.0 // indirect go.opentelemetry.io/otel/trace v1.16.0 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.12.0 // indirect + golang.org/x/net v0.14.0 // indirect golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/term v0.10.0 // indirect + golang.org/x/term v0.11.0 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gotest.tools/v3 v3.3.0 // indirect diff --git a/go.sum b/go.sum index b72218de6d..95a51376a2 100644 --- a/go.sum +++ b/go.sum @@ -919,8 +919,8 @@ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1010,8 +1010,8 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1086,8 +1086,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8= -golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= +golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= +golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 99b4901c6638d1cafe0b57e5d15a359684603045 Mon Sep 17 00:00:00 2001 From: Nurlan Moldomurov Date: Tue, 11 Jul 2023 17:56:00 +0300 Subject: [PATCH 22/27] PMM-12293 fix platform auth. (#2359) * PMM-12293 fix platform auth. * Update managed/services/supervisord/supervisord.go * Update managed.yml * Update managed.yml * Update managed.yml --- managed/services/supervisord/supervisord.go | 1 + 1 file changed, 1 insertion(+) diff --git a/managed/services/supervisord/supervisord.go b/managed/services/supervisord/supervisord.go index 64401b5192..40f7e21061 100644 --- a/managed/services/supervisord/supervisord.go +++ b/managed/services/supervisord/supervisord.go @@ -793,6 +793,7 @@ command = cfg:default.auth.generic_oauth.api_url="{{ .PerconaSSODetails.IssuerURL }}/userinfo" cfg:default.auth.generic_oauth.role_attribute_path="(contains(portal_admin_orgs[*], '{{ .PerconaSSODetails.OrganizationID }}') || contains(pmm_demo_ids[*], '{{ .PMMServerID }}')) && 'Admin' || 'Viewer'" cfg:default.auth.generic_oauth.use_pkce="true" + cfg:default.auth.oauth_allow_insecure_email_lookup="true" {{- end}} environment = PERCONA_TEST_POSTGRES_ADDR="{{ .PostgresAddr }}", From 6a12659ed2d0c898f87aa1f38bcededf41f76b3a Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Tue, 8 Aug 2023 16:24:15 +0300 Subject: [PATCH 23/27] PMM-12393 can't login to PMM with SSO (#2398) * PMM-12393 can't login to PMM with SSO * PMM-12393 remove the domain value form grafana.ini --- update/ansible/playbook/tasks/roles/grafana/files/grafana.ini | 2 -- 1 file changed, 2 deletions(-) diff --git a/update/ansible/playbook/tasks/roles/grafana/files/grafana.ini b/update/ansible/playbook/tasks/roles/grafana/files/grafana.ini index 801ff835a9..21b4240ccd 100644 --- a/update/ansible/playbook/tasks/roles/grafana/files/grafana.ini +++ b/update/ansible/playbook/tasks/roles/grafana/files/grafana.ini @@ -23,8 +23,6 @@ format = console [server] # enable gzip enable_gzip = true -# The public facing domain name used to access grafana from a browser -domain = 127.0.0.1 # The full public facing url root_url = https://%(domain)s/graph From 1b80abb40ccdd36f4e90c12206a75e370d61dd8a Mon Sep 17 00:00:00 2001 From: Nurlan Moldomurov Date: Tue, 8 Aug 2023 18:51:14 +0300 Subject: [PATCH 24/27] Revert "PMM-12175 Revert #2017 Migrate Grafana to Postgres (#2272)" (#2400) This reverts commit 8493ee099f7992b177e99c85fb7f0c3a0b9efff6. --- .../ansible/roles/pmm2-images/tasks/main.yml | 13 +- .../rpm/server/SPECS/grafana-db-migrator.spec | 3 +- build/scripts/build-server-rpm-all | 2 + .../tasks/roles/grafana/files/grafana.ini | 12 ++ .../tasks/roles/grafana/tasks/main.yml | 36 ++++++ .../tasks/roles/initialization/tasks/main.yml | 37 ++++++ .../roles/sqlite-to-postgres/tasks/main.yml | 122 ++++++++++++++++++ update/ansible/playbook/tasks/update.yml | 33 +++++ 8 files changed, 250 insertions(+), 8 deletions(-) create mode 100644 update/ansible/playbook/tasks/roles/sqlite-to-postgres/tasks/main.yml diff --git a/build/ansible/roles/pmm2-images/tasks/main.yml b/build/ansible/roles/pmm2-images/tasks/main.yml index 9787ed845f..f7812a6328 100644 --- a/build/ansible/roles/pmm2-images/tasks/main.yml +++ b/build/ansible/roles/pmm2-images/tasks/main.yml @@ -29,7 +29,7 @@ # local yum repo for building of pmm server docker image in autobuild jobs - name: PMM | Add local YUM repository - when: ansible_virtualization_type == "docker" + when: ansible_virtualization_type == "docker" yum_repository: name: local description: Local YUM repository - x86_64 @@ -104,11 +104,11 @@ group: "{{ item.group }}" non_unique: true loop: - - { name: pmm, uid: 1000, comment: "PMM Server", shell: "/bin/false", home: "/home/pmm", group: pmm } - - { name: nginx, uid: 999, comment: "nginx user", shell: "/sbin/nologin", home: "/var/cache/nginx", group: nginx } - - { name: grafana, uid: 998, comment: "Grafana Dashboard", shell: "/sbin/nologin", home: "/etc/grafana", group: grafana } - - { name: clickhouse, uid: 997, comment: "Clickhouse server", shell: "/sbin/nologin", home: "/var/lib/clickhouse", group: clickhouse } - - { name: pmm-agent, uid: 996, comment: "pmm-agent", shell: "/bin/false", home: "/usr/local/percona/", group: pmm-agent } + - { name: pmm, uid: 1000, comment: "PMM Server", shell: "/bin/false", home: "/home/pmm", group: pmm, } + - { name: nginx, uid: 999, comment: "nginx user", shell: "/sbin/nologin", home: "/var/cache/nginx", group: nginx, } + - { name: grafana, uid: 998, comment: "Grafana Dashboard", shell: "/sbin/nologin", home: "/etc/grafana", group: grafana, } + - { name: clickhouse, uid: 997, comment: "Clickhouse server", shell: "/sbin/nologin", home: "/var/lib/clickhouse", group: clickhouse, } + - { name: pmm-agent, uid: 996, comment: "pmm-agent", shell: "/bin/false", home: "/usr/local/percona/", group: pmm-agent, } when: ansible_virtualization_type == "docker" - name: Create directories | Create dirs @@ -149,6 +149,7 @@ - pmm-update - dbaas-controller - dbaas-tools + - grafana-db-migrator - pmm-dump - vmproxy state: installed diff --git a/build/packages/rpm/server/SPECS/grafana-db-migrator.spec b/build/packages/rpm/server/SPECS/grafana-db-migrator.spec index 303924aba5..70de6bd075 100644 --- a/build/packages/rpm/server/SPECS/grafana-db-migrator.spec +++ b/build/packages/rpm/server/SPECS/grafana-db-migrator.spec @@ -46,5 +46,4 @@ install -m 755 dist/grafana-db-migrator %{buildroot}%{_sbindir}/ - Add fixes for CHAR fields * Tue Nov 02 2021 Nikita Beletskii - 1.0.1-1 -- Creating package for grafana-db-migrator - +- Creating package for grafana-db-migrator \ No newline at end of file diff --git a/build/scripts/build-server-rpm-all b/build/scripts/build-server-rpm-all index 113937db22..d9cb1a59a2 100755 --- a/build/scripts/build-server-rpm-all +++ b/build/scripts/build-server-rpm-all @@ -12,11 +12,13 @@ ${bin_dir}/build-server-rpm pmm-update pmm ${bin_dir}/build-server-rpm dbaas-controller ${bin_dir}/build-server-rpm dbaas-tools ${bin_dir}/build-server-rpm pmm-dump +${bin_dir}/build-server-rpm grafana-db-migrator ${bin_dir}/build-server-rpm vmproxy pmm # 3rd-party ${bin_dir}/build-server-rpm victoriametrics ${bin_dir}/build-server-rpm alertmanager ${bin_dir}/build-server-rpm grafana +# ${bin_dir}/build-server-rpm grafana-db-migrator # vim: expandtab shiftwidth=4 tabstop=4 diff --git a/update/ansible/playbook/tasks/roles/grafana/files/grafana.ini b/update/ansible/playbook/tasks/roles/grafana/files/grafana.ini index 21b4240ccd..10318273f2 100644 --- a/update/ansible/playbook/tasks/roles/grafana/files/grafana.ini +++ b/update/ansible/playbook/tasks/roles/grafana/files/grafana.ini @@ -1,6 +1,18 @@ ##################### Grafana Configuration ##################### # Only changed settings. You can find default settings in /usr/share/grafana/conf/defaults.ini +#################################### Database #################################### +[database] +# You can configure the database connection by specifying type, host, name, user and password +# as separate properties or as on string using the url properties. + +# Either "mysql", "postgres" or "sqlite3", it's your choice +type = postgres +host = localhost +user = grafana +# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;""" +password = grafana + [paths] # Directory where grafana will automatically scan and look for plugins plugins = /srv/grafana/plugins diff --git a/update/ansible/playbook/tasks/roles/grafana/tasks/main.yml b/update/ansible/playbook/tasks/roles/grafana/tasks/main.yml index 405ed30a00..a617876a55 100644 --- a/update/ansible/playbook/tasks/roles/grafana/tasks/main.yml +++ b/update/ansible/playbook/tasks/roles/grafana/tasks/main.yml @@ -23,6 +23,42 @@ group: grafana mode: "0444" +- name: Check that the SQLite grafana database exists + stat: + path: /srv/grafana/grafana.db + register: sqlite_grafana + +- name: Temporary change database to SQLite + block: + - name: Remove database options (SQLite is default) + ini_file: + dest: /etc/grafana/grafana.ini + section: database + option: type + value: absent + + - name: Remove database host + ini_file: + dest: /etc/grafana/grafana.ini + section: database + option: host + state: absent + + - name: Remove database user + ini_file: + dest: /etc/grafana/grafana.ini + section: database + option: user + state: absent + + - name: Remove database password + ini_file: + dest: /etc/grafana/grafana.ini + section: database + option: password + state: absent + when: sqlite_grafana.stat.exists + - name: Create provisioning directory file: path: "/usr/share/grafana/conf/provisioning/{{ item }}" diff --git a/update/ansible/playbook/tasks/roles/initialization/tasks/main.yml b/update/ansible/playbook/tasks/roles/initialization/tasks/main.yml index 7957b96ee6..888d71ef64 100644 --- a/update/ansible/playbook/tasks/roles/initialization/tasks/main.yml +++ b/update/ansible/playbook/tasks/roles/initialization/tasks/main.yml @@ -1,5 +1,10 @@ --- # This role contains tasks executed during initialization of PMM Server +- name: Determine type of upgrade + set_fact: + ui_upgrade: False + when: ui_upgrade is undefined + # PMM-10858 - In certain environments, including AWS EC2, some of the # EPEL repository mirrors do not respond within the time limit defined @@ -65,3 +70,35 @@ include_role: name: postgres when: is_postgres_11.stat.exists + +- name: Create grafana database in postgres + postgresql_db: + name: grafana + state: present + +- name: Create grafana user in postgres + postgresql_user: + db: grafana + name: grafana + password: grafana + priv: 'ALL' + expires: infinity + state: present + when: not ansible_check_mode + +- name: Run SQLite -> Postgres only for docker upgrade + block: + - name: Check that the SQLite grafana database exists + stat: + path: /srv/grafana/grafana.db + register: is_database_sqlite + + - name: Migrate Grafana database from SQLite to Postgresql + include_role: + name: sqlite-to-postgres + when: is_database_sqlite.stat.exists + tags: + - skip_ansible_lint # '503 Tasks that run when changed should likely be handlers'. + # We use current_version_file['failed'] because we don't want to run this on creating container + when: not ui_upgrade and current_version_file['failed'] == false + diff --git a/update/ansible/playbook/tasks/roles/sqlite-to-postgres/tasks/main.yml b/update/ansible/playbook/tasks/roles/sqlite-to-postgres/tasks/main.yml new file mode 100644 index 0000000000..d8f6b90937 --- /dev/null +++ b/update/ansible/playbook/tasks/roles/sqlite-to-postgres/tasks/main.yml @@ -0,0 +1,122 @@ +--- +- name: Create Grafana backup dir + file: + path: "/srv/backup/grafana" + state: directory + owner: grafana + group: grafana + mode: '0700' + +- name: Stop grafana before upgrade + supervisorctl: + name: 'grafana' + state: stopped + +- name: Create backup for SQLite Grafana database + copy: + src: /srv/grafana/grafana.db + dest: "/srv/backup/grafana/grafana.db" + owner: grafana + group: grafana + mode: '0700' + +- name: Remove all ` symbols in grafana dashboard description + command: sqlite3 /srv/grafana/grafana.db -cmd ".timeout 60000" "UPDATE dashboard SET data = REPLACE(data, '`', '');" + changed_when: True + +- name: Disable provisioning before change database + ini_file: + dest: /etc/grafana/grafana.ini + section: paths + option: provisioning + value: conf/provisioning_disable + +- name: Switch to postgres + ini_file: + dest: /etc/grafana/grafana.ini + section: database + option: type + value: postgres + +- name: Set database host + ini_file: + dest: /etc/grafana/grafana.ini + section: database + option: host + value: localhost + +- name: Set database user + ini_file: + dest: /etc/grafana/grafana.ini + section: database + option: user + value: grafana + +- name: Set database password + ini_file: + dest: /etc/grafana/grafana.ini + section: database + option: password + value: grafana + +- name: Start grafana again + supervisorctl: + name: grafana + state: restarted + ignore_errors: yes + +- name: Check if initial data were created + postgresql_query: + db: grafana + query: SELECT 1 FROM org WHERE id=1 + retries: 3 + delay: 3 + register: psql_result + until: psql_result.rowcount == 1 + when: not ansible_check_mode + +- name: Wait for grafana database initialization + pause: + seconds: 10 + +- name: Stop grafana before upgrade + supervisorctl: + name: grafana + state: stopped + +- name: Remove default admin user + postgresql_query: + db: grafana + query: DELETE FROM public.user WHERE login='admin' + when: not ansible_check_mode + +- name: Run grafana migrator + command: grafana-db-migrator --change-char-to-text /srv/grafana/grafana.db "postgres://grafana:grafana@localhost:5432/grafana?sslmode=disable" + register: migrator_output + changed_when: "'All done' in migrator_output.stdout" + +- name: Enable provisioning after change database + ini_file: + dest: /etc/grafana/grafana.ini + section: paths + option: provisioning + value: conf/provisioning + +- name: Start grafana again + supervisorctl: + name: grafana + state: restarted + +- name: Wait for grafana initialization + pause: + seconds: 5 + +- name: Fix database/folder relationship + command: grafana-db-migrator --fix-folders-id /srv/grafana/grafana.db "postgres://grafana:grafana@localhost:5432/grafana?sslmode=disable" + register: migrator_output + changed_when: "'All done' in migrator_output.stdout" + +- name: Remove SQLite Grafana database + file: + path: /srv/grafana/grafana.db + state: absent diff --git a/update/ansible/playbook/tasks/update.yml b/update/ansible/playbook/tasks/update.yml index 48432dd482..df4cd7b7c2 100644 --- a/update/ansible/playbook/tasks/update.yml +++ b/update/ansible/playbook/tasks/update.yml @@ -20,6 +20,7 @@ - pmm2-client - pmm-dump - vmproxy + - grafana-db-migrator pre_tasks: - name: detect /srv/pmm-distribution stat: @@ -149,9 +150,16 @@ when: is_docker and not is_supervisor_running.stat.exists and (ansible_distribution == 'OracleLinux' or ansible_distribution == 'AlmaLinux') and ansible_distribution_major_version == '9' shell: /usr/local/bin/supervisord -c /etc/supervisord.conf & + - name: Wait until postgres port is present before continuing + wait_for: + host: localhost + port: 5432 + - name: Run initialization playbook include_role: name: initialization + vars: + ui_upgrade: True - name: Enable crond service when: not is_docker @@ -415,6 +423,29 @@ - name: Print other services's logs debug: var=update_result.stdout_lines + - name: Check that the SQLite grafana database exists + stat: + path: /srv/grafana/grafana.db + register: is_database_sqlite + + - name: Migrate Grafana database from SQLite to Postgresql + include_role: + name: sqlite-to-postgres + when: is_database_sqlite.stat.exists + tags: + - skip_ansible_lint # '503 Tasks that run when changed should likely be handlers'. + + - name: Fix grafana fields type + postgresql_query: + db: grafana + query: "{{ item }}" + loop: + - ALTER TABLE tag ALTER COLUMN key TYPE text; + - ALTER TABLE tag ALTER COLUMN value TYPE text; + - ALTER TABLE api_key ALTER COLUMN key TYPE text; + - ALTER TABLE api_key ALTER COLUMN name TYPE text; + when: not ansible_check_mode + # SIGUSR2 is sent to supervisord by pmm-managed right before the update for logging to work correctly. # We use that fact to show what was restarted during the update. - name: Get supervisord logs EL7 @@ -436,3 +467,5 @@ file: state: absent path: /var/cache/yum + + From ac9bb81a8c6ef92efb876e13a06d70ba0d4697ce Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Wed, 9 Aug 2023 11:19:09 +0300 Subject: [PATCH 25/27] PMM-4817 move git tags script to pmm (#2376) * PMM-4817 move create-tags script to pmm * PMM-4817 update the notes * PMM-4817 add more comments * PMM-4817 add popd before continue * PMM-4817 use pmm-submodules vs distinct repos * PMM-4817 clone a specific branch, not main * PMM-4817 update the description * PMM-4817 do not delete the directory if it exists * PMM-4817 popd on push failure --- build/scripts/create-tags | 77 ++++++++++++++++++++++++++++++++++++ build/scripts/create-tags.py | 48 ---------------------- 2 files changed, 77 insertions(+), 48 deletions(-) create mode 100755 build/scripts/create-tags delete mode 100755 build/scripts/create-tags.py diff --git a/build/scripts/create-tags b/build/scripts/create-tags new file mode 100755 index 0000000000..e8910f22c6 --- /dev/null +++ b/build/scripts/create-tags @@ -0,0 +1,77 @@ +#!/bin/bash +# Important: This script should never cause the pipeline to fail, so that the tags can be created outside of it. +# To run it locally, you need pass the version, i.e. export VERSION=2.39.x +# If run locally, it: +# - clones pmm-submodules repository and checks out the branch corresponding to the version +# - skips git ssh configuration and expects the user to set it up ahead of time +# - uses the current user's creds and email to push tags to the repos, therefore sufficient git permissions are required + +set +o errexit +set +o nounset +set -o xtrace + +# List of repositories whose release branches need to be tagged +declare repos=( + "sources/pmm/src/github.com/percona/pmm" + "sources/grafana/src/github.com/grafana/grafana" + "sources/grafana-dashboards" + "." +) + +# These setting are only needed when running in CI (Jenkins or github actions) +if [ -n "$CI" ]; then + # Configure git settings globally + git config --global advice.detachedHead false + git config --global user.email "noreply@percona.com" + git config --global user.name "PMM Jenkins" + + # Configure git to push using ssh + export GIT_SSH_COMMAND="/usr/bin/ssh -i ${SSHKEY} -o StrictHostKeyChecking=no -o LogLevel=error -o UserKnownHostsFile=/dev/null" +fi + +TAG="v${VERSION}" +echo "We will be tagging repos with a tag: $TAG" + +REPO_DIR=pmm-submodules +if [ -d "$REPO_DIR" ]; then + echo "Error: the directory $REPO_DIR already exists, exiting..." + exit 0 # this is on purpose, we don't want to fail the pipeline +fi + +if ! git clone --branch "pmm-${VERSION}" --single-branch https://github.com/Percona-Lab/pmm-submodules "$REPO_DIR"; then + echo "Fatal: failed to clone pmm-submodules, branch pmm-${VERSION}" + exit 0 +fi + +cd "$REPO_DIR" >/dev/null +git submodule update + +for REPO in "${repos[@]}"; do + pushd "$REPO" >/dev/null + # git remote set-url origin git@github.com:${REPO}.git + echo "SHA: $(git rev-parse HEAD)" + + # If the tag already exists, we want to delete it and re-tag this SHA + if git tag -l "$TAG"; then + echo "Fatal: tag $TAG already exists in $REPO, exiting..." + break + fi + + if [ -n "$CI" ]; then + # We can't sign tags in CI, so we create them without signing + git tag --message="Version $VERSION." "$TAG" + else + git tag --message="Version $VERSION." --sign "$TAG" + fi + if ! git push origin "$TAG"; then + echo "Fatal: failed to tag the repository $REPO with $TAG, exiting..." + popd >/dev/null + break + fi + popd >/dev/null +done + +git submodule status +cd - +rm -rf "$REPO_DIR" +unset repos diff --git a/build/scripts/create-tags.py b/build/scripts/create-tags.py deleted file mode 100755 index a8c3a426eb..0000000000 --- a/build/scripts/create-tags.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/python2 - -from __future__ import print_function, unicode_literals -import os, subprocess, time - -REPOS = [ - "sources/pmm/src/github.com/percona/pmm", - "sources/dbaas-controller/src/github.com/percona-platform/dbaas-controller", - "sources/pmm-dump", - "sources/pmm-qa/src/github.com/percona/pmm-qa", - "sources/pmm-ui-tests/src/github.com/percona/pmm-ui-tests", - "sources/grafana/src/github.com/grafana/grafana", - "sources/grafana-dashboards", - "sources/node_exporter/src/github.com/prometheus/node_exporter", - "sources/mysqld_exporter/src/github.com/percona/mysqld_exporter", - "sources/mongodb_exporter/src/github.com/percona/mongodb_exporter", - "sources/postgres_exporter/src/github.com/percona/postgres_exporter", - "sources/clickhouse_exporter/src/github.com/Percona-Lab/clickhouse_exporter", - "sources/proxysql_exporter/src/github.com/percona/proxysql_exporter", - "sources/rds_exporter/src/github.com/percona/rds_exporter", - "sources/azure_metrics_exporter/src/github.com/percona/azure_metrics_exporter", - ".", -] - -tty = subprocess.check_output("tty", shell=True).strip() -env = os.environ.copy() -env["GPG_TTY"] = tty - -with open("./VERSION", "r") as f: - version = f.read().strip() - -print(tty, version) - -subprocess.check_call("git submodule update", shell=True) - -for repo in REPOS: - print("==>", repo) - - tag = "v" + version - cmd = "git tag --message='Version {version}.' --sign {tag}".format(version=version, tag=tag) - print(">", cmd) - subprocess.check_call(cmd, shell=True, cwd=repo, env=env) - - cmd = "git push origin {tag}".format(tag=tag) - print(">", cmd) - subprocess.check_call(cmd, shell=True, cwd=repo) - -subprocess.check_call("git submodule status", shell=True) From fa6b6938e4947015faf158db77c1790dd0c6de89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Wed, 9 Aug 2023 12:38:57 +0200 Subject: [PATCH 26/27] PMM-12338 Remove forced colors in logger with global utils folder. (#2399) * PMM-12338 Remove forced colors in logger. * PMM-12338 Move logger into global utils folder. * PMM-12338 Format. * PMM-12338 Lint. * PMM-12338 Refactor. --- agent/cmd/pmm-agent-entrypoint/main.go | 8 +++--- agent/main.go | 26 ++----------------- managed/cmd/pmm-managed-init/main.go | 2 +- managed/cmd/pmm-managed-starlark/main.go | 2 +- managed/cmd/pmm-managed/main.go | 2 +- managed/services/agents/channel/channel.go | 2 +- managed/services/agents/connection_checker.go | 2 +- managed/services/agents/handler.go | 2 +- managed/services/agents/registry.go | 2 +- managed/services/agents/state.go | 2 +- managed/services/grafana/auth_server_test.go | 2 +- managed/services/inventory/agents.go | 2 +- .../services/inventory/inventory_metrics.go | 2 +- managed/services/inventory/services_test.go | 2 +- managed/services/management/agent_test.go | 2 +- .../services/management/annotation_test.go | 2 +- managed/services/management/azure_database.go | 2 +- .../dbaas/components_service_test.go | 2 +- .../dbaas/db_cluster_service_test.go | 2 +- .../dbaas/kubernetes_server_test.go | 2 +- .../dbaas/psmdb_cluster_service_test.go | 2 +- .../dbaas/pxc_cluster_service_test.go | 2 +- managed/services/management/node_mgmt_test.go | 2 +- managed/services/management/node_test.go | 2 +- managed/services/management/rds.go | 2 +- managed/services/management/rds_test.go | 2 +- managed/services/management/role_test.go | 2 +- .../services/management/service_mgmt_test.go | 2 +- managed/services/management/service_test.go | 2 +- managed/services/qan/client_test.go | 2 +- managed/services/supervisord/logs.go | 2 +- managed/services/supervisord/logs_test.go | 2 +- managed/services/vmalert/init_test.go | 2 +- managed/utils/interceptors/interceptors.go | 2 +- qan-api2/main.go | 24 ++--------------- {managed/utils => utils}/logger/global.go | 4 +-- {managed/utils => utils}/logger/grpc.go | 0 {managed/utils => utils}/logger/logger.go | 0 38 files changed, 40 insertions(+), 86 deletions(-) rename {managed/utils => utils}/logger/global.go (90%) rename {managed/utils => utils}/logger/grpc.go (100%) rename {managed/utils => utils}/logger/logger.go (100%) diff --git a/agent/cmd/pmm-agent-entrypoint/main.go b/agent/cmd/pmm-agent-entrypoint/main.go index 6004cd126f..001d7208a8 100644 --- a/agent/cmd/pmm-agent-entrypoint/main.go +++ b/agent/cmd/pmm-agent-entrypoint/main.go @@ -28,6 +28,8 @@ import ( "github.com/sirupsen/logrus" "golang.org/x/sys/unix" "gopkg.in/alecthomas/kingpin.v2" + + "github.com/percona/pmm/utils/logger" ) var helpText = ` @@ -131,11 +133,7 @@ func main() { var status int - logrus.SetFormatter(&logrus.TextFormatter{ - ForceColors: true, - FullTimestamp: true, - TimestampFormat: "2006-01-02T15:04:05.000-07:00", - }) + logger.SetupGlobalLogger() l := logrus.WithField("component", "entrypoint") diff --git a/agent/main.go b/agent/main.go index 0a5ea9a0dc..155ddae61d 100644 --- a/agent/main.go +++ b/agent/main.go @@ -15,15 +15,11 @@ package main import ( - "fmt" - "path/filepath" - "runtime" - - "github.com/sirupsen/logrus" "gopkg.in/alecthomas/kingpin.v2" "github.com/percona/pmm/agent/commands" "github.com/percona/pmm/agent/config" + "github.com/percona/pmm/utils/logger" "github.com/percona/pmm/version" ) @@ -33,25 +29,7 @@ func main() { panic("pmm-agent version is not set during build.") } - // we don't have configuration options for formatter, so set it once there - logrus.SetFormatter(&logrus.TextFormatter{ - // Enable multiline-friendly formatter in both development (with terminal) and production (without terminal): - // https://github.com/sirupsen/logrus/blob/839c75faf7f98a33d445d181f3018b5c3409a45e/text_formatter.go#L176-L178 - ForceColors: true, - FullTimestamp: true, - TimestampFormat: "2006-01-02T15:04:05.000-07:00", - - CallerPrettyfier: func(f *runtime.Frame) (string, string) { - _, function := filepath.Split(f.Function) - - // keep a single directory name as a compromise between brevity and unambiguity - dir, file := filepath.Split(f.File) - dir = filepath.Base(dir) - file = fmt.Sprintf("%s/%s:%d", dir, file, f.Line) - - return function, file - }, - }) + logger.SetupGlobalLogger() // check that command-line flags and environment variables are correct, // parse command, but do try not load config file diff --git a/managed/cmd/pmm-managed-init/main.go b/managed/cmd/pmm-managed-init/main.go index f04f7efe0a..92b0039620 100644 --- a/managed/cmd/pmm-managed-init/main.go +++ b/managed/cmd/pmm-managed-init/main.go @@ -24,7 +24,7 @@ import ( "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services/supervisord" "github.com/percona/pmm/managed/utils/envvars" - "github.com/percona/pmm/managed/utils/logger" + "github.com/percona/pmm/utils/logger" ) func main() { diff --git a/managed/cmd/pmm-managed-starlark/main.go b/managed/cmd/pmm-managed-starlark/main.go index 5c23efab3e..bf55e01577 100644 --- a/managed/cmd/pmm-managed-starlark/main.go +++ b/managed/cmd/pmm-managed-starlark/main.go @@ -33,7 +33,7 @@ import ( "github.com/percona/pmm/api/agentpb" "github.com/percona/pmm/managed/services/checks" - "github.com/percona/pmm/managed/utils/logger" + "github.com/percona/pmm/utils/logger" "github.com/percona/pmm/version" ) diff --git a/managed/cmd/pmm-managed/main.go b/managed/cmd/pmm-managed/main.go index 2eac6ed7cf..64faf965b1 100644 --- a/managed/cmd/pmm-managed/main.go +++ b/managed/cmd/pmm-managed/main.go @@ -107,9 +107,9 @@ import ( "github.com/percona/pmm/managed/utils/clean" "github.com/percona/pmm/managed/utils/envvars" "github.com/percona/pmm/managed/utils/interceptors" - "github.com/percona/pmm/managed/utils/logger" platformClient "github.com/percona/pmm/managed/utils/platform" pmmerrors "github.com/percona/pmm/utils/errors" + "github.com/percona/pmm/utils/logger" "github.com/percona/pmm/utils/sqlmetrics" "github.com/percona/pmm/version" ) diff --git a/managed/services/agents/channel/channel.go b/managed/services/agents/channel/channel.go index 6fc8b8f9ed..dfbb859174 100644 --- a/managed/services/agents/channel/channel.go +++ b/managed/services/agents/channel/channel.go @@ -28,7 +28,7 @@ import ( grpcstatus "google.golang.org/grpc/status" "github.com/percona/pmm/api/agentpb" - "github.com/percona/pmm/managed/utils/logger" + "github.com/percona/pmm/utils/logger" ) const ( diff --git a/managed/services/agents/connection_checker.go b/managed/services/agents/connection_checker.go index 3dc91d6f0f..b784fd4d85 100644 --- a/managed/services/agents/connection_checker.go +++ b/managed/services/agents/connection_checker.go @@ -31,7 +31,7 @@ import ( "github.com/percona/pmm/api/agentpb" "github.com/percona/pmm/api/inventorypb" "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/utils/logger" + "github.com/percona/pmm/utils/logger" "github.com/percona/pmm/version" ) diff --git a/managed/services/agents/handler.go b/managed/services/agents/handler.go index ff45391e11..9163dd0dbd 100644 --- a/managed/services/agents/handler.go +++ b/managed/services/agents/handler.go @@ -31,7 +31,7 @@ import ( "github.com/percona/pmm/api/inventorypb" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services/agents/channel" - "github.com/percona/pmm/managed/utils/logger" + "github.com/percona/pmm/utils/logger" ) // Handler handles agent requests. diff --git a/managed/services/agents/registry.go b/managed/services/agents/registry.go index f7ee0c7f9c..3745044378 100644 --- a/managed/services/agents/registry.go +++ b/managed/services/agents/registry.go @@ -32,7 +32,7 @@ import ( "github.com/percona/pmm/api/agentpb" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services/agents/channel" - "github.com/percona/pmm/managed/utils/logger" + "github.com/percona/pmm/utils/logger" "github.com/percona/pmm/version" ) diff --git a/managed/services/agents/state.go b/managed/services/agents/state.go index c081af9d99..ac49fc5768 100644 --- a/managed/services/agents/state.go +++ b/managed/services/agents/state.go @@ -28,7 +28,7 @@ import ( "github.com/percona/pmm/api/agentpb" "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/utils/logger" + "github.com/percona/pmm/utils/logger" "github.com/percona/pmm/version" ) diff --git a/managed/services/grafana/auth_server_test.go b/managed/services/grafana/auth_server_test.go index 7c4d44865a..c6e3da8a57 100644 --- a/managed/services/grafana/auth_server_test.go +++ b/managed/services/grafana/auth_server_test.go @@ -35,9 +35,9 @@ import ( "gopkg.in/reform.v1/dialects/postgresql" "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/utils/logger" "github.com/percona/pmm/managed/utils/testdb" "github.com/percona/pmm/managed/utils/tests" + "github.com/percona/pmm/utils/logger" ) func TestNextPrefix(t *testing.T) { diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index deae73a93b..6e35a6c371 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -27,7 +27,7 @@ import ( "github.com/percona/pmm/api/inventorypb" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services" - "github.com/percona/pmm/managed/utils/logger" + "github.com/percona/pmm/utils/logger" ) // AgentsService works with inventory API Agents. diff --git a/managed/services/inventory/inventory_metrics.go b/managed/services/inventory/inventory_metrics.go index 7b45b92ca4..afda82c0b6 100644 --- a/managed/services/inventory/inventory_metrics.go +++ b/managed/services/inventory/inventory_metrics.go @@ -26,7 +26,7 @@ import ( "github.com/percona/pmm/api/inventorypb" "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/utils/logger" + "github.com/percona/pmm/utils/logger" ) const ( diff --git a/managed/services/inventory/services_test.go b/managed/services/inventory/services_test.go index e556daf998..ad5549a00c 100644 --- a/managed/services/inventory/services_test.go +++ b/managed/services/inventory/services_test.go @@ -33,9 +33,9 @@ import ( "github.com/percona/pmm/api/inventorypb" "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/utils/logger" "github.com/percona/pmm/managed/utils/testdb" "github.com/percona/pmm/managed/utils/tests" + "github.com/percona/pmm/utils/logger" ) func setup(t *testing.T) (*ServicesService, *AgentsService, *NodesService, func(t *testing.T), context.Context, *mockPrometheusService) { diff --git a/managed/services/management/agent_test.go b/managed/services/management/agent_test.go index b79b6f1a14..c566b911f7 100644 --- a/managed/services/management/agent_test.go +++ b/managed/services/management/agent_test.go @@ -32,9 +32,9 @@ import ( agentv1beta1 "github.com/percona/pmm/api/managementpb/agent" "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/utils/logger" "github.com/percona/pmm/managed/utils/testdb" "github.com/percona/pmm/managed/utils/tests" + "github.com/percona/pmm/utils/logger" ) var now time.Time diff --git a/managed/services/management/annotation_test.go b/managed/services/management/annotation_test.go index b44129379f..386bedb80c 100644 --- a/managed/services/management/annotation_test.go +++ b/managed/services/management/annotation_test.go @@ -30,9 +30,9 @@ import ( "github.com/percona/pmm/api/managementpb" "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/utils/logger" "github.com/percona/pmm/managed/utils/testdb" "github.com/percona/pmm/managed/utils/tests" + "github.com/percona/pmm/utils/logger" ) func TestAnnotations(t *testing.T) { diff --git a/managed/services/management/azure_database.go b/managed/services/management/azure_database.go index 0db8ebbb8d..c305a24c58 100644 --- a/managed/services/management/azure_database.go +++ b/managed/services/management/azure_database.go @@ -30,7 +30,7 @@ import ( azurev1beta1 "github.com/percona/pmm/api/managementpb/azure" "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/utils/logger" + "github.com/percona/pmm/utils/logger" ) const ( diff --git a/managed/services/management/dbaas/components_service_test.go b/managed/services/management/dbaas/components_service_test.go index 5680fe59bd..8d5399bf9e 100644 --- a/managed/services/management/dbaas/components_service_test.go +++ b/managed/services/management/dbaas/components_service_test.go @@ -36,9 +36,9 @@ import ( dbaasv1beta1 "github.com/percona/pmm/api/managementpb/dbaas" "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/utils/logger" "github.com/percona/pmm/managed/utils/testdb" "github.com/percona/pmm/managed/utils/tests" + "github.com/percona/pmm/utils/logger" pmmversion "github.com/percona/pmm/version" ) diff --git a/managed/services/management/dbaas/db_cluster_service_test.go b/managed/services/management/dbaas/db_cluster_service_test.go index 560b8c8ad0..88a736f21c 100644 --- a/managed/services/management/dbaas/db_cluster_service_test.go +++ b/managed/services/management/dbaas/db_cluster_service_test.go @@ -34,9 +34,9 @@ import ( dbaasv1beta1 "github.com/percona/pmm/api/managementpb/dbaas" "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/utils/logger" "github.com/percona/pmm/managed/utils/testdb" "github.com/percona/pmm/managed/utils/tests" + "github.com/percona/pmm/utils/logger" ) const dbKubeconfigTest = ` diff --git a/managed/services/management/dbaas/kubernetes_server_test.go b/managed/services/management/dbaas/kubernetes_server_test.go index 7a2ea1640b..a1d21b60a9 100644 --- a/managed/services/management/dbaas/kubernetes_server_test.go +++ b/managed/services/management/dbaas/kubernetes_server_test.go @@ -40,9 +40,9 @@ import ( dbaasv1beta1 "github.com/percona/pmm/api/managementpb/dbaas" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services/dbaas/kubernetes" - "github.com/percona/pmm/managed/utils/logger" "github.com/percona/pmm/managed/utils/testdb" "github.com/percona/pmm/managed/utils/tests" + "github.com/percona/pmm/utils/logger" pmmversion "github.com/percona/pmm/version" ) diff --git a/managed/services/management/dbaas/psmdb_cluster_service_test.go b/managed/services/management/dbaas/psmdb_cluster_service_test.go index 9d51595017..f9791dfe9c 100644 --- a/managed/services/management/dbaas/psmdb_cluster_service_test.go +++ b/managed/services/management/dbaas/psmdb_cluster_service_test.go @@ -36,9 +36,9 @@ import ( dbaasv1beta1 "github.com/percona/pmm/api/managementpb/dbaas" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services/dbaas/kubernetes" - "github.com/percona/pmm/managed/utils/logger" "github.com/percona/pmm/managed/utils/testdb" "github.com/percona/pmm/managed/utils/tests" + "github.com/percona/pmm/utils/logger" pmmversion "github.com/percona/pmm/version" ) diff --git a/managed/services/management/dbaas/pxc_cluster_service_test.go b/managed/services/management/dbaas/pxc_cluster_service_test.go index ed2e747f19..da64a7f261 100644 --- a/managed/services/management/dbaas/pxc_cluster_service_test.go +++ b/managed/services/management/dbaas/pxc_cluster_service_test.go @@ -39,9 +39,9 @@ import ( dbaasv1beta1 "github.com/percona/pmm/api/managementpb/dbaas" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services/dbaas/kubernetes" - "github.com/percona/pmm/managed/utils/logger" "github.com/percona/pmm/managed/utils/testdb" "github.com/percona/pmm/managed/utils/tests" + "github.com/percona/pmm/utils/logger" pmmversion "github.com/percona/pmm/version" ) diff --git a/managed/services/management/node_mgmt_test.go b/managed/services/management/node_mgmt_test.go index 6cf7582e84..bde08a60d7 100644 --- a/managed/services/management/node_mgmt_test.go +++ b/managed/services/management/node_mgmt_test.go @@ -35,9 +35,9 @@ import ( "github.com/percona/pmm/api/inventorypb" nodev1beta1 "github.com/percona/pmm/api/managementpb/node" "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/utils/logger" "github.com/percona/pmm/managed/utils/testdb" "github.com/percona/pmm/managed/utils/tests" + "github.com/percona/pmm/utils/logger" ) func TestMgmtNodeService(t *testing.T) { diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index eeb6ad0a28..fe2c67281e 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -31,9 +31,9 @@ import ( "github.com/percona/pmm/api/inventorypb" "github.com/percona/pmm/api/managementpb" "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/utils/logger" "github.com/percona/pmm/managed/utils/testdb" "github.com/percona/pmm/managed/utils/tests" + "github.com/percona/pmm/utils/logger" ) func TestNodeService(t *testing.T) { diff --git a/managed/services/management/rds.go b/managed/services/management/rds.go index 38daa0018c..fbcc349ccc 100644 --- a/managed/services/management/rds.go +++ b/managed/services/management/rds.go @@ -39,7 +39,7 @@ import ( "github.com/percona/pmm/api/managementpb" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services" - "github.com/percona/pmm/managed/utils/logger" + "github.com/percona/pmm/utils/logger" ) const ( diff --git a/managed/services/management/rds_test.go b/managed/services/management/rds_test.go index b40fdcaed0..ace8235650 100644 --- a/managed/services/management/rds_test.go +++ b/managed/services/management/rds_test.go @@ -38,9 +38,9 @@ import ( "github.com/percona/pmm/api/inventorypb" "github.com/percona/pmm/api/managementpb" "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/utils/logger" "github.com/percona/pmm/managed/utils/testdb" "github.com/percona/pmm/managed/utils/tests" + "github.com/percona/pmm/utils/logger" ) func TestRDSService(t *testing.T) { diff --git a/managed/services/management/role_test.go b/managed/services/management/role_test.go index b23e6270ed..1c3ee4dfcc 100644 --- a/managed/services/management/role_test.go +++ b/managed/services/management/role_test.go @@ -28,9 +28,9 @@ import ( rolev1beta1 "github.com/percona/pmm/api/managementpb/role" "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/utils/logger" "github.com/percona/pmm/managed/utils/testdb" "github.com/percona/pmm/managed/utils/tests" + "github.com/percona/pmm/utils/logger" ) //nolint:paralleltest diff --git a/managed/services/management/service_mgmt_test.go b/managed/services/management/service_mgmt_test.go index 5946195c91..c6e34c290f 100644 --- a/managed/services/management/service_mgmt_test.go +++ b/managed/services/management/service_mgmt_test.go @@ -30,9 +30,9 @@ import ( servicev1beta1 "github.com/percona/pmm/api/managementpb/service" "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/utils/logger" "github.com/percona/pmm/managed/utils/testdb" "github.com/percona/pmm/managed/utils/tests" + "github.com/percona/pmm/utils/logger" ) func TestMgmtServiceService(t *testing.T) { diff --git a/managed/services/management/service_test.go b/managed/services/management/service_test.go index 4aaca4ce96..8167f91520 100644 --- a/managed/services/management/service_test.go +++ b/managed/services/management/service_test.go @@ -32,9 +32,9 @@ import ( "github.com/percona/pmm/api/inventorypb" "github.com/percona/pmm/api/managementpb" "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/utils/logger" "github.com/percona/pmm/managed/utils/testdb" "github.com/percona/pmm/managed/utils/tests" + "github.com/percona/pmm/utils/logger" ) func TestServiceService(t *testing.T) { diff --git a/managed/services/qan/client_test.go b/managed/services/qan/client_test.go index bb4bede570..e48d5c7503 100644 --- a/managed/services/qan/client_test.go +++ b/managed/services/qan/client_test.go @@ -33,8 +33,8 @@ import ( "github.com/percona/pmm/api/inventorypb" qanpb "github.com/percona/pmm/api/qanpb" "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/utils/logger" "github.com/percona/pmm/managed/utils/testdb" + "github.com/percona/pmm/utils/logger" "github.com/percona/pmm/utils/sqlmetrics" ) diff --git a/managed/services/supervisord/logs.go b/managed/services/supervisord/logs.go index f347b3b986..7eb802fae3 100644 --- a/managed/services/supervisord/logs.go +++ b/managed/services/supervisord/logs.go @@ -37,8 +37,8 @@ import ( "golang.org/x/sys/unix" "gopkg.in/yaml.v3" - "github.com/percona/pmm/managed/utils/logger" pprofUtils "github.com/percona/pmm/managed/utils/pprof" + "github.com/percona/pmm/utils/logger" "github.com/percona/pmm/utils/pdeathsig" ) diff --git a/managed/services/supervisord/logs_test.go b/managed/services/supervisord/logs_test.go index 6b08395487..118a42bac1 100644 --- a/managed/services/supervisord/logs_test.go +++ b/managed/services/supervisord/logs_test.go @@ -31,7 +31,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/percona/pmm/managed/utils/logger" + "github.com/percona/pmm/utils/logger" ) var commonExpectedFiles = []string{ diff --git a/managed/services/vmalert/init_test.go b/managed/services/vmalert/init_test.go index bf9cffa913..2399a45e94 100644 --- a/managed/services/vmalert/init_test.go +++ b/managed/services/vmalert/init_test.go @@ -15,7 +15,7 @@ package vmalert -import "github.com/percona/pmm/managed/utils/logger" +import "github.com/percona/pmm/utils/logger" //nolint:gochecknoinits func init() { diff --git a/managed/utils/interceptors/interceptors.go b/managed/utils/interceptors/interceptors.go index a1c466dcbd..382d30796d 100644 --- a/managed/utils/interceptors/interceptors.go +++ b/managed/utils/interceptors/interceptors.go @@ -32,7 +32,7 @@ import ( "google.golang.org/grpc/status" "github.com/percona/pmm/api/agentpb" - "github.com/percona/pmm/managed/utils/logger" + "github.com/percona/pmm/utils/logger" ) func logRequest(l *logrus.Entry, prefix string, f func() error) (err error) { diff --git a/qan-api2/main.go b/qan-api2/main.go index 9d94f52758..b0f7ffa422 100644 --- a/qan-api2/main.go +++ b/qan-api2/main.go @@ -27,8 +27,6 @@ import ( _ "net/http/pprof" //nolint:gosec "os" "os/signal" - "path/filepath" - "runtime" "strings" "sync" "time" @@ -56,7 +54,7 @@ import ( aservice "github.com/percona/pmm/qan-api2/services/analytics" rservice "github.com/percona/pmm/qan-api2/services/receiver" "github.com/percona/pmm/qan-api2/utils/interceptors" - "github.com/percona/pmm/qan-api2/utils/logger" + "github.com/percona/pmm/utils/logger" "github.com/percona/pmm/utils/sqlmetrics" "github.com/percona/pmm/version" ) @@ -278,25 +276,7 @@ func main() { log.Printf("%s.", version.ShortInfo()) - logrus.SetFormatter(&logrus.TextFormatter{ - // Enable multiline-friendly formatter in both development (with terminal) and production (without terminal): - // https://github.com/sirupsen/logrus/blob/839c75faf7f98a33d445d181f3018b5c3409a45e/text_formatter.go#L176-L178 - ForceColors: true, - FullTimestamp: true, - TimestampFormat: "2006-01-02T15:04:05.000-07:00", - - CallerPrettyfier: func(f *runtime.Frame) (string, string) { - _, function := filepath.Split(f.Function) - - // keep a single directory name as a compromise between brevity and unambiguity - var dir string - dir, file := filepath.Split(f.File) - dir = filepath.Base(dir) - file = fmt.Sprintf("%s/%s:%d", dir, file, f.Line) - - return function, file - }, - }) + logger.SetupGlobalLogger() if *debugF { logrus.SetLevel(logrus.DebugLevel) diff --git a/managed/utils/logger/global.go b/utils/logger/global.go similarity index 90% rename from managed/utils/logger/global.go rename to utils/logger/global.go index 2d9a50c7c2..ec5ed4f4aa 100644 --- a/managed/utils/logger/global.go +++ b/utils/logger/global.go @@ -24,11 +24,9 @@ import ( ) // SetupGlobalLogger configures logrus.StandardLogger() to enable multiline-friendly formatter -// in both development (with terminal) and production (without terminal). +// in both development (with terminal) and production (without terminal) with default prettyfier. func SetupGlobalLogger() { logrus.SetFormatter(&logrus.TextFormatter{ - // https://github.com/sirupsen/logrus/blob/839c75faf7f98a33d445d181f3018b5c3409a45e/text_formatter.go#L176-L178 - ForceColors: true, FullTimestamp: true, TimestampFormat: "2006-01-02T15:04:05.000-07:00", diff --git a/managed/utils/logger/grpc.go b/utils/logger/grpc.go similarity index 100% rename from managed/utils/logger/grpc.go rename to utils/logger/grpc.go diff --git a/managed/utils/logger/logger.go b/utils/logger/logger.go similarity index 100% rename from managed/utils/logger/logger.go rename to utils/logger/logger.go From e08052d91e697696f248f0f98e04e497dc78d771 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Aug 2023 06:12:53 +0000 Subject: [PATCH 27/27] Bump @typescript-eslint/parser from 5.62.0 to 6.3.0 in /cli-tests (#2396) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.62.0 to 6.3.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v6.3.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 88 ++++++++++++++----------------------- cli-tests/package.json | 2 +- 2 files changed, 35 insertions(+), 55 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index 1e426b5066..1a5e7875a6 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -21,7 +21,7 @@ "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^6.2.0", - "@typescript-eslint/parser": "^5.62.0", + "@typescript-eslint/parser": "^6.3.0", "eslint": "8.46", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", @@ -297,25 +297,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.3.0.tgz", + "integrity": "sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/scope-manager": "6.3.0", + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/typescript-estree": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -324,16 +325,16 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz", + "integrity": "sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -341,12 +342,12 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", + "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -354,21 +355,21 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz", + "integrity": "sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", + "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/visitor-keys": "6.3.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -381,16 +382,16 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", + "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.3.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -2830,27 +2831,6 @@ "strip-bom": "^3.0.0" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/cli-tests/package.json b/cli-tests/package.json index e50fa7f78f..44f200dcb7 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -25,7 +25,7 @@ "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^6.2.0", - "@typescript-eslint/parser": "^5.62.0", + "@typescript-eslint/parser": "^6.3.0", "eslint": "8.46", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0",