From e29b1e9633ed87dbe39d348746a9fd7736600690 Mon Sep 17 00:00:00 2001 From: Yevgeniy Firsov Date: Sat, 6 May 2023 18:58:37 -0700 Subject: [PATCH 1/3] fix: Enable schema validation by default --- tigris/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tigris/client.go b/tigris/client.go index 02b3ebc..622a837 100644 --- a/tigris/client.go +++ b/tigris/client.go @@ -58,7 +58,7 @@ func driverConfig(cfg *Config) *config.Driver { Token: cfg.Token, Protocol: cfg.Protocol, - SkipSchemaValidation: true, + SkipSchemaValidation: false, } } From 03b0761868e076b78350f34db8220420d40215e5 Mon Sep 17 00:00:00 2001 From: Yevgeniy Firsov Date: Sat, 6 May 2023 19:58:07 -0700 Subject: [PATCH 2/3] feat: Global app keys support --- .github/workflows/go-test.yaml | 5 +- api/client/v1/api/http.go | 934 +++++++++++++- api/proto | 2 +- api/server/v1/api.pb.go | 2191 ++++++++++++++++++++++---------- api/server/v1/api.pb.gw.go | 409 ++++++ api/server/v1/api_grpc.pb.go | 195 +++ api/server/v1/auth.pb.go | 341 ++--- api/server/v1/marshaler.go | 47 +- driver/driver.go | 6 + driver/grpc.go | 60 + driver/http.go | 180 ++- driver/internal.go | 6 + driver/management_grpc_test.go | 2 + driver/management_http_test.go | 3 + driver/management_test.go | 168 ++- driver/types.go | 1 + mock/api/grpc.go | 75 ++ mock/driver.go | 74 ++ test/setup.go | 1 + 19 files changed, 3791 insertions(+), 909 deletions(-) diff --git a/.github/workflows/go-test.yaml b/.github/workflows/go-test.yaml index 938a333..6a98b71 100644 --- a/.github/workflows/go-test.yaml +++ b/.github/workflows/go-test.yaml @@ -1,6 +1,9 @@ name: go-test on: push: + branches: + - "main" + - "beta" workflow_call: pull_request: jobs: @@ -15,7 +18,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v3 with: - go-version: '1.19.2' + go-version: '1.20' - name: Install test deps run: | diff --git a/api/client/v1/api/http.go b/api/client/v1/api/http.go index e6d9f7b..82c2712 100644 --- a/api/client/v1/api/http.go +++ b/api/client/v1/api/http.go @@ -376,13 +376,37 @@ type CreateDocumentResponse struct { Status *[]DocStatus `json:"status,omitempty"` } +// CreateGlobalAppKeyRequest Request creation of global app key +type CreateGlobalAppKeyRequest struct { + // Description A human readable app description + Description *string `json:"description,omitempty"` + + // Name A human readable app name + Name *string `json:"name,omitempty"` +} + +// CreateGlobalAppKeyResponse CreateGlobalAppKeyResponse returns created global app key +type CreateGlobalAppKeyResponse struct { + // CreatedAppKey The global AppKey + CreatedAppKey *GlobalAppKey `json:"created_app_key,omitempty"` +} + // CreateInvitationsRequest defines model for CreateInvitationsRequest. type CreateInvitationsRequest struct { Invitations *[]InvitationInfo `json:"invitations,omitempty"` } // CreateInvitationsResponse defines model for CreateInvitationsResponse. -type CreateInvitationsResponse = map[string]interface{} +type CreateInvitationsResponse struct { + // Count number of invitations created + Count *int32 `json:"count,omitempty"` + + // Message human friendly message + Message *string `json:"message,omitempty"` + + // Status machine friendly status = created + Status *string `json:"status,omitempty"` +} // CreateNamespaceRequest defines model for CreateNamespaceRequest. type CreateNamespaceRequest struct { @@ -602,6 +626,18 @@ type DeleteDocumentResponse struct { Status *[]DocStatus `json:"status,omitempty"` } +// DeleteGlobalAppKeyRequest Request deletion of an global app key +type DeleteGlobalAppKeyRequest struct { + // Id app_key id + Id *string `json:"id,omitempty"` +} + +// DeleteGlobalAppKeyResponse AppKeys returns the flag to convey if global app key was deleted +type DeleteGlobalAppKeyResponse struct { + // Deleted status flag for delete operation + Deleted *bool `json:"deleted,omitempty"` +} + // DeleteIndexRequest defines model for DeleteIndexRequest. type DeleteIndexRequest struct { // Name index name. @@ -627,7 +663,13 @@ type DeleteInvitationsRequest struct { } // DeleteInvitationsResponse defines model for DeleteInvitationsResponse. -type DeleteInvitationsResponse = map[string]interface{} +type DeleteInvitationsResponse struct { + // Message human friendly message + Message *string `json:"message,omitempty"` + + // Status machine friendly status = deleted + Status *string `json:"status,omitempty"` +} // DeleteNamespaceResponse defines model for DeleteNamespaceResponse. type DeleteNamespaceResponse struct { @@ -947,6 +989,33 @@ type GetUserMetadataResponse struct { Value *[]byte `json:"value,omitempty"` } +// GlobalAppKey The global AppKey +type GlobalAppKey struct { + // CreatedAt Created at + CreatedAt *int64 `json:"created_at,omitempty"` + + // CreatedBy Created by + CreatedBy *string `json:"created_by,omitempty"` + + // Description A human readable app description + Description *string `json:"description,omitempty"` + + // Id Generated client id + Id *string `json:"id,omitempty"` + + // Name A human readable app name + Name *string `json:"name,omitempty"` + + // Secret Generated app secret + Secret *string `json:"secret,omitempty"` + + // UpdatedAt Updated at + UpdatedAt *int64 `json:"updated_at,omitempty"` + + // UpdatedBy Updated by + UpdatedBy *string `json:"updated_by,omitempty"` +} + // GroupedSearchHits defines model for GroupedSearchHits. type GroupedSearchHits struct { GroupKeys *[]string `json:"group_keys,omitempty"` @@ -1173,6 +1242,11 @@ type ListCollectionsResponse struct { Collections *[]CollectionInfo `json:"collections,omitempty"` } +// ListGlobalAppKeysResponse ListGlobalAppKeysResponse returns one or more visible global app keys to user +type ListGlobalAppKeysResponse struct { + AppKeys *[]GlobalAppKey `json:"app_keys,omitempty"` +} + // ListIndexesResponse defines model for ListIndexesResponse. type ListIndexesResponse struct { // Indexes List of indexes. @@ -1496,6 +1570,18 @@ type RotateAppKeyResponse struct { AppKey *AppKey `json:"app_key,omitempty"` } +// RotateGlobalAppKeySecretRequest Request rotation of an app key secret +type RotateGlobalAppKeySecretRequest struct { + // Id global app key id + Id *string `json:"id,omitempty"` +} + +// RotateGlobalAppKeySecretResponse RotateGlobalAppKeySecretResponse returns the new app key with rotated secret +type RotateGlobalAppKeySecretResponse struct { + // AppKey The global AppKey + AppKey *GlobalAppKey `json:"app_key,omitempty"` +} + // SearchFacet defines model for SearchFacet. type SearchFacet struct { Counts *[]FacetCount `json:"counts,omitempty"` @@ -1741,6 +1827,24 @@ type UpdateDocumentResponse struct { Status *[]DocStatus `json:"status,omitempty"` } +// UpdateGlobalAppKeyRequest To update the description of the global app key +type UpdateGlobalAppKeyRequest struct { + // Description A new human readable app description + Description *string `json:"description,omitempty"` + + // Id app key id - this is not allowed to update + Id *string `json:"id,omitempty"` + + // Name A new human readable app name + Name *string `json:"name,omitempty"` +} + +// UpdateGlobalAppKeyResponse Returns response for updating the global app key description +type UpdateGlobalAppKeyResponse struct { + // UpdatedAppKey The global AppKey + UpdatedAppKey *GlobalAppKey `json:"updated_app_key,omitempty"` +} + // UpdateNamespaceMetadataRequest Request update of namespace metadata type UpdateNamespaceMetadataRequest struct { MetadataKey *string `json:"metadataKey,omitempty"` @@ -1928,6 +2032,18 @@ type SearchGetParams struct { Ids *[]string `form:"ids,omitempty" json:"ids,omitempty"` } +// TigrisCreateGlobalAppKeyJSONRequestBody defines body for TigrisCreateGlobalAppKey for application/json ContentType. +type TigrisCreateGlobalAppKeyJSONRequestBody = CreateGlobalAppKeyRequest + +// TigrisDeleteGlobalAppKeyJSONRequestBody defines body for TigrisDeleteGlobalAppKey for application/json ContentType. +type TigrisDeleteGlobalAppKeyJSONRequestBody = DeleteGlobalAppKeyRequest + +// TigrisRotateGlobalAppKeySecretJSONRequestBody defines body for TigrisRotateGlobalAppKeySecret for application/json ContentType. +type TigrisRotateGlobalAppKeySecretJSONRequestBody = RotateGlobalAppKeySecretRequest + +// TigrisUpdateGlobalAppKeyJSONRequestBody defines body for TigrisUpdateGlobalAppKey for application/json ContentType. +type TigrisUpdateGlobalAppKeyJSONRequestBody = UpdateGlobalAppKeyRequest + // AuthCreateInvitationsJSONRequestBody defines body for AuthCreateInvitations for application/json ContentType. type AuthCreateInvitationsJSONRequestBody = CreateInvitationsRequest @@ -2166,6 +2282,29 @@ func WithRequestEditorFn(fn RequestEditorFn) ClientOption { // The interface specification for the client above. type ClientInterface interface { + // TigrisListGlobalAppKeys request + TigrisListGlobalAppKeys(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + + // TigrisCreateGlobalAppKey request with any body + TigrisCreateGlobalAppKeyWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + TigrisCreateGlobalAppKey(ctx context.Context, body TigrisCreateGlobalAppKeyJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // TigrisDeleteGlobalAppKey request with any body + TigrisDeleteGlobalAppKeyWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + TigrisDeleteGlobalAppKey(ctx context.Context, body TigrisDeleteGlobalAppKeyJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // TigrisRotateGlobalAppKeySecret request with any body + TigrisRotateGlobalAppKeySecretWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + TigrisRotateGlobalAppKeySecret(ctx context.Context, body TigrisRotateGlobalAppKeySecretJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // TigrisUpdateGlobalAppKey request with any body + TigrisUpdateGlobalAppKeyWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + TigrisUpdateGlobalAppKey(ctx context.Context, body TigrisUpdateGlobalAppKeyJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // AuthCreateInvitations request with any body AuthCreateInvitationsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -2511,6 +2650,114 @@ type ClientInterface interface { SearchCreateOrUpdateIndex(ctx context.Context, project string, name string, body SearchCreateOrUpdateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) } +func (c *Client) TigrisListGlobalAppKeys(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewTigrisListGlobalAppKeysRequest(c.Server) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) TigrisCreateGlobalAppKeyWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewTigrisCreateGlobalAppKeyRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) TigrisCreateGlobalAppKey(ctx context.Context, body TigrisCreateGlobalAppKeyJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewTigrisCreateGlobalAppKeyRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) TigrisDeleteGlobalAppKeyWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewTigrisDeleteGlobalAppKeyRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) TigrisDeleteGlobalAppKey(ctx context.Context, body TigrisDeleteGlobalAppKeyJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewTigrisDeleteGlobalAppKeyRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) TigrisRotateGlobalAppKeySecretWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewTigrisRotateGlobalAppKeySecretRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) TigrisRotateGlobalAppKeySecret(ctx context.Context, body TigrisRotateGlobalAppKeySecretJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewTigrisRotateGlobalAppKeySecretRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) TigrisUpdateGlobalAppKeyWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewTigrisUpdateGlobalAppKeyRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) TigrisUpdateGlobalAppKey(ctx context.Context, body TigrisUpdateGlobalAppKeyJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewTigrisUpdateGlobalAppKeyRequest(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) AuthCreateInvitationsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewAuthCreateInvitationsRequestWithBody(c.Server, contentType, body) if err != nil { @@ -4107,19 +4354,8 @@ func (c *Client) SearchCreateOrUpdateIndex(ctx context.Context, project string, return c.Client.Do(req) } -// NewAuthCreateInvitationsRequest calls the generic AuthCreateInvitations builder with application/json body -func NewAuthCreateInvitationsRequest(server string, body AuthCreateInvitationsJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewAuthCreateInvitationsRequestWithBody(server, "application/json", bodyReader) -} - -// NewAuthCreateInvitationsRequestWithBody generates requests for AuthCreateInvitations with any type of body -func NewAuthCreateInvitationsRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewTigrisListGlobalAppKeysRequest generates requests for TigrisListGlobalAppKeys +func NewTigrisListGlobalAppKeysRequest(server string) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -4127,7 +4363,7 @@ func NewAuthCreateInvitationsRequestWithBody(server string, contentType string, return nil, err } - operationPath := fmt.Sprintf("/v1/auth/namespace/invitations/create") + operationPath := fmt.Sprintf("/v1/apps/keys") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -4137,29 +4373,27 @@ func NewAuthCreateInvitationsRequestWithBody(server string, contentType string, return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest("GET", queryURL.String(), nil) if err != nil { return nil, err } - req.Header.Add("Content-Type", contentType) - return req, nil } -// NewAuthDeleteInvitationsRequest calls the generic AuthDeleteInvitations builder with application/json body -func NewAuthDeleteInvitationsRequest(server string, body AuthDeleteInvitationsJSONRequestBody) (*http.Request, error) { +// NewTigrisCreateGlobalAppKeyRequest calls the generic TigrisCreateGlobalAppKey builder with application/json body +func NewTigrisCreateGlobalAppKeyRequest(server string, body TigrisCreateGlobalAppKeyJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewAuthDeleteInvitationsRequestWithBody(server, "application/json", bodyReader) + return NewTigrisCreateGlobalAppKeyRequestWithBody(server, "application/json", bodyReader) } -// NewAuthDeleteInvitationsRequestWithBody generates requests for AuthDeleteInvitations with any type of body -func NewAuthDeleteInvitationsRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewTigrisCreateGlobalAppKeyRequestWithBody generates requests for TigrisCreateGlobalAppKey with any type of body +func NewTigrisCreateGlobalAppKeyRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -4167,7 +4401,7 @@ func NewAuthDeleteInvitationsRequestWithBody(server string, contentType string, return nil, err } - operationPath := fmt.Sprintf("/v1/auth/namespace/invitations/delete") + operationPath := fmt.Sprintf("/v1/apps/keys/create") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -4177,7 +4411,7 @@ func NewAuthDeleteInvitationsRequestWithBody(server string, contentType string, return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), body) + req, err := http.NewRequest("POST", queryURL.String(), body) if err != nil { return nil, err } @@ -4187,8 +4421,19 @@ func NewAuthDeleteInvitationsRequestWithBody(server string, contentType string, return req, nil } -// NewAuthListInvitationsRequest generates requests for AuthListInvitations -func NewAuthListInvitationsRequest(server string, params *AuthListInvitationsParams) (*http.Request, error) { +// NewTigrisDeleteGlobalAppKeyRequest calls the generic TigrisDeleteGlobalAppKey builder with application/json body +func NewTigrisDeleteGlobalAppKeyRequest(server string, body TigrisDeleteGlobalAppKeyJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewTigrisDeleteGlobalAppKeyRequestWithBody(server, "application/json", bodyReader) +} + +// NewTigrisDeleteGlobalAppKeyRequestWithBody generates requests for TigrisDeleteGlobalAppKey with any type of body +func NewTigrisDeleteGlobalAppKeyRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -4196,7 +4441,7 @@ func NewAuthListInvitationsRequest(server string, params *AuthListInvitationsPar return nil, err } - operationPath := fmt.Sprintf("/v1/auth/namespace/invitations/list") + operationPath := fmt.Sprintf("/v1/apps/keys/delete") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -4206,47 +4451,29 @@ func NewAuthListInvitationsRequest(server string, params *AuthListInvitationsPar return nil, err } - queryValues := queryURL.Query() - - if params.Status != nil { - - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "status", runtime.ParamLocationQuery, *params.Status); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { - return nil, err - } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } - } - } - - } - - queryURL.RawQuery = queryValues.Encode() - - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest("DELETE", queryURL.String(), body) if err != nil { return nil, err } + req.Header.Add("Content-Type", contentType) + return req, nil } -// NewAuthVerifyInvitationRequest calls the generic AuthVerifyInvitation builder with application/json body -func NewAuthVerifyInvitationRequest(server string, body AuthVerifyInvitationJSONRequestBody) (*http.Request, error) { +// NewTigrisRotateGlobalAppKeySecretRequest calls the generic TigrisRotateGlobalAppKeySecret builder with application/json body +func NewTigrisRotateGlobalAppKeySecretRequest(server string, body TigrisRotateGlobalAppKeySecretJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewAuthVerifyInvitationRequestWithBody(server, "application/json", bodyReader) + return NewTigrisRotateGlobalAppKeySecretRequestWithBody(server, "application/json", bodyReader) } -// NewAuthVerifyInvitationRequestWithBody generates requests for AuthVerifyInvitation with any type of body -func NewAuthVerifyInvitationRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewTigrisRotateGlobalAppKeySecretRequestWithBody generates requests for TigrisRotateGlobalAppKeySecret with any type of body +func NewTigrisRotateGlobalAppKeySecretRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -4254,7 +4481,7 @@ func NewAuthVerifyInvitationRequestWithBody(server string, contentType string, b return nil, err } - operationPath := fmt.Sprintf("/v1/auth/namespace/invitations/verify") + operationPath := fmt.Sprintf("/v1/apps/keys/rotate") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -4274,8 +4501,19 @@ func NewAuthVerifyInvitationRequestWithBody(server string, contentType string, b return req, nil } -// NewAuthListUsersRequest generates requests for AuthListUsers -func NewAuthListUsersRequest(server string) (*http.Request, error) { +// NewTigrisUpdateGlobalAppKeyRequest calls the generic TigrisUpdateGlobalAppKey builder with application/json body +func NewTigrisUpdateGlobalAppKeyRequest(server string, body TigrisUpdateGlobalAppKeyJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewTigrisUpdateGlobalAppKeyRequestWithBody(server, "application/json", bodyReader) +} + +// NewTigrisUpdateGlobalAppKeyRequestWithBody generates requests for TigrisUpdateGlobalAppKey with any type of body +func NewTigrisUpdateGlobalAppKeyRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -4283,7 +4521,7 @@ func NewAuthListUsersRequest(server string) (*http.Request, error) { return nil, err } - operationPath := fmt.Sprintf("/v1/auth/namespace/users") + operationPath := fmt.Sprintf("/v1/apps/keys/update") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -4293,7 +4531,203 @@ func NewAuthListUsersRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest("PUT", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewAuthCreateInvitationsRequest calls the generic AuthCreateInvitations builder with application/json body +func NewAuthCreateInvitationsRequest(server string, body AuthCreateInvitationsJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewAuthCreateInvitationsRequestWithBody(server, "application/json", bodyReader) +} + +// NewAuthCreateInvitationsRequestWithBody generates requests for AuthCreateInvitations with any type of body +func NewAuthCreateInvitationsRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/v1/auth/namespace/invitations/create") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewAuthDeleteInvitationsRequest calls the generic AuthDeleteInvitations builder with application/json body +func NewAuthDeleteInvitationsRequest(server string, body AuthDeleteInvitationsJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewAuthDeleteInvitationsRequestWithBody(server, "application/json", bodyReader) +} + +// NewAuthDeleteInvitationsRequestWithBody generates requests for AuthDeleteInvitations with any type of body +func NewAuthDeleteInvitationsRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/v1/auth/namespace/invitations/delete") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("DELETE", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewAuthListInvitationsRequest generates requests for AuthListInvitations +func NewAuthListInvitationsRequest(server string, params *AuthListInvitationsParams) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/v1/auth/namespace/invitations/list") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + queryValues := queryURL.Query() + + if params.Status != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "status", runtime.ParamLocationQuery, *params.Status); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +// NewAuthVerifyInvitationRequest calls the generic AuthVerifyInvitation builder with application/json body +func NewAuthVerifyInvitationRequest(server string, body AuthVerifyInvitationJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewAuthVerifyInvitationRequestWithBody(server, "application/json", bodyReader) +} + +// NewAuthVerifyInvitationRequestWithBody generates requests for AuthVerifyInvitation with any type of body +func NewAuthVerifyInvitationRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/v1/auth/namespace/invitations/verify") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + +// NewAuthListUsersRequest generates requests for AuthListUsers +func NewAuthListUsersRequest(server string) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/v1/auth/namespace/users") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) if err != nil { return nil, err } @@ -8165,6 +8599,29 @@ func WithBaseURL(baseURL string) ClientOption { // ClientWithResponsesInterface is the interface specification for the client with responses above. type ClientWithResponsesInterface interface { + // TigrisListGlobalAppKeys request + TigrisListGlobalAppKeysWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*TigrisListGlobalAppKeysResponse, error) + + // TigrisCreateGlobalAppKey request with any body + TigrisCreateGlobalAppKeyWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*TigrisCreateGlobalAppKeyResponse, error) + + TigrisCreateGlobalAppKeyWithResponse(ctx context.Context, body TigrisCreateGlobalAppKeyJSONRequestBody, reqEditors ...RequestEditorFn) (*TigrisCreateGlobalAppKeyResponse, error) + + // TigrisDeleteGlobalAppKey request with any body + TigrisDeleteGlobalAppKeyWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*TigrisDeleteGlobalAppKeyResponse, error) + + TigrisDeleteGlobalAppKeyWithResponse(ctx context.Context, body TigrisDeleteGlobalAppKeyJSONRequestBody, reqEditors ...RequestEditorFn) (*TigrisDeleteGlobalAppKeyResponse, error) + + // TigrisRotateGlobalAppKeySecret request with any body + TigrisRotateGlobalAppKeySecretWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*TigrisRotateGlobalAppKeySecretResponse, error) + + TigrisRotateGlobalAppKeySecretWithResponse(ctx context.Context, body TigrisRotateGlobalAppKeySecretJSONRequestBody, reqEditors ...RequestEditorFn) (*TigrisRotateGlobalAppKeySecretResponse, error) + + // TigrisUpdateGlobalAppKey request with any body + TigrisUpdateGlobalAppKeyWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*TigrisUpdateGlobalAppKeyResponse, error) + + TigrisUpdateGlobalAppKeyWithResponse(ctx context.Context, body TigrisUpdateGlobalAppKeyJSONRequestBody, reqEditors ...RequestEditorFn) (*TigrisUpdateGlobalAppKeyResponse, error) + // AuthCreateInvitations request with any body AuthCreateInvitationsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuthCreateInvitationsResponse, error) @@ -8510,6 +8967,121 @@ type ClientWithResponsesInterface interface { SearchCreateOrUpdateIndexWithResponse(ctx context.Context, project string, name string, body SearchCreateOrUpdateIndexJSONRequestBody, reqEditors ...RequestEditorFn) (*SearchCreateOrUpdateIndexResponse, error) } +type TigrisListGlobalAppKeysResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ListGlobalAppKeysResponse + JSONDefault *Status +} + +// Status returns HTTPResponse.Status +func (r TigrisListGlobalAppKeysResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r TigrisListGlobalAppKeysResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type TigrisCreateGlobalAppKeyResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *CreateGlobalAppKeyResponse + JSONDefault *Status +} + +// Status returns HTTPResponse.Status +func (r TigrisCreateGlobalAppKeyResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r TigrisCreateGlobalAppKeyResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type TigrisDeleteGlobalAppKeyResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *DeleteGlobalAppKeyResponse + JSONDefault *Status +} + +// Status returns HTTPResponse.Status +func (r TigrisDeleteGlobalAppKeyResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r TigrisDeleteGlobalAppKeyResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type TigrisRotateGlobalAppKeySecretResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *RotateGlobalAppKeySecretResponse + JSONDefault *Status +} + +// Status returns HTTPResponse.Status +func (r TigrisRotateGlobalAppKeySecretResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r TigrisRotateGlobalAppKeySecretResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +type TigrisUpdateGlobalAppKeyResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *UpdateGlobalAppKeyResponse + JSONDefault *Status +} + +// Status returns HTTPResponse.Status +func (r TigrisUpdateGlobalAppKeyResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r TigrisUpdateGlobalAppKeyResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type AuthCreateInvitationsResponse struct { Body []byte HTTPResponse *http.Response @@ -10304,6 +10876,83 @@ func (r SearchCreateOrUpdateIndexResponse) StatusCode() int { return 0 } +// TigrisListGlobalAppKeysWithResponse request returning *TigrisListGlobalAppKeysResponse +func (c *ClientWithResponses) TigrisListGlobalAppKeysWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*TigrisListGlobalAppKeysResponse, error) { + rsp, err := c.TigrisListGlobalAppKeys(ctx, reqEditors...) + if err != nil { + return nil, err + } + return ParseTigrisListGlobalAppKeysResponse(rsp) +} + +// TigrisCreateGlobalAppKeyWithBodyWithResponse request with arbitrary body returning *TigrisCreateGlobalAppKeyResponse +func (c *ClientWithResponses) TigrisCreateGlobalAppKeyWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*TigrisCreateGlobalAppKeyResponse, error) { + rsp, err := c.TigrisCreateGlobalAppKeyWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseTigrisCreateGlobalAppKeyResponse(rsp) +} + +func (c *ClientWithResponses) TigrisCreateGlobalAppKeyWithResponse(ctx context.Context, body TigrisCreateGlobalAppKeyJSONRequestBody, reqEditors ...RequestEditorFn) (*TigrisCreateGlobalAppKeyResponse, error) { + rsp, err := c.TigrisCreateGlobalAppKey(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseTigrisCreateGlobalAppKeyResponse(rsp) +} + +// TigrisDeleteGlobalAppKeyWithBodyWithResponse request with arbitrary body returning *TigrisDeleteGlobalAppKeyResponse +func (c *ClientWithResponses) TigrisDeleteGlobalAppKeyWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*TigrisDeleteGlobalAppKeyResponse, error) { + rsp, err := c.TigrisDeleteGlobalAppKeyWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseTigrisDeleteGlobalAppKeyResponse(rsp) +} + +func (c *ClientWithResponses) TigrisDeleteGlobalAppKeyWithResponse(ctx context.Context, body TigrisDeleteGlobalAppKeyJSONRequestBody, reqEditors ...RequestEditorFn) (*TigrisDeleteGlobalAppKeyResponse, error) { + rsp, err := c.TigrisDeleteGlobalAppKey(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseTigrisDeleteGlobalAppKeyResponse(rsp) +} + +// TigrisRotateGlobalAppKeySecretWithBodyWithResponse request with arbitrary body returning *TigrisRotateGlobalAppKeySecretResponse +func (c *ClientWithResponses) TigrisRotateGlobalAppKeySecretWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*TigrisRotateGlobalAppKeySecretResponse, error) { + rsp, err := c.TigrisRotateGlobalAppKeySecretWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseTigrisRotateGlobalAppKeySecretResponse(rsp) +} + +func (c *ClientWithResponses) TigrisRotateGlobalAppKeySecretWithResponse(ctx context.Context, body TigrisRotateGlobalAppKeySecretJSONRequestBody, reqEditors ...RequestEditorFn) (*TigrisRotateGlobalAppKeySecretResponse, error) { + rsp, err := c.TigrisRotateGlobalAppKeySecret(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseTigrisRotateGlobalAppKeySecretResponse(rsp) +} + +// TigrisUpdateGlobalAppKeyWithBodyWithResponse request with arbitrary body returning *TigrisUpdateGlobalAppKeyResponse +func (c *ClientWithResponses) TigrisUpdateGlobalAppKeyWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*TigrisUpdateGlobalAppKeyResponse, error) { + rsp, err := c.TigrisUpdateGlobalAppKeyWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseTigrisUpdateGlobalAppKeyResponse(rsp) +} + +func (c *ClientWithResponses) TigrisUpdateGlobalAppKeyWithResponse(ctx context.Context, body TigrisUpdateGlobalAppKeyJSONRequestBody, reqEditors ...RequestEditorFn) (*TigrisUpdateGlobalAppKeyResponse, error) { + rsp, err := c.TigrisUpdateGlobalAppKey(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseTigrisUpdateGlobalAppKeyResponse(rsp) +} + // AuthCreateInvitationsWithBodyWithResponse request with arbitrary body returning *AuthCreateInvitationsResponse func (c *ClientWithResponses) AuthCreateInvitationsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*AuthCreateInvitationsResponse, error) { rsp, err := c.AuthCreateInvitationsWithBody(ctx, contentType, body, reqEditors...) @@ -11446,6 +12095,171 @@ func (c *ClientWithResponses) SearchCreateOrUpdateIndexWithResponse(ctx context. return ParseSearchCreateOrUpdateIndexResponse(rsp) } +// ParseTigrisListGlobalAppKeysResponse parses an HTTP response from a TigrisListGlobalAppKeysWithResponse call +func ParseTigrisListGlobalAppKeysResponse(rsp *http.Response) (*TigrisListGlobalAppKeysResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &TigrisListGlobalAppKeysResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ListGlobalAppKeysResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Status + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseTigrisCreateGlobalAppKeyResponse parses an HTTP response from a TigrisCreateGlobalAppKeyWithResponse call +func ParseTigrisCreateGlobalAppKeyResponse(rsp *http.Response) (*TigrisCreateGlobalAppKeyResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &TigrisCreateGlobalAppKeyResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest CreateGlobalAppKeyResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Status + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseTigrisDeleteGlobalAppKeyResponse parses an HTTP response from a TigrisDeleteGlobalAppKeyWithResponse call +func ParseTigrisDeleteGlobalAppKeyResponse(rsp *http.Response) (*TigrisDeleteGlobalAppKeyResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &TigrisDeleteGlobalAppKeyResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest DeleteGlobalAppKeyResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Status + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseTigrisRotateGlobalAppKeySecretResponse parses an HTTP response from a TigrisRotateGlobalAppKeySecretWithResponse call +func ParseTigrisRotateGlobalAppKeySecretResponse(rsp *http.Response) (*TigrisRotateGlobalAppKeySecretResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &TigrisRotateGlobalAppKeySecretResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest RotateGlobalAppKeySecretResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Status + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + +// ParseTigrisUpdateGlobalAppKeyResponse parses an HTTP response from a TigrisUpdateGlobalAppKeyWithResponse call +func ParseTigrisUpdateGlobalAppKeyResponse(rsp *http.Response) (*TigrisUpdateGlobalAppKeyResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &TigrisUpdateGlobalAppKeyResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest UpdateGlobalAppKeyResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Status + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + // ParseAuthCreateInvitationsResponse parses an HTTP response from a AuthCreateInvitationsWithResponse call func ParseAuthCreateInvitationsResponse(rsp *http.Response) (*AuthCreateInvitationsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) diff --git a/api/proto b/api/proto index d5c440d..b464756 160000 --- a/api/proto +++ b/api/proto @@ -1 +1 @@ -Subproject commit d5c440d165b82afc135c7b1d12ed9be6ef26a72e +Subproject commit b4647568a5587b5e80f64415dad35bc7a7e8edef diff --git a/api/server/v1/api.pb.go b/api/server/v1/api.pb.go index e99fc27..144c4a8 100644 --- a/api/server/v1/api.pb.go +++ b/api/server/v1/api.pb.go @@ -6123,6 +6123,624 @@ func (x *RotateAppKeyResponse) GetAppKey() *AppKey { return nil } +// Request creation of global app key +type CreateGlobalAppKeyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A human readable app name + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // A human readable app description + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +} + +func (x *CreateGlobalAppKeyRequest) Reset() { + *x = CreateGlobalAppKeyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_server_v1_api_proto_msgTypes[97] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateGlobalAppKeyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateGlobalAppKeyRequest) ProtoMessage() {} + +func (x *CreateGlobalAppKeyRequest) ProtoReflect() protoreflect.Message { + mi := &file_server_v1_api_proto_msgTypes[97] + 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 CreateGlobalAppKeyRequest.ProtoReflect.Descriptor instead. +func (*CreateGlobalAppKeyRequest) Descriptor() ([]byte, []int) { + return file_server_v1_api_proto_rawDescGZIP(), []int{97} +} + +func (x *CreateGlobalAppKeyRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CreateGlobalAppKeyRequest) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +// CreateGlobalAppKeyResponse returns created global app key +type CreateGlobalAppKeyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // created app object + CreatedAppKey *GlobalAppKey `protobuf:"bytes,1,opt,name=created_app_key,json=createdAppKey,proto3" json:"created_app_key,omitempty"` +} + +func (x *CreateGlobalAppKeyResponse) Reset() { + *x = CreateGlobalAppKeyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_server_v1_api_proto_msgTypes[98] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateGlobalAppKeyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateGlobalAppKeyResponse) ProtoMessage() {} + +func (x *CreateGlobalAppKeyResponse) ProtoReflect() protoreflect.Message { + mi := &file_server_v1_api_proto_msgTypes[98] + 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 CreateGlobalAppKeyResponse.ProtoReflect.Descriptor instead. +func (*CreateGlobalAppKeyResponse) Descriptor() ([]byte, []int) { + return file_server_v1_api_proto_rawDescGZIP(), []int{98} +} + +func (x *CreateGlobalAppKeyResponse) GetCreatedAppKey() *GlobalAppKey { + if x != nil { + return x.CreatedAppKey + } + return nil +} + +// To update the description of the global app key +type UpdateGlobalAppKeyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // app key id - this is not allowed to update + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // A new human readable app name + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + // A new human readable app description + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` +} + +func (x *UpdateGlobalAppKeyRequest) Reset() { + *x = UpdateGlobalAppKeyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_server_v1_api_proto_msgTypes[99] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateGlobalAppKeyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateGlobalAppKeyRequest) ProtoMessage() {} + +func (x *UpdateGlobalAppKeyRequest) ProtoReflect() protoreflect.Message { + mi := &file_server_v1_api_proto_msgTypes[99] + 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 UpdateGlobalAppKeyRequest.ProtoReflect.Descriptor instead. +func (*UpdateGlobalAppKeyRequest) Descriptor() ([]byte, []int) { + return file_server_v1_api_proto_rawDescGZIP(), []int{99} +} + +func (x *UpdateGlobalAppKeyRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *UpdateGlobalAppKeyRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *UpdateGlobalAppKeyRequest) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +// Returns response for updating the global app key description +type UpdateGlobalAppKeyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // updated global app key object + UpdatedAppKey *GlobalAppKey `protobuf:"bytes,1,opt,name=updated_app_key,json=updatedAppKey,proto3" json:"updated_app_key,omitempty"` +} + +func (x *UpdateGlobalAppKeyResponse) Reset() { + *x = UpdateGlobalAppKeyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_server_v1_api_proto_msgTypes[100] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateGlobalAppKeyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateGlobalAppKeyResponse) ProtoMessage() {} + +func (x *UpdateGlobalAppKeyResponse) ProtoReflect() protoreflect.Message { + mi := &file_server_v1_api_proto_msgTypes[100] + 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 UpdateGlobalAppKeyResponse.ProtoReflect.Descriptor instead. +func (*UpdateGlobalAppKeyResponse) Descriptor() ([]byte, []int) { + return file_server_v1_api_proto_rawDescGZIP(), []int{100} +} + +func (x *UpdateGlobalAppKeyResponse) GetUpdatedAppKey() *GlobalAppKey { + if x != nil { + return x.UpdatedAppKey + } + return nil +} + +// The global AppKey +type GlobalAppKey struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Generated client id + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // A human readable app name + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + // A human readable app description + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Generated app secret + Secret string `protobuf:"bytes,4,opt,name=secret,proto3" json:"secret,omitempty"` + // Created at + CreatedAt int64 `protobuf:"varint,5,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + // Created by + CreatedBy string `protobuf:"bytes,6,opt,name=created_by,json=createdBy,proto3" json:"created_by,omitempty"` + // Updated at + UpdatedAt int64 `protobuf:"varint,7,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + // Updated by + UpdatedBy string `protobuf:"bytes,8,opt,name=updated_by,json=updatedBy,proto3" json:"updated_by,omitempty"` +} + +func (x *GlobalAppKey) Reset() { + *x = GlobalAppKey{} + if protoimpl.UnsafeEnabled { + mi := &file_server_v1_api_proto_msgTypes[101] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GlobalAppKey) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GlobalAppKey) ProtoMessage() {} + +func (x *GlobalAppKey) ProtoReflect() protoreflect.Message { + mi := &file_server_v1_api_proto_msgTypes[101] + 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 GlobalAppKey.ProtoReflect.Descriptor instead. +func (*GlobalAppKey) Descriptor() ([]byte, []int) { + return file_server_v1_api_proto_rawDescGZIP(), []int{101} +} + +func (x *GlobalAppKey) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *GlobalAppKey) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *GlobalAppKey) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *GlobalAppKey) GetSecret() string { + if x != nil { + return x.Secret + } + return "" +} + +func (x *GlobalAppKey) GetCreatedAt() int64 { + if x != nil { + return x.CreatedAt + } + return 0 +} + +func (x *GlobalAppKey) GetCreatedBy() string { + if x != nil { + return x.CreatedBy + } + return "" +} + +func (x *GlobalAppKey) GetUpdatedAt() int64 { + if x != nil { + return x.UpdatedAt + } + return 0 +} + +func (x *GlobalAppKey) GetUpdatedBy() string { + if x != nil { + return x.UpdatedBy + } + return "" +} + +// Request listing of all the global app keys those are visible to requesting actor +type ListGlobalAppKeysRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ListGlobalAppKeysRequest) Reset() { + *x = ListGlobalAppKeysRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_server_v1_api_proto_msgTypes[102] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListGlobalAppKeysRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListGlobalAppKeysRequest) ProtoMessage() {} + +func (x *ListGlobalAppKeysRequest) ProtoReflect() protoreflect.Message { + mi := &file_server_v1_api_proto_msgTypes[102] + 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 ListGlobalAppKeysRequest.ProtoReflect.Descriptor instead. +func (*ListGlobalAppKeysRequest) Descriptor() ([]byte, []int) { + return file_server_v1_api_proto_rawDescGZIP(), []int{102} +} + +// ListGlobalAppKeysResponse returns one or more visible global app keys to user +type ListGlobalAppKeysResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AppKeys []*GlobalAppKey `protobuf:"bytes,1,rep,name=app_keys,json=appKeys,proto3" json:"app_keys,omitempty"` +} + +func (x *ListGlobalAppKeysResponse) Reset() { + *x = ListGlobalAppKeysResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_server_v1_api_proto_msgTypes[103] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListGlobalAppKeysResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListGlobalAppKeysResponse) ProtoMessage() {} + +func (x *ListGlobalAppKeysResponse) ProtoReflect() protoreflect.Message { + mi := &file_server_v1_api_proto_msgTypes[103] + 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 ListGlobalAppKeysResponse.ProtoReflect.Descriptor instead. +func (*ListGlobalAppKeysResponse) Descriptor() ([]byte, []int) { + return file_server_v1_api_proto_rawDescGZIP(), []int{103} +} + +func (x *ListGlobalAppKeysResponse) GetAppKeys() []*GlobalAppKey { + if x != nil { + return x.AppKeys + } + return nil +} + +// Request deletion of an global app key +type DeleteGlobalAppKeyRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // app_key id + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *DeleteGlobalAppKeyRequest) Reset() { + *x = DeleteGlobalAppKeyRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_server_v1_api_proto_msgTypes[104] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteGlobalAppKeyRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteGlobalAppKeyRequest) ProtoMessage() {} + +func (x *DeleteGlobalAppKeyRequest) ProtoReflect() protoreflect.Message { + mi := &file_server_v1_api_proto_msgTypes[104] + 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 DeleteGlobalAppKeyRequest.ProtoReflect.Descriptor instead. +func (*DeleteGlobalAppKeyRequest) Descriptor() ([]byte, []int) { + return file_server_v1_api_proto_rawDescGZIP(), []int{104} +} + +func (x *DeleteGlobalAppKeyRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +// AppKeys returns the flag to convey if global app key was deleted +type DeleteGlobalAppKeyResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // status flag for delete operation + Deleted bool `protobuf:"varint,1,opt,name=deleted,proto3" json:"deleted,omitempty"` +} + +func (x *DeleteGlobalAppKeyResponse) Reset() { + *x = DeleteGlobalAppKeyResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_server_v1_api_proto_msgTypes[105] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteGlobalAppKeyResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteGlobalAppKeyResponse) ProtoMessage() {} + +func (x *DeleteGlobalAppKeyResponse) ProtoReflect() protoreflect.Message { + mi := &file_server_v1_api_proto_msgTypes[105] + 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 DeleteGlobalAppKeyResponse.ProtoReflect.Descriptor instead. +func (*DeleteGlobalAppKeyResponse) Descriptor() ([]byte, []int) { + return file_server_v1_api_proto_rawDescGZIP(), []int{105} +} + +func (x *DeleteGlobalAppKeyResponse) GetDeleted() bool { + if x != nil { + return x.Deleted + } + return false +} + +// Request rotation of an app key secret +type RotateGlobalAppKeySecretRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // global app key id + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *RotateGlobalAppKeySecretRequest) Reset() { + *x = RotateGlobalAppKeySecretRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_server_v1_api_proto_msgTypes[106] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RotateGlobalAppKeySecretRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RotateGlobalAppKeySecretRequest) ProtoMessage() {} + +func (x *RotateGlobalAppKeySecretRequest) ProtoReflect() protoreflect.Message { + mi := &file_server_v1_api_proto_msgTypes[106] + 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 RotateGlobalAppKeySecretRequest.ProtoReflect.Descriptor instead. +func (*RotateGlobalAppKeySecretRequest) Descriptor() ([]byte, []int) { + return file_server_v1_api_proto_rawDescGZIP(), []int{106} +} + +func (x *RotateGlobalAppKeySecretRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +// RotateGlobalAppKeySecretResponse returns the new app key with rotated secret +type RotateGlobalAppKeySecretResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A new global app key with rotated secret. + AppKey *GlobalAppKey `protobuf:"bytes,1,opt,name=app_key,json=appKey,proto3" json:"app_key,omitempty"` +} + +func (x *RotateGlobalAppKeySecretResponse) Reset() { + *x = RotateGlobalAppKeySecretResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_server_v1_api_proto_msgTypes[107] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RotateGlobalAppKeySecretResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RotateGlobalAppKeySecretResponse) ProtoMessage() {} + +func (x *RotateGlobalAppKeySecretResponse) ProtoReflect() protoreflect.Message { + mi := &file_server_v1_api_proto_msgTypes[107] + 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 RotateGlobalAppKeySecretResponse.ProtoReflect.Descriptor instead. +func (*RotateGlobalAppKeySecretResponse) Descriptor() ([]byte, []int) { + return file_server_v1_api_proto_rawDescGZIP(), []int{107} +} + +func (x *RotateGlobalAppKeySecretResponse) GetAppKey() *GlobalAppKey { + if x != nil { + return x.AppKey + } + return nil +} + var File_server_v1_api_proto protoreflect.FileDescriptor var file_server_v1_api_proto_rawDesc = []byte{ @@ -6816,545 +7434,667 @@ var file_server_v1_api_proto_rawDesc = []byte{ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x61, 0x70, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, - 0x52, 0x06, 0x61, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x32, 0x99, 0x30, 0x0a, 0x06, 0x54, 0x69, 0x67, - 0x72, 0x69, 0x73, 0x12, 0xc4, 0x01, 0x0a, 0x10, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, - 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x27, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, - 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5f, 0xba, 0x47, 0x1f, 0x0a, 0x08, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x13, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x20, - 0x61, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x37, 0x3a, 0x01, 0x2a, 0x22, 0x32, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x12, 0xc9, 0x01, 0x0a, 0x11, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x27, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x69, 0x67, 0x72, - 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x52, 0x06, 0x61, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x22, 0x51, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x61, 0x0a, 0x1a, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, + 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x22, 0x61, + 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, + 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x61, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x43, 0x0a, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x70, 0x70, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, + 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, + 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x70, + 0x70, 0x4b, 0x65, 0x79, 0x22, 0xe8, 0x01, 0x0a, 0x0c, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, + 0x70, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, + 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x22, + 0x1a, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, 0x70, + 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x53, 0x0a, 0x19, 0x4c, + 0x69, 0x73, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, + 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x69, 0x67, + 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x07, 0x61, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x73, + 0x22, 0x2b, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x36, 0x0a, + 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, 0x70, + 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x31, 0x0a, 0x1f, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x58, 0x0a, 0x20, 0x52, 0x6f, 0x74, 0x61, + 0x74, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x07, + 0x61, 0x70, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x06, 0x61, 0x70, 0x70, 0x4b, + 0x65, 0x79, 0x32, 0xf0, 0x37, 0x0a, 0x06, 0x54, 0x69, 0x67, 0x72, 0x69, 0x73, 0x12, 0xc4, 0x01, + 0x0a, 0x10, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x26, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x76, 0x31, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x69, 0x67, + 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x61, 0xba, 0x47, 0x20, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x12, 0x14, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x61, 0x20, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x3a, 0x01, - 0x2a, 0x22, 0x33, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0xd3, 0x01, 0x0a, 0x13, 0x52, 0x6f, 0x6c, 0x6c, 0x62, - 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, - 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x69, 0x67, 0x72, - 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, - 0x63, 0x6b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x65, 0xba, 0x47, 0x22, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x16, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x61, - 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x3a, 0x3a, 0x01, 0x2a, 0x22, 0x35, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0xbd, 0x01, 0x0a, - 0x06, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x1c, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x76, 0xba, 0x47, 0x1f, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4e, 0x3a, 0x01, - 0x2a, 0x22, 0x49, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0xcd, 0x01, 0x0a, - 0x07, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x12, 0x1d, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, - 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x82, 0x01, 0xba, 0x47, 0x2a, 0x0a, 0x0b, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x49, 0x6e, 0x73, 0x65, - 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4f, 0x3a, 0x01, 0x2a, - 0x1a, 0x4a, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, + 0x6e, 0x73, 0x65, 0x22, 0x5f, 0xba, 0x47, 0x1f, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x12, 0x13, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x3a, 0x01, 0x2a, + 0x22, 0x32, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x12, 0xbd, 0x01, 0x0a, - 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x76, 0xba, 0x47, 0x1f, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4e, 0x3a, 0x01, - 0x2a, 0x2a, 0x49, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0xbe, 0x01, 0x0a, - 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x77, 0xba, 0x47, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4e, 0x3a, - 0x01, 0x2a, 0x1a, 0x49, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0xb5, 0x01, - 0x0a, 0x04, 0x52, 0x65, 0x61, 0x64, 0x12, 0x1a, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x72, 0xba, 0x47, 0x1d, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x0e, 0x52, 0x65, 0x61, 0x64, 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x3a, 0x01, 0x2a, 0x22, 0x47, 0x2f, 0x76, 0x31, 0x2f, + 0x65, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x62, + 0x65, 0x67, 0x69, 0x6e, 0x12, 0xc9, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x74, 0x69, 0x67, + 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x61, 0xba, + 0x47, 0x20, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x14, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x20, 0x61, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x3a, 0x01, 0x2a, 0x22, 0x33, 0x2f, 0x76, 0x31, + 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x12, 0xd3, 0x01, 0x0a, 0x13, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, + 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, + 0x6b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x65, 0xba, 0x47, 0x22, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x16, + 0x52, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x3a, 0x01, 0x2a, 0x22, + 0x35, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x6f, + 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0xbd, 0x01, 0x0a, 0x06, 0x49, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x12, 0x1c, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, + 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, + 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x76, + 0xba, 0x47, 0x1f, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x10, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4e, 0x3a, 0x01, 0x2a, 0x22, 0x49, 0x2f, 0x76, 0x31, + 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0xcd, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x12, 0x1d, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1e, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x82, 0x01, 0xba, 0x47, 0x2a, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, + 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4f, 0x3a, 0x01, 0x2a, 0x1a, 0x4a, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x72, - 0x65, 0x61, 0x64, 0x30, 0x01, 0x12, 0xb8, 0x01, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x1b, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, - 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x74, 0xba, 0x47, 0x1e, 0x0a, - 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x4d, 0x3a, 0x01, 0x2a, 0x22, 0x48, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, - 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0xe1, 0x01, 0x0a, 0x14, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2a, 0x2e, 0x74, 0x69, 0x67, 0x72, - 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x70, 0xba, 0x47, 0x1a, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4d, 0x3a, 0x01, 0x2a, 0x22, 0x48, 0x2f, 0x76, 0x31, 0x2f, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0xf7, 0x01, 0x0a, 0x10, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x30, 0x2e, 0x74, 0x69, 0x67, 0x72, - 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x74, 0x69, - 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7e, - 0xba, 0x47, 0x21, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x12, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x54, 0x3a, 0x01, 0x2a, 0x22, 0x4f, 0x2f, - 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0xc4, - 0x01, 0x0a, 0x07, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x2e, 0x74, 0x69, 0x67, - 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7d, 0xba, 0x47, 0x25, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, - 0x6e, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4f, 0x3a, 0x01, 0x2a, 0x22, 0x4a, 0x2f, 0x76, 0x31, 0x2f, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x65, 0x78, - 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x12, 0xbf, 0x01, 0x0a, 0x06, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x12, 0x1c, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, - 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x76, 0xba, - 0x47, 0x1f, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x10, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4e, 0x3a, 0x01, 0x2a, 0x22, 0x49, 0x2f, 0x76, 0x31, 0x2f, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x30, 0x01, 0x12, 0xbd, 0x01, 0x0a, 0x06, 0x49, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x12, 0x1c, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, - 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x76, 0xba, 0x47, 0x1f, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x10, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4e, 0x3a, 0x01, 0x2a, 0x22, 0x49, 0x2f, 0x76, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x12, 0xbd, 0x01, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x12, 0x1c, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x76, + 0xba, 0x47, 0x1f, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4e, 0x3a, 0x01, 0x2a, 0x2a, 0x49, 0x2f, 0x76, 0x31, + 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0xbe, 0x01, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x12, 0x1c, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x77, + 0xba, 0x47, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4e, 0x3a, 0x01, 0x2a, 0x1a, 0x49, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x2f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x12, 0xff, 0x01, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x81, 0x01, 0xba, 0x47, 0x2c, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x20, 0x6f, 0x72, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x3a, 0x01, 0x2a, - 0x22, 0x47, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, + 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0xb5, 0x01, 0x0a, 0x04, 0x52, 0x65, 0x61, 0x64, + 0x12, 0x1a, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74, + 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x72, 0xba, 0x47, 0x1d, 0x0a, 0x0b, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x52, 0x65, 0x61, + 0x64, 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x4c, 0x3a, 0x01, 0x2a, 0x22, 0x47, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x72, 0x65, 0x61, 0x64, 0x30, 0x01, 0x12, + 0xb8, 0x01, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x74, 0x69, 0x67, 0x72, + 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x74, 0xba, 0x47, 0x1e, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4d, 0x3a, 0x01, 0x2a, + 0x22, 0x48, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0xfe, 0x01, 0x0a, 0x19, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, - 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, - 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7e, 0xba, 0x47, 0x36, 0x0a, - 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, - 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x3a, 0x01, 0x2a, 0x22, 0x3a, - 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0xc8, 0x01, 0x0a, 0x0e, 0x44, - 0x72, 0x6f, 0x70, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, - 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x72, - 0x6f, 0x70, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x72, 0x6f, 0x70, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0xba, 0x47, 0x1e, 0x0a, - 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x44, 0x72, - 0x6f, 0x70, 0x20, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x42, 0x3a, 0x01, 0x2a, 0x2a, 0x3d, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xe1, 0x01, 0x0a, 0x14, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x2a, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2b, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x70, 0xba, 0x47, + 0x1a, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0b, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x4d, 0x3a, 0x01, 0x2a, 0x22, 0x48, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0xf7, + 0x01, 0x0a, 0x10, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x30, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7e, 0xba, 0x47, 0x21, 0x0a, 0x0b, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x20, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x54, 0x3a, 0x01, 0x2a, 0x22, 0x4f, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, + 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x7d, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0xc4, 0x01, 0x0a, 0x07, 0x45, 0x78, 0x70, + 0x6c, 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x7d, 0xba, 0x47, 0x25, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x16, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x20, 0x52, 0x65, 0x61, 0x64, + 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4f, + 0x3a, 0x01, 0x2a, 0x22, 0x4a, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x12, + 0xbf, 0x01, 0x0a, 0x06, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x1c, 0x2e, 0x74, 0x69, 0x67, + 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, + 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x76, 0xba, 0x47, 0x1f, 0x0a, 0x0b, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x4e, 0x3a, 0x01, 0x2a, 0x22, 0x49, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x30, + 0x01, 0x12, 0xbd, 0x01, 0x0a, 0x06, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1c, 0x2e, 0x74, + 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x74, 0x69, 0x67, + 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x76, 0xba, 0x47, 0x1f, 0x0a, 0x0b, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x49, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x20, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x4e, 0x3a, 0x01, 0x2a, 0x22, 0x49, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, - 0x2f, 0x64, 0x72, 0x6f, 0x70, 0x12, 0x89, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x22, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x69, 0x67, - 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x30, 0xba, 0x47, 0x19, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x0d, - 0x4c, 0x69, 0x73, 0x74, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x12, 0xb4, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, - 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0xba, 0x47, 0x1c, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x12, 0x2b, 0x2f, 0x76, 0x31, + 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x69, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x12, 0xff, 0x01, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, + 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, + 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x81, 0x01, 0xba, 0x47, 0x2c, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4c, 0x3a, 0x01, 0x2a, 0x22, 0x47, 0x2f, 0x76, 0x31, 0x2f, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0xfe, 0x01, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x2f, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7e, 0xba, 0x47, 0x36, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x6f, + 0x72, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x3a, 0x01, 0x2a, 0x22, 0x3a, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, + 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0xc8, 0x01, 0x0a, 0x0e, 0x44, 0x72, 0x6f, 0x70, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x72, 0x6f, 0x70, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x72, + 0x6f, 0x70, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0xba, 0x47, 0x1e, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x44, 0x72, 0x6f, 0x70, 0x20, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x3a, 0x01, 0x2a, + 0x2a, 0x3d, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, 0x72, 0x6f, 0x70, 0x12, + 0x89, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x12, 0x22, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0xba, 0x47, 0x19, 0x0a, 0x08, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, + 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0xb4, 0x01, 0x0a, 0x0f, + 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x25, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, + 0xba, 0x47, 0x1c, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x10, 0x4c, + 0x69, 0x73, 0x74, 0x20, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x12, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0xa1, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x74, 0x69, 0x67, 0x72, + 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x45, 0xba, 0x47, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x0e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0xc1, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, + 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x65, 0xba, 0x47, 0x3a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x12, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x2a, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa1, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x2e, 0x74, 0x69, 0x67, + 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0xb8, 0x01, 0x0a, 0x10, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x26, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x53, 0xba, 0x47, 0x1d, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, + 0x11, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x31, + 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0xc3, 0x01, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x22, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x45, 0xba, 0x47, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x12, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, - 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0xc1, 0x01, 0x0a, - 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, - 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x65, 0xba, 0x47, 0x3a, 0x0a, 0x08, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6c, 0x6c, - 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, - 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, - 0x2a, 0x2a, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x12, 0xb8, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, - 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0xba, 0x47, 0x1d, 0x0a, 0x08, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x11, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x20, - 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, - 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, + 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x6a, 0xba, 0x47, 0x24, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x18, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x3a, 0x01, + 0x2a, 0x22, 0x38, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0xc3, 0x01, 0x0a, 0x0c, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x22, 0x2e, 0x74, - 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x73, 0x65, 0x2f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x2f, 0x7b, 0x62, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x7d, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0xc3, 0x01, 0x0a, 0x0c, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x22, 0x2e, 0x74, + 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6a, 0xba, 0x47, 0x24, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x64, + 0x62, 0x61, 0x73, 0x65, 0x12, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x3d, 0x3a, 0x01, 0x2a, 0x22, 0x38, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, + 0xe4, 0x93, 0x02, 0x3d, 0x3a, 0x01, 0x2a, 0x2a, 0x38, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, - 0x73, 0x2f, 0x7b, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x7d, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0xc3, 0x01, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, - 0x63, 0x68, 0x12, 0x22, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, + 0x73, 0x2f, 0x7b, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x7d, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x12, 0xae, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x65, 0x73, 0x12, 0x22, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6a, 0xba, 0x47, 0x24, - 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x18, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x20, 0x61, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x62, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x3a, 0x01, 0x2a, 0x2a, 0x38, 0x2f, - 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x62, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x2f, 0x7b, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x7d, - 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0xae, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, - 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, - 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, - 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x55, 0xba, 0x47, 0x22, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x12, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, - 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, + 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x55, 0xba, 0x47, 0x22, + 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x16, 0x4c, 0x69, 0x73, 0x74, + 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, + 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x65, 0x73, 0x12, 0xdc, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x74, 0x69, 0x67, 0x72, + 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x71, + 0xba, 0x47, 0x22, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x13, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x20, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x46, 0x3a, 0x01, 0x2a, 0x22, 0x41, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, - 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0xdc, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x28, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x69, 0x67, 0x72, - 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x71, 0xba, 0x47, 0x22, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x13, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x20, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x46, 0x3a, 0x01, 0x2a, 0x22, 0x41, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0xb5, 0x01, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, - 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, - 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, - 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x5c, 0xba, 0x47, 0x27, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x20, 0x6b, 0x65, 0x79, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x61, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x12, 0xbb, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, + 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, + 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x50, 0xba, + 0x47, 0x2e, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x61, 0x70, 0x70, 0x20, 0x6b, 0x65, 0x79, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, - 0xc8, 0x01, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, - 0x12, 0x22, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6f, 0xba, 0x47, 0x3a, 0x0a, 0x10, - 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x65, 0x79, 0x73, - 0x12, 0x26, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x61, 0x70, 0x70, 0x20, 0x6b, 0x65, 0x79, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, - 0x2a, 0x22, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, - 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x6b, - 0x65, 0x79, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0xb5, 0x01, 0x0a, 0x0c, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x2e, 0x74, 0x69, - 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x23, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5c, 0xba, 0x47, 0x27, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x13, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x20, 0x6b, 0x65, 0x79, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x2a, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x12, 0xaa, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x4b, 0x65, - 0x79, 0x73, 0x12, 0x21, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0xba, 0x47, 0x29, 0x0a, 0x10, - 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x65, 0x79, 0x73, - 0x12, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, - 0x70, 0x70, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, - 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x12, - 0xc2, 0x01, 0x0a, 0x12, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, - 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x69, 0x67, - 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x74, 0x61, 0x74, - 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x63, 0xba, 0x47, 0x2e, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1a, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x73, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x73, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x76, 0x31, - 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x72, 0x6f, - 0x74, 0x61, 0x74, 0x65, 0x42, 0x80, 0x13, 0xba, 0x47, 0xbb, 0x12, 0x12, 0x96, 0x02, 0x0a, 0x14, - 0x54, 0x69, 0x67, 0x72, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x20, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x12, 0xac, 0x01, 0x0a, 0x23, 0x23, 0x20, 0x4f, 0x76, 0x65, 0x72, 0x76, - 0x69, 0x65, 0x77, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x69, 0x73, 0x20, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x61, 0x72, - 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x41, 0x50, 0x49, 0x73, 0x2e, 0x20, - 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x73, - 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x2d, - 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, - 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x63, 0x6f, 0x64, - 0x65, 0x73, 0x2e, 0x2a, 0x48, 0x0a, 0x0e, 0x41, 0x70, 0x61, 0x63, 0x68, 0x65, 0x20, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, - 0x64, 0x61, 0x74, 0x61, 0x2f, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x2f, 0x62, 0x6c, 0x6f, 0x62, - 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x32, 0x05, 0x30, - 0x2e, 0x30, 0x2e, 0x31, 0x1a, 0x34, 0x0a, 0x24, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, - 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x74, 0x69, 0x67, 0x72, - 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0x0c, 0x54, 0x69, - 0x67, 0x72, 0x69, 0x73, 0x20, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x1a, 0x22, 0x0a, 0x15, 0x68, 0x74, - 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x38, - 0x30, 0x38, 0x31, 0x12, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x2a, 0x22, - 0x3a, 0x20, 0x0a, 0x1e, 0x0a, 0x0a, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x41, 0x75, 0x74, 0x68, - 0x12, 0x10, 0x0a, 0x0e, 0x0a, 0x04, 0x68, 0x74, 0x74, 0x70, 0x2a, 0x06, 0x62, 0x65, 0x61, 0x72, - 0x65, 0x72, 0x32, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x41, 0x75, - 0x74, 0x68, 0x12, 0x00, 0x3a, 0x99, 0x03, 0x0a, 0x0e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x86, 0x03, 0x54, 0x68, 0x65, 0x20, 0x61, 0x75, - 0x74, 0x68, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x50, - 0x49, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x73, 0x20, 0x4f, 0x41, 0x75, 0x74, 0x68, - 0x20, 0x32, 0x2e, 0x30, 0x20, 0x41, 0x50, 0x49, 0x73, 0x2e, 0x20, 0x54, 0x69, 0x67, 0x72, 0x69, - 0x73, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x20, 0x70, 0x6c, 0x75, 0x67, 0x67, - 0x61, 0x62, 0x6c, 0x65, 0x20, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x2e, 0x20, 0x50, 0x61, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x60, 0x2d, 0x48, 0x20, 0x22, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x20, - 0x65, 0x79, 0x4a, 0x68, 0x62, 0x47, 0x63, 0x69, 0x4f, 0x69, 0x4a, 0x53, 0x55, 0x7a, 0x49, 0x31, - 0x4e, 0x69, 0x49, 0x73, 0x49, 0x6e, 0x52, 0x35, 0x63, 0x43, 0x49, 0x36, 0x49, 0x6b, 0x70, 0x58, - 0x56, 0x43, 0x49, 0x73, 0x49, 0x6d, 0x74, 0x70, 0x5a, 0x43, 0x49, 0x36, 0x49, 0x22, 0x60, 0x28, - 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x79, 0x6f, 0x75, 0x72, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x29, 0x2e, 0x20, 0x41, 0x6c, 0x6c, - 0x20, 0x41, 0x50, 0x49, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x6d, 0x75, - 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, - 0x48, 0x54, 0x54, 0x50, 0x53, 0x2e, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x6d, 0x61, 0x64, - 0x65, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x20, 0x48, 0x54, 0x54, - 0x50, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x2e, 0x20, 0x41, 0x50, 0x49, - 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, - 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x2e, - 0x3a, 0xb4, 0x01, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x9f, 0x01, 0x54, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x73, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x41, 0x50, 0x49, - 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, - 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x20, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x20, - 0x41, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x20, 0x63, 0x61, 0x6e, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, - 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x3a, 0x82, 0x02, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x12, 0xf5, 0x01, 0x45, 0x76, 0x65, 0x72, 0x79, 0x20, 0x54, 0x69, 0x67, - 0x72, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x63, 0x6f, 0x6d, - 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x20, - 0x6f, 0x6e, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x42, 0x2c, - 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x73, 0x74, - 0x20, 0x72, 0x65, 0x73, 0x69, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, - 0x61, 0x74, 0x74, 0x6c, 0x65, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x70, 0x65, - 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x64, 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x20, 0x41, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x20, 0x69, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x75, 0x74, 0x6f, - 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x79, 0x6f, - 0x75, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x3a, 0xd9, 0x01, 0x0a, - 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0xcc, 0x01, 0x54, 0x68, 0x65, 0x20, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, - 0x6f, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x20, 0x41, 0x20, - 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, - 0x63, 0x61, 0x6e, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, - 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x20, 0x41, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x69, 0x73, 0x20, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, - 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x68, - 0x65, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x3a, 0x88, 0x01, 0x0a, 0x0b, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x79, 0x54, 0x68, 0x65, 0x20, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0xce, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x29, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, 0x70, + 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x63, 0xba, 0x47, 0x41, + 0x0a, 0x10, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x65, + 0x79, 0x73, 0x12, 0x2d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x61, 0x70, 0x70, 0x20, 0x6b, 0x65, + 0x79, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x1a, 0x14, 0x2f, 0x76, 0x31, 0x2f, + 0x61, 0x70, 0x70, 0x73, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x12, 0xbb, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, + 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x50, 0xba, 0x47, + 0x2e, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, + 0x65, 0x79, 0x73, 0x12, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x61, 0x70, 0x70, 0x20, 0x6b, 0x65, 0x79, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x2a, 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, + 0x70, 0x73, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0xb0, + 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, 0x70, + 0x4b, 0x65, 0x79, 0x73, 0x12, 0x27, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, + 0x70, 0x70, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0xba, 0x47, 0x30, 0x0a, 0x10, 0x41, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1c, + 0x4c, 0x69, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x61, 0x70, 0x70, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x6b, 0x65, 0x79, + 0x73, 0x12, 0xd4, 0x01, 0x0a, 0x18, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x2e, + 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x6f, 0x74, 0x61, 0x74, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, + 0x79, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, + 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x6f, 0x74, 0x61, 0x74, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x41, 0x70, 0x70, 0x4b, 0x65, + 0x79, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x57, 0xba, 0x47, 0x35, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x21, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x61, 0x70, 0x70, 0x20, 0x6b, + 0x65, 0x79, 0x20, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, + 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x6b, 0x65, 0x79, + 0x73, 0x2f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x12, 0xb5, 0x01, 0x0a, 0x0c, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x2e, 0x74, 0x69, 0x67, 0x72, + 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, + 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x5c, 0xba, 0x47, 0x27, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x20, 0x6b, 0x65, 0x79, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, + 0x61, 0x70, 0x70, 0x73, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x12, 0xc8, 0x01, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, + 0x79, 0x12, 0x22, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, + 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6f, 0xba, 0x47, 0x3a, 0x0a, + 0x10, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x65, 0x79, + 0x73, 0x12, 0x26, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x61, 0x70, 0x70, 0x20, 0x6b, 0x65, 0x79, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, + 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, + 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0xb5, 0x01, 0x0a, 0x0c, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x2e, 0x74, + 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x23, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5c, 0xba, 0x47, 0x27, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x13, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x20, 0x6b, 0x65, + 0x79, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x2a, 0x27, 0x2f, 0x76, 0x31, 0x2f, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x12, 0xaa, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x4b, + 0x65, 0x79, 0x73, 0x12, 0x21, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x70, 0x70, 0x4b, 0x65, + 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0xba, 0x47, 0x29, 0x0a, + 0x10, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4b, 0x65, 0x79, + 0x73, 0x12, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x61, 0x70, 0x70, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, + 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x6b, 0x65, 0x79, 0x73, + 0x12, 0xc2, 0x01, 0x0a, 0x12, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, + 0x79, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x41, 0x70, + 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x69, + 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x74, 0x61, + 0x74, 0x65, 0x41, 0x70, 0x70, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x63, 0xba, 0x47, 0x2e, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1a, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x76, + 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x7d, 0x2f, 0x61, 0x70, 0x70, 0x73, 0x2f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x72, + 0x6f, 0x74, 0x61, 0x74, 0x65, 0x42, 0x80, 0x13, 0xba, 0x47, 0xbb, 0x12, 0x12, 0x96, 0x02, 0x0a, + 0x14, 0x54, 0x69, 0x67, 0x72, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x20, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0xac, 0x01, 0x0a, 0x23, 0x23, 0x20, 0x4f, 0x76, 0x65, 0x72, + 0x76, 0x69, 0x65, 0x77, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x69, 0x73, 0x20, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x61, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x41, 0x50, 0x49, 0x73, 0x2e, + 0x20, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, + 0x73, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x4a, 0x53, 0x4f, 0x4e, + 0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x63, 0x6f, 0x6e, + 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, + 0x64, 0x20, 0x48, 0x54, 0x54, 0x50, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x63, 0x6f, + 0x64, 0x65, 0x73, 0x2e, 0x2a, 0x48, 0x0a, 0x0e, 0x41, 0x70, 0x61, 0x63, 0x68, 0x65, 0x20, 0x4c, + 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x67, 0x72, 0x69, + 0x73, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x2f, 0x62, 0x6c, 0x6f, + 0x62, 0x2f, 0x6d, 0x61, 0x69, 0x6e, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x32, 0x05, + 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x1a, 0x34, 0x0a, 0x24, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, + 0x2f, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x74, 0x69, 0x67, + 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0x0c, 0x54, + 0x69, 0x67, 0x72, 0x69, 0x73, 0x20, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x1a, 0x22, 0x0a, 0x15, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x3a, + 0x38, 0x30, 0x38, 0x31, 0x12, 0x09, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x2a, + 0x22, 0x3a, 0x20, 0x0a, 0x1e, 0x0a, 0x0a, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x41, 0x75, 0x74, + 0x68, 0x12, 0x10, 0x0a, 0x0e, 0x0a, 0x04, 0x68, 0x74, 0x74, 0x70, 0x2a, 0x06, 0x62, 0x65, 0x61, + 0x72, 0x65, 0x72, 0x32, 0x10, 0x0a, 0x0e, 0x0a, 0x0a, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x41, + 0x75, 0x74, 0x68, 0x12, 0x00, 0x3a, 0x99, 0x03, 0x0a, 0x0e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x86, 0x03, 0x54, 0x68, 0x65, 0x20, 0x61, + 0x75, 0x74, 0x68, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x41, + 0x50, 0x49, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x73, 0x20, 0x4f, 0x41, 0x75, 0x74, + 0x68, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x41, 0x50, 0x49, 0x73, 0x2e, 0x20, 0x54, 0x69, 0x67, 0x72, + 0x69, 0x73, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x20, 0x70, 0x6c, 0x75, 0x67, + 0x67, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x20, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x2e, 0x20, 0x50, 0x61, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x60, 0x2d, 0x48, 0x20, 0x22, 0x41, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, + 0x20, 0x65, 0x79, 0x4a, 0x68, 0x62, 0x47, 0x63, 0x69, 0x4f, 0x69, 0x4a, 0x53, 0x55, 0x7a, 0x49, + 0x31, 0x4e, 0x69, 0x49, 0x73, 0x49, 0x6e, 0x52, 0x35, 0x63, 0x43, 0x49, 0x36, 0x49, 0x6b, 0x70, + 0x58, 0x56, 0x43, 0x49, 0x73, 0x49, 0x6d, 0x74, 0x70, 0x5a, 0x43, 0x49, 0x36, 0x49, 0x22, 0x60, + 0x28, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x29, 0x2e, 0x20, 0x41, 0x6c, + 0x6c, 0x20, 0x41, 0x50, 0x49, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x6f, 0x76, 0x65, 0x72, + 0x20, 0x48, 0x54, 0x54, 0x50, 0x53, 0x2e, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x6d, 0x61, + 0x64, 0x65, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x20, 0x48, 0x54, + 0x54, 0x50, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x2e, 0x20, 0x41, 0x50, + 0x49, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, + 0x75, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x66, 0x61, 0x69, 0x6c, + 0x2e, 0x3a, 0xb4, 0x01, 0x0a, 0x10, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x9f, 0x01, 0x54, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x73, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x41, 0x50, + 0x49, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, + 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x20, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, + 0x20, 0x41, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, + 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x3a, 0x82, 0x02, 0x0a, 0x08, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0xf5, 0x01, 0x45, 0x76, 0x65, 0x72, 0x79, 0x20, 0x54, 0x69, + 0x67, 0x72, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x63, 0x6f, + 0x6d, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, + 0x20, 0x6f, 0x6e, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x42, + 0x2c, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x73, + 0x74, 0x20, 0x72, 0x65, 0x73, 0x69, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x70, + 0x65, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x64, 0x20, 0x6b, 0x65, 0x79, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x20, 0x41, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x20, 0x69, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x75, 0x74, + 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x79, + 0x6f, 0x75, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x3a, 0xd9, 0x01, + 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0xcc, 0x01, 0x54, 0x68, 0x65, + 0x20, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, - 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x20, 0x41, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6f, 0x6e, 0x65, - 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x3a, 0x61, 0x0a, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x53, 0x54, 0x68, 0x65, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, - 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x70, 0x70, - 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x3a, 0x89, 0x01, 0x0a, 0x0d, 0x4f, 0x62, 0x73, 0x65, 0x72, - 0x76, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x78, 0x54, 0x68, 0x65, 0x20, 0x4f, 0x62, - 0x73, 0x65, 0x72, 0x76, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x73, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x73, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, - 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, - 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x3a, 0x55, 0x0a, 0x05, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x4c, 0x54, 0x68, 0x65, - 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x3a, 0x53, 0x0a, 0x08, 0x52, 0x65, 0x61, - 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x47, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, - 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, - 0x6d, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x3a, 0xd4, - 0x01, 0x0a, 0x06, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0xc9, 0x01, 0x54, 0x68, 0x65, 0x20, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x41, 0x50, 0x49, 0x73, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, - 0x64, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x70, - 0x6f, 0x77, 0x65, 0x72, 0x66, 0x75, 0x6c, 0x20, 0x61, 0x70, 0x70, 0x73, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x65, - 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x6f, - 0x77, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x73, 0x69, - 0x6d, 0x70, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x20, 0x69, - 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x3a, 0x5f, 0x0a, 0x07, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, - 0x12, 0x54, 0x54, 0x68, 0x65, 0x20, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x73, 0x20, 0x41, - 0x50, 0x49, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x69, 0x6e, 0x67, - 0x20, 0x69, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x74, 0x69, 0x67, 0x72, - 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x5a, 0x20, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x74, 0x69, 0x67, - 0x72, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x61, 0x63, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x20, 0x41, + 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x20, 0x63, 0x61, 0x6e, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, + 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x20, 0x41, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x69, 0x73, + 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, + 0x68, 0x65, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, + 0x20, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x3a, 0x88, 0x01, 0x0a, 0x0b, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x79, 0x54, 0x68, 0x65, 0x20, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x20, 0x41, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6f, 0x6e, + 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x3a, 0x61, 0x0a, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x53, 0x54, 0x68, 0x65, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, + 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x70, + 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x3a, 0x89, 0x01, 0x0a, 0x0d, 0x4f, 0x62, 0x73, 0x65, + 0x72, 0x76, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x78, 0x54, 0x68, 0x65, 0x20, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x73, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x73, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x73, 0x20, 0x66, 0x75, 0x6c, 0x6c, + 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2c, 0x20, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x3a, 0x55, 0x0a, 0x05, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x4c, 0x54, 0x68, + 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, + 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x3a, 0x53, 0x0a, 0x08, 0x52, 0x65, + 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x47, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x6c, + 0x74, 0x69, 0x6d, 0x65, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, + 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x74, + 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x3a, + 0xd4, 0x01, 0x0a, 0x06, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0xc9, 0x01, 0x54, 0x68, 0x65, + 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x41, 0x50, 0x49, + 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x70, 0x6f, 0x77, 0x65, 0x72, 0x66, 0x75, 0x6c, 0x20, 0x61, 0x70, 0x70, 0x73, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, + 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, + 0x6f, 0x77, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x73, + 0x69, 0x6d, 0x70, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x3a, 0x5f, 0x0a, 0x07, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x12, 0x54, 0x54, 0x68, 0x65, 0x20, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x73, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x73, 0x20, + 0x41, 0x50, 0x49, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x69, 0x6e, + 0x67, 0x20, 0x69, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, + 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x74, 0x69, 0x67, + 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x5a, 0x20, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x74, 0x69, + 0x67, 0x72, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -7369,7 +8109,7 @@ func file_server_v1_api_proto_rawDescGZIP() []byte { return file_server_v1_api_proto_rawDescData } -var file_server_v1_api_proto_msgTypes = make([]protoimpl.MessageInfo, 98) +var file_server_v1_api_proto_msgTypes = make([]protoimpl.MessageInfo, 109) var file_server_v1_api_proto_goTypes = []interface{}{ (*WriteOptions)(nil), // 0: tigrisdata.v1.WriteOptions (*Collation)(nil), // 1: tigrisdata.v1.Collation @@ -7468,143 +8208,168 @@ var file_server_v1_api_proto_goTypes = []interface{}{ (*DeleteAppKeyResponse)(nil), // 94: tigrisdata.v1.DeleteAppKeyResponse (*RotateAppKeyRequest)(nil), // 95: tigrisdata.v1.RotateAppKeyRequest (*RotateAppKeyResponse)(nil), // 96: tigrisdata.v1.RotateAppKeyResponse - nil, // 97: tigrisdata.v1.SearchResponse.FacetsEntry - (*timestamppb.Timestamp)(nil), // 98: google.protobuf.Timestamp - (*Error)(nil), // 99: tigrisdata.observability.v1.Error + (*CreateGlobalAppKeyRequest)(nil), // 97: tigrisdata.v1.CreateGlobalAppKeyRequest + (*CreateGlobalAppKeyResponse)(nil), // 98: tigrisdata.v1.CreateGlobalAppKeyResponse + (*UpdateGlobalAppKeyRequest)(nil), // 99: tigrisdata.v1.UpdateGlobalAppKeyRequest + (*UpdateGlobalAppKeyResponse)(nil), // 100: tigrisdata.v1.UpdateGlobalAppKeyResponse + (*GlobalAppKey)(nil), // 101: tigrisdata.v1.GlobalAppKey + (*ListGlobalAppKeysRequest)(nil), // 102: tigrisdata.v1.ListGlobalAppKeysRequest + (*ListGlobalAppKeysResponse)(nil), // 103: tigrisdata.v1.ListGlobalAppKeysResponse + (*DeleteGlobalAppKeyRequest)(nil), // 104: tigrisdata.v1.DeleteGlobalAppKeyRequest + (*DeleteGlobalAppKeyResponse)(nil), // 105: tigrisdata.v1.DeleteGlobalAppKeyResponse + (*RotateGlobalAppKeySecretRequest)(nil), // 106: tigrisdata.v1.RotateGlobalAppKeySecretRequest + (*RotateGlobalAppKeySecretResponse)(nil), // 107: tigrisdata.v1.RotateGlobalAppKeySecretResponse + nil, // 108: tigrisdata.v1.SearchResponse.FacetsEntry + (*timestamppb.Timestamp)(nil), // 109: google.protobuf.Timestamp + (*Error)(nil), // 110: tigrisdata.observability.v1.Error } var file_server_v1_api_proto_depIdxs = []int32{ - 1, // 0: tigrisdata.v1.ReadRequestOptions.collation:type_name -> tigrisdata.v1.Collation - 5, // 1: tigrisdata.v1.BeginTransactionRequest.options:type_name -> tigrisdata.v1.TransactionOptions - 6, // 2: tigrisdata.v1.BeginTransactionResponse.tx_ctx:type_name -> tigrisdata.v1.TransactionCtx - 0, // 3: tigrisdata.v1.InsertRequestOptions.write_options:type_name -> tigrisdata.v1.WriteOptions - 0, // 4: tigrisdata.v1.ImportRequestOptions.write_options:type_name -> tigrisdata.v1.WriteOptions - 98, // 5: tigrisdata.v1.ResponseMetadata.created_at:type_name -> google.protobuf.Timestamp - 98, // 6: tigrisdata.v1.ResponseMetadata.updated_at:type_name -> google.protobuf.Timestamp - 98, // 7: tigrisdata.v1.ResponseMetadata.deleted_at:type_name -> google.protobuf.Timestamp - 13, // 8: tigrisdata.v1.InsertRequest.options:type_name -> tigrisdata.v1.InsertRequestOptions - 15, // 9: tigrisdata.v1.InsertResponse.metadata:type_name -> tigrisdata.v1.ResponseMetadata - 14, // 10: tigrisdata.v1.ImportRequest.options:type_name -> tigrisdata.v1.ImportRequestOptions - 15, // 11: tigrisdata.v1.ImportResponse.metadata:type_name -> tigrisdata.v1.ResponseMetadata - 0, // 12: tigrisdata.v1.ReplaceRequestOptions.write_options:type_name -> tigrisdata.v1.WriteOptions - 20, // 13: tigrisdata.v1.ReplaceRequest.options:type_name -> tigrisdata.v1.ReplaceRequestOptions - 15, // 14: tigrisdata.v1.ReplaceResponse.metadata:type_name -> tigrisdata.v1.ResponseMetadata - 0, // 15: tigrisdata.v1.DeleteRequestOptions.write_options:type_name -> tigrisdata.v1.WriteOptions - 1, // 16: tigrisdata.v1.DeleteRequestOptions.collation:type_name -> tigrisdata.v1.Collation - 23, // 17: tigrisdata.v1.DeleteRequest.options:type_name -> tigrisdata.v1.DeleteRequestOptions - 15, // 18: tigrisdata.v1.DeleteResponse.metadata:type_name -> tigrisdata.v1.ResponseMetadata - 0, // 19: tigrisdata.v1.UpdateRequestOptions.write_options:type_name -> tigrisdata.v1.WriteOptions - 1, // 20: tigrisdata.v1.UpdateRequestOptions.collation:type_name -> tigrisdata.v1.Collation - 26, // 21: tigrisdata.v1.UpdateRequest.options:type_name -> tigrisdata.v1.UpdateRequestOptions - 15, // 22: tigrisdata.v1.UpdateResponse.metadata:type_name -> tigrisdata.v1.ResponseMetadata - 2, // 23: tigrisdata.v1.ReadRequest.options:type_name -> tigrisdata.v1.ReadRequestOptions - 15, // 24: tigrisdata.v1.ReadResponse.metadata:type_name -> tigrisdata.v1.ResponseMetadata - 1, // 25: tigrisdata.v1.SearchRequest.collation:type_name -> tigrisdata.v1.Collation - 36, // 26: tigrisdata.v1.SearchResponse.hits:type_name -> tigrisdata.v1.SearchHit - 97, // 27: tigrisdata.v1.SearchResponse.facets:type_name -> tigrisdata.v1.SearchResponse.FacetsEntry - 41, // 28: tigrisdata.v1.SearchResponse.meta:type_name -> tigrisdata.v1.SearchMetadata - 44, // 29: tigrisdata.v1.SearchResponse.group:type_name -> tigrisdata.v1.GroupedSearchHits - 37, // 30: tigrisdata.v1.SearchHit.metadata:type_name -> tigrisdata.v1.SearchHitMeta - 98, // 31: tigrisdata.v1.SearchHitMeta.created_at:type_name -> google.protobuf.Timestamp - 98, // 32: tigrisdata.v1.SearchHitMeta.updated_at:type_name -> google.protobuf.Timestamp - 43, // 33: tigrisdata.v1.SearchHitMeta.match:type_name -> tigrisdata.v1.Match - 39, // 34: tigrisdata.v1.SearchFacet.counts:type_name -> tigrisdata.v1.FacetCount - 40, // 35: tigrisdata.v1.SearchFacet.stats:type_name -> tigrisdata.v1.FacetStats - 45, // 36: tigrisdata.v1.SearchMetadata.page:type_name -> tigrisdata.v1.Page - 42, // 37: tigrisdata.v1.Match.fields:type_name -> tigrisdata.v1.MatchField - 36, // 38: tigrisdata.v1.GroupedSearchHits.hits:type_name -> tigrisdata.v1.SearchHit - 65, // 39: tigrisdata.v1.ListBranchesResponse.branches:type_name -> tigrisdata.v1.BranchInfo - 4, // 40: tigrisdata.v1.CreateOrUpdateCollectionRequest.options:type_name -> tigrisdata.v1.CollectionOptions - 4, // 41: tigrisdata.v1.CreateOrUpdateCollectionsRequest.options:type_name -> tigrisdata.v1.CollectionOptions - 59, // 42: tigrisdata.v1.CreateOrUpdateCollectionsResponse.resp:type_name -> tigrisdata.v1.CreateCollectionStatus - 99, // 43: tigrisdata.v1.CreateOrUpdateCollectionsResponse.error:type_name -> tigrisdata.observability.v1.Error - 4, // 44: tigrisdata.v1.DropCollectionRequest.options:type_name -> tigrisdata.v1.CollectionOptions - 76, // 45: tigrisdata.v1.ProjectInfo.metadata:type_name -> tigrisdata.v1.ProjectMetadata - 78, // 46: tigrisdata.v1.CollectionInfo.metadata:type_name -> tigrisdata.v1.CollectionMetadata - 85, // 47: tigrisdata.v1.BranchInfo.metadata:type_name -> tigrisdata.v1.BranchMetadata - 63, // 48: tigrisdata.v1.ListProjectsResponse.projects:type_name -> tigrisdata.v1.ProjectInfo - 4, // 49: tigrisdata.v1.ListCollectionsRequest.options:type_name -> tigrisdata.v1.CollectionOptions - 64, // 50: tigrisdata.v1.ListCollectionsResponse.collections:type_name -> tigrisdata.v1.CollectionInfo - 4, // 51: tigrisdata.v1.DescribeCollectionRequest.options:type_name -> tigrisdata.v1.CollectionOptions - 77, // 52: tigrisdata.v1.DescribeDatabaseResponse.metadata:type_name -> tigrisdata.v1.DatabaseMetadata - 75, // 53: tigrisdata.v1.DescribeDatabaseResponse.collections:type_name -> tigrisdata.v1.CollectionDescription - 78, // 54: tigrisdata.v1.DescribeCollectionResponse.metadata:type_name -> tigrisdata.v1.CollectionMetadata - 79, // 55: tigrisdata.v1.DescribeCollectionResponse.indexes:type_name -> tigrisdata.v1.CollectionIndex - 78, // 56: tigrisdata.v1.CollectionDescription.metadata:type_name -> tigrisdata.v1.CollectionMetadata - 79, // 57: tigrisdata.v1.CollectionDescription.indexes:type_name -> tigrisdata.v1.CollectionIndex - 80, // 58: tigrisdata.v1.CollectionIndex.fields:type_name -> tigrisdata.v1.Field - 79, // 59: tigrisdata.v1.BuildCollectionIndexResponse.indexes:type_name -> tigrisdata.v1.CollectionIndex - 90, // 60: tigrisdata.v1.CreateAppKeyResponse.created_app_key:type_name -> tigrisdata.v1.AppKey - 90, // 61: tigrisdata.v1.UpdateAppKeyResponse.updated_app_key:type_name -> tigrisdata.v1.AppKey - 90, // 62: tigrisdata.v1.ListAppKeysResponse.app_keys:type_name -> tigrisdata.v1.AppKey - 90, // 63: tigrisdata.v1.RotateAppKeyResponse.app_key:type_name -> tigrisdata.v1.AppKey - 38, // 64: tigrisdata.v1.SearchResponse.FacetsEntry.value:type_name -> tigrisdata.v1.SearchFacet - 7, // 65: tigrisdata.v1.Tigris.BeginTransaction:input_type -> tigrisdata.v1.BeginTransactionRequest - 9, // 66: tigrisdata.v1.Tigris.CommitTransaction:input_type -> tigrisdata.v1.CommitTransactionRequest - 11, // 67: tigrisdata.v1.Tigris.RollbackTransaction:input_type -> tigrisdata.v1.RollbackTransactionRequest - 16, // 68: tigrisdata.v1.Tigris.Insert:input_type -> tigrisdata.v1.InsertRequest - 21, // 69: tigrisdata.v1.Tigris.Replace:input_type -> tigrisdata.v1.ReplaceRequest - 24, // 70: tigrisdata.v1.Tigris.Delete:input_type -> tigrisdata.v1.DeleteRequest - 27, // 71: tigrisdata.v1.Tigris.Update:input_type -> tigrisdata.v1.UpdateRequest - 29, // 72: tigrisdata.v1.Tigris.Read:input_type -> tigrisdata.v1.ReadRequest - 31, // 73: tigrisdata.v1.Tigris.Count:input_type -> tigrisdata.v1.CountRequest - 81, // 74: tigrisdata.v1.Tigris.BuildCollectionIndex:input_type -> tigrisdata.v1.BuildCollectionIndexRequest - 83, // 75: tigrisdata.v1.Tigris.BuildSearchIndex:input_type -> tigrisdata.v1.BuildCollectionSearchIndexRequest - 29, // 76: tigrisdata.v1.Tigris.Explain:input_type -> tigrisdata.v1.ReadRequest - 34, // 77: tigrisdata.v1.Tigris.Search:input_type -> tigrisdata.v1.SearchRequest - 18, // 78: tigrisdata.v1.Tigris.Import:input_type -> tigrisdata.v1.ImportRequest - 56, // 79: tigrisdata.v1.Tigris.CreateOrUpdateCollection:input_type -> tigrisdata.v1.CreateOrUpdateCollectionRequest - 58, // 80: tigrisdata.v1.Tigris.CreateOrUpdateCollections:input_type -> tigrisdata.v1.CreateOrUpdateCollectionsRequest - 61, // 81: tigrisdata.v1.Tigris.DropCollection:input_type -> tigrisdata.v1.DropCollectionRequest - 66, // 82: tigrisdata.v1.Tigris.ListProjects:input_type -> tigrisdata.v1.ListProjectsRequest - 68, // 83: tigrisdata.v1.Tigris.ListCollections:input_type -> tigrisdata.v1.ListCollectionsRequest - 46, // 84: tigrisdata.v1.Tigris.CreateProject:input_type -> tigrisdata.v1.CreateProjectRequest - 48, // 85: tigrisdata.v1.Tigris.DeleteProject:input_type -> tigrisdata.v1.DeleteProjectRequest - 70, // 86: tigrisdata.v1.Tigris.DescribeDatabase:input_type -> tigrisdata.v1.DescribeDatabaseRequest - 50, // 87: tigrisdata.v1.Tigris.CreateBranch:input_type -> tigrisdata.v1.CreateBranchRequest - 52, // 88: tigrisdata.v1.Tigris.DeleteBranch:input_type -> tigrisdata.v1.DeleteBranchRequest - 54, // 89: tigrisdata.v1.Tigris.ListBranches:input_type -> tigrisdata.v1.ListBranchesRequest - 71, // 90: tigrisdata.v1.Tigris.DescribeCollection:input_type -> tigrisdata.v1.DescribeCollectionRequest - 86, // 91: tigrisdata.v1.Tigris.CreateAppKey:input_type -> tigrisdata.v1.CreateAppKeyRequest - 88, // 92: tigrisdata.v1.Tigris.UpdateAppKey:input_type -> tigrisdata.v1.UpdateAppKeyRequest - 93, // 93: tigrisdata.v1.Tigris.DeleteAppKey:input_type -> tigrisdata.v1.DeleteAppKeyRequest - 91, // 94: tigrisdata.v1.Tigris.ListAppKeys:input_type -> tigrisdata.v1.ListAppKeysRequest - 95, // 95: tigrisdata.v1.Tigris.RotateAppKeySecret:input_type -> tigrisdata.v1.RotateAppKeyRequest - 8, // 96: tigrisdata.v1.Tigris.BeginTransaction:output_type -> tigrisdata.v1.BeginTransactionResponse - 10, // 97: tigrisdata.v1.Tigris.CommitTransaction:output_type -> tigrisdata.v1.CommitTransactionResponse - 12, // 98: tigrisdata.v1.Tigris.RollbackTransaction:output_type -> tigrisdata.v1.RollbackTransactionResponse - 17, // 99: tigrisdata.v1.Tigris.Insert:output_type -> tigrisdata.v1.InsertResponse - 22, // 100: tigrisdata.v1.Tigris.Replace:output_type -> tigrisdata.v1.ReplaceResponse - 25, // 101: tigrisdata.v1.Tigris.Delete:output_type -> tigrisdata.v1.DeleteResponse - 28, // 102: tigrisdata.v1.Tigris.Update:output_type -> tigrisdata.v1.UpdateResponse - 30, // 103: tigrisdata.v1.Tigris.Read:output_type -> tigrisdata.v1.ReadResponse - 32, // 104: tigrisdata.v1.Tigris.Count:output_type -> tigrisdata.v1.CountResponse - 82, // 105: tigrisdata.v1.Tigris.BuildCollectionIndex:output_type -> tigrisdata.v1.BuildCollectionIndexResponse - 84, // 106: tigrisdata.v1.Tigris.BuildSearchIndex:output_type -> tigrisdata.v1.BuildCollectionSearchIndexResponse - 33, // 107: tigrisdata.v1.Tigris.Explain:output_type -> tigrisdata.v1.ExplainResponse - 35, // 108: tigrisdata.v1.Tigris.Search:output_type -> tigrisdata.v1.SearchResponse - 19, // 109: tigrisdata.v1.Tigris.Import:output_type -> tigrisdata.v1.ImportResponse - 57, // 110: tigrisdata.v1.Tigris.CreateOrUpdateCollection:output_type -> tigrisdata.v1.CreateOrUpdateCollectionResponse - 60, // 111: tigrisdata.v1.Tigris.CreateOrUpdateCollections:output_type -> tigrisdata.v1.CreateOrUpdateCollectionsResponse - 62, // 112: tigrisdata.v1.Tigris.DropCollection:output_type -> tigrisdata.v1.DropCollectionResponse - 67, // 113: tigrisdata.v1.Tigris.ListProjects:output_type -> tigrisdata.v1.ListProjectsResponse - 69, // 114: tigrisdata.v1.Tigris.ListCollections:output_type -> tigrisdata.v1.ListCollectionsResponse - 47, // 115: tigrisdata.v1.Tigris.CreateProject:output_type -> tigrisdata.v1.CreateProjectResponse - 49, // 116: tigrisdata.v1.Tigris.DeleteProject:output_type -> tigrisdata.v1.DeleteProjectResponse - 72, // 117: tigrisdata.v1.Tigris.DescribeDatabase:output_type -> tigrisdata.v1.DescribeDatabaseResponse - 51, // 118: tigrisdata.v1.Tigris.CreateBranch:output_type -> tigrisdata.v1.CreateBranchResponse - 53, // 119: tigrisdata.v1.Tigris.DeleteBranch:output_type -> tigrisdata.v1.DeleteBranchResponse - 55, // 120: tigrisdata.v1.Tigris.ListBranches:output_type -> tigrisdata.v1.ListBranchesResponse - 73, // 121: tigrisdata.v1.Tigris.DescribeCollection:output_type -> tigrisdata.v1.DescribeCollectionResponse - 87, // 122: tigrisdata.v1.Tigris.CreateAppKey:output_type -> tigrisdata.v1.CreateAppKeyResponse - 89, // 123: tigrisdata.v1.Tigris.UpdateAppKey:output_type -> tigrisdata.v1.UpdateAppKeyResponse - 94, // 124: tigrisdata.v1.Tigris.DeleteAppKey:output_type -> tigrisdata.v1.DeleteAppKeyResponse - 92, // 125: tigrisdata.v1.Tigris.ListAppKeys:output_type -> tigrisdata.v1.ListAppKeysResponse - 96, // 126: tigrisdata.v1.Tigris.RotateAppKeySecret:output_type -> tigrisdata.v1.RotateAppKeyResponse - 96, // [96:127] is the sub-list for method output_type - 65, // [65:96] is the sub-list for method input_type - 65, // [65:65] is the sub-list for extension type_name - 65, // [65:65] is the sub-list for extension extendee - 0, // [0:65] is the sub-list for field type_name + 1, // 0: tigrisdata.v1.ReadRequestOptions.collation:type_name -> tigrisdata.v1.Collation + 5, // 1: tigrisdata.v1.BeginTransactionRequest.options:type_name -> tigrisdata.v1.TransactionOptions + 6, // 2: tigrisdata.v1.BeginTransactionResponse.tx_ctx:type_name -> tigrisdata.v1.TransactionCtx + 0, // 3: tigrisdata.v1.InsertRequestOptions.write_options:type_name -> tigrisdata.v1.WriteOptions + 0, // 4: tigrisdata.v1.ImportRequestOptions.write_options:type_name -> tigrisdata.v1.WriteOptions + 109, // 5: tigrisdata.v1.ResponseMetadata.created_at:type_name -> google.protobuf.Timestamp + 109, // 6: tigrisdata.v1.ResponseMetadata.updated_at:type_name -> google.protobuf.Timestamp + 109, // 7: tigrisdata.v1.ResponseMetadata.deleted_at:type_name -> google.protobuf.Timestamp + 13, // 8: tigrisdata.v1.InsertRequest.options:type_name -> tigrisdata.v1.InsertRequestOptions + 15, // 9: tigrisdata.v1.InsertResponse.metadata:type_name -> tigrisdata.v1.ResponseMetadata + 14, // 10: tigrisdata.v1.ImportRequest.options:type_name -> tigrisdata.v1.ImportRequestOptions + 15, // 11: tigrisdata.v1.ImportResponse.metadata:type_name -> tigrisdata.v1.ResponseMetadata + 0, // 12: tigrisdata.v1.ReplaceRequestOptions.write_options:type_name -> tigrisdata.v1.WriteOptions + 20, // 13: tigrisdata.v1.ReplaceRequest.options:type_name -> tigrisdata.v1.ReplaceRequestOptions + 15, // 14: tigrisdata.v1.ReplaceResponse.metadata:type_name -> tigrisdata.v1.ResponseMetadata + 0, // 15: tigrisdata.v1.DeleteRequestOptions.write_options:type_name -> tigrisdata.v1.WriteOptions + 1, // 16: tigrisdata.v1.DeleteRequestOptions.collation:type_name -> tigrisdata.v1.Collation + 23, // 17: tigrisdata.v1.DeleteRequest.options:type_name -> tigrisdata.v1.DeleteRequestOptions + 15, // 18: tigrisdata.v1.DeleteResponse.metadata:type_name -> tigrisdata.v1.ResponseMetadata + 0, // 19: tigrisdata.v1.UpdateRequestOptions.write_options:type_name -> tigrisdata.v1.WriteOptions + 1, // 20: tigrisdata.v1.UpdateRequestOptions.collation:type_name -> tigrisdata.v1.Collation + 26, // 21: tigrisdata.v1.UpdateRequest.options:type_name -> tigrisdata.v1.UpdateRequestOptions + 15, // 22: tigrisdata.v1.UpdateResponse.metadata:type_name -> tigrisdata.v1.ResponseMetadata + 2, // 23: tigrisdata.v1.ReadRequest.options:type_name -> tigrisdata.v1.ReadRequestOptions + 15, // 24: tigrisdata.v1.ReadResponse.metadata:type_name -> tigrisdata.v1.ResponseMetadata + 1, // 25: tigrisdata.v1.SearchRequest.collation:type_name -> tigrisdata.v1.Collation + 36, // 26: tigrisdata.v1.SearchResponse.hits:type_name -> tigrisdata.v1.SearchHit + 108, // 27: tigrisdata.v1.SearchResponse.facets:type_name -> tigrisdata.v1.SearchResponse.FacetsEntry + 41, // 28: tigrisdata.v1.SearchResponse.meta:type_name -> tigrisdata.v1.SearchMetadata + 44, // 29: tigrisdata.v1.SearchResponse.group:type_name -> tigrisdata.v1.GroupedSearchHits + 37, // 30: tigrisdata.v1.SearchHit.metadata:type_name -> tigrisdata.v1.SearchHitMeta + 109, // 31: tigrisdata.v1.SearchHitMeta.created_at:type_name -> google.protobuf.Timestamp + 109, // 32: tigrisdata.v1.SearchHitMeta.updated_at:type_name -> google.protobuf.Timestamp + 43, // 33: tigrisdata.v1.SearchHitMeta.match:type_name -> tigrisdata.v1.Match + 39, // 34: tigrisdata.v1.SearchFacet.counts:type_name -> tigrisdata.v1.FacetCount + 40, // 35: tigrisdata.v1.SearchFacet.stats:type_name -> tigrisdata.v1.FacetStats + 45, // 36: tigrisdata.v1.SearchMetadata.page:type_name -> tigrisdata.v1.Page + 42, // 37: tigrisdata.v1.Match.fields:type_name -> tigrisdata.v1.MatchField + 36, // 38: tigrisdata.v1.GroupedSearchHits.hits:type_name -> tigrisdata.v1.SearchHit + 65, // 39: tigrisdata.v1.ListBranchesResponse.branches:type_name -> tigrisdata.v1.BranchInfo + 4, // 40: tigrisdata.v1.CreateOrUpdateCollectionRequest.options:type_name -> tigrisdata.v1.CollectionOptions + 4, // 41: tigrisdata.v1.CreateOrUpdateCollectionsRequest.options:type_name -> tigrisdata.v1.CollectionOptions + 59, // 42: tigrisdata.v1.CreateOrUpdateCollectionsResponse.resp:type_name -> tigrisdata.v1.CreateCollectionStatus + 110, // 43: tigrisdata.v1.CreateOrUpdateCollectionsResponse.error:type_name -> tigrisdata.observability.v1.Error + 4, // 44: tigrisdata.v1.DropCollectionRequest.options:type_name -> tigrisdata.v1.CollectionOptions + 76, // 45: tigrisdata.v1.ProjectInfo.metadata:type_name -> tigrisdata.v1.ProjectMetadata + 78, // 46: tigrisdata.v1.CollectionInfo.metadata:type_name -> tigrisdata.v1.CollectionMetadata + 85, // 47: tigrisdata.v1.BranchInfo.metadata:type_name -> tigrisdata.v1.BranchMetadata + 63, // 48: tigrisdata.v1.ListProjectsResponse.projects:type_name -> tigrisdata.v1.ProjectInfo + 4, // 49: tigrisdata.v1.ListCollectionsRequest.options:type_name -> tigrisdata.v1.CollectionOptions + 64, // 50: tigrisdata.v1.ListCollectionsResponse.collections:type_name -> tigrisdata.v1.CollectionInfo + 4, // 51: tigrisdata.v1.DescribeCollectionRequest.options:type_name -> tigrisdata.v1.CollectionOptions + 77, // 52: tigrisdata.v1.DescribeDatabaseResponse.metadata:type_name -> tigrisdata.v1.DatabaseMetadata + 75, // 53: tigrisdata.v1.DescribeDatabaseResponse.collections:type_name -> tigrisdata.v1.CollectionDescription + 78, // 54: tigrisdata.v1.DescribeCollectionResponse.metadata:type_name -> tigrisdata.v1.CollectionMetadata + 79, // 55: tigrisdata.v1.DescribeCollectionResponse.indexes:type_name -> tigrisdata.v1.CollectionIndex + 78, // 56: tigrisdata.v1.CollectionDescription.metadata:type_name -> tigrisdata.v1.CollectionMetadata + 79, // 57: tigrisdata.v1.CollectionDescription.indexes:type_name -> tigrisdata.v1.CollectionIndex + 80, // 58: tigrisdata.v1.CollectionIndex.fields:type_name -> tigrisdata.v1.Field + 79, // 59: tigrisdata.v1.BuildCollectionIndexResponse.indexes:type_name -> tigrisdata.v1.CollectionIndex + 90, // 60: tigrisdata.v1.CreateAppKeyResponse.created_app_key:type_name -> tigrisdata.v1.AppKey + 90, // 61: tigrisdata.v1.UpdateAppKeyResponse.updated_app_key:type_name -> tigrisdata.v1.AppKey + 90, // 62: tigrisdata.v1.ListAppKeysResponse.app_keys:type_name -> tigrisdata.v1.AppKey + 90, // 63: tigrisdata.v1.RotateAppKeyResponse.app_key:type_name -> tigrisdata.v1.AppKey + 101, // 64: tigrisdata.v1.CreateGlobalAppKeyResponse.created_app_key:type_name -> tigrisdata.v1.GlobalAppKey + 101, // 65: tigrisdata.v1.UpdateGlobalAppKeyResponse.updated_app_key:type_name -> tigrisdata.v1.GlobalAppKey + 101, // 66: tigrisdata.v1.ListGlobalAppKeysResponse.app_keys:type_name -> tigrisdata.v1.GlobalAppKey + 101, // 67: tigrisdata.v1.RotateGlobalAppKeySecretResponse.app_key:type_name -> tigrisdata.v1.GlobalAppKey + 38, // 68: tigrisdata.v1.SearchResponse.FacetsEntry.value:type_name -> tigrisdata.v1.SearchFacet + 7, // 69: tigrisdata.v1.Tigris.BeginTransaction:input_type -> tigrisdata.v1.BeginTransactionRequest + 9, // 70: tigrisdata.v1.Tigris.CommitTransaction:input_type -> tigrisdata.v1.CommitTransactionRequest + 11, // 71: tigrisdata.v1.Tigris.RollbackTransaction:input_type -> tigrisdata.v1.RollbackTransactionRequest + 16, // 72: tigrisdata.v1.Tigris.Insert:input_type -> tigrisdata.v1.InsertRequest + 21, // 73: tigrisdata.v1.Tigris.Replace:input_type -> tigrisdata.v1.ReplaceRequest + 24, // 74: tigrisdata.v1.Tigris.Delete:input_type -> tigrisdata.v1.DeleteRequest + 27, // 75: tigrisdata.v1.Tigris.Update:input_type -> tigrisdata.v1.UpdateRequest + 29, // 76: tigrisdata.v1.Tigris.Read:input_type -> tigrisdata.v1.ReadRequest + 31, // 77: tigrisdata.v1.Tigris.Count:input_type -> tigrisdata.v1.CountRequest + 81, // 78: tigrisdata.v1.Tigris.BuildCollectionIndex:input_type -> tigrisdata.v1.BuildCollectionIndexRequest + 83, // 79: tigrisdata.v1.Tigris.BuildSearchIndex:input_type -> tigrisdata.v1.BuildCollectionSearchIndexRequest + 29, // 80: tigrisdata.v1.Tigris.Explain:input_type -> tigrisdata.v1.ReadRequest + 34, // 81: tigrisdata.v1.Tigris.Search:input_type -> tigrisdata.v1.SearchRequest + 18, // 82: tigrisdata.v1.Tigris.Import:input_type -> tigrisdata.v1.ImportRequest + 56, // 83: tigrisdata.v1.Tigris.CreateOrUpdateCollection:input_type -> tigrisdata.v1.CreateOrUpdateCollectionRequest + 58, // 84: tigrisdata.v1.Tigris.CreateOrUpdateCollections:input_type -> tigrisdata.v1.CreateOrUpdateCollectionsRequest + 61, // 85: tigrisdata.v1.Tigris.DropCollection:input_type -> tigrisdata.v1.DropCollectionRequest + 66, // 86: tigrisdata.v1.Tigris.ListProjects:input_type -> tigrisdata.v1.ListProjectsRequest + 68, // 87: tigrisdata.v1.Tigris.ListCollections:input_type -> tigrisdata.v1.ListCollectionsRequest + 46, // 88: tigrisdata.v1.Tigris.CreateProject:input_type -> tigrisdata.v1.CreateProjectRequest + 48, // 89: tigrisdata.v1.Tigris.DeleteProject:input_type -> tigrisdata.v1.DeleteProjectRequest + 70, // 90: tigrisdata.v1.Tigris.DescribeDatabase:input_type -> tigrisdata.v1.DescribeDatabaseRequest + 50, // 91: tigrisdata.v1.Tigris.CreateBranch:input_type -> tigrisdata.v1.CreateBranchRequest + 52, // 92: tigrisdata.v1.Tigris.DeleteBranch:input_type -> tigrisdata.v1.DeleteBranchRequest + 54, // 93: tigrisdata.v1.Tigris.ListBranches:input_type -> tigrisdata.v1.ListBranchesRequest + 71, // 94: tigrisdata.v1.Tigris.DescribeCollection:input_type -> tigrisdata.v1.DescribeCollectionRequest + 97, // 95: tigrisdata.v1.Tigris.CreateGlobalAppKey:input_type -> tigrisdata.v1.CreateGlobalAppKeyRequest + 99, // 96: tigrisdata.v1.Tigris.UpdateGlobalAppKey:input_type -> tigrisdata.v1.UpdateGlobalAppKeyRequest + 104, // 97: tigrisdata.v1.Tigris.DeleteGlobalAppKey:input_type -> tigrisdata.v1.DeleteGlobalAppKeyRequest + 102, // 98: tigrisdata.v1.Tigris.ListGlobalAppKeys:input_type -> tigrisdata.v1.ListGlobalAppKeysRequest + 106, // 99: tigrisdata.v1.Tigris.RotateGlobalAppKeySecret:input_type -> tigrisdata.v1.RotateGlobalAppKeySecretRequest + 86, // 100: tigrisdata.v1.Tigris.CreateAppKey:input_type -> tigrisdata.v1.CreateAppKeyRequest + 88, // 101: tigrisdata.v1.Tigris.UpdateAppKey:input_type -> tigrisdata.v1.UpdateAppKeyRequest + 93, // 102: tigrisdata.v1.Tigris.DeleteAppKey:input_type -> tigrisdata.v1.DeleteAppKeyRequest + 91, // 103: tigrisdata.v1.Tigris.ListAppKeys:input_type -> tigrisdata.v1.ListAppKeysRequest + 95, // 104: tigrisdata.v1.Tigris.RotateAppKeySecret:input_type -> tigrisdata.v1.RotateAppKeyRequest + 8, // 105: tigrisdata.v1.Tigris.BeginTransaction:output_type -> tigrisdata.v1.BeginTransactionResponse + 10, // 106: tigrisdata.v1.Tigris.CommitTransaction:output_type -> tigrisdata.v1.CommitTransactionResponse + 12, // 107: tigrisdata.v1.Tigris.RollbackTransaction:output_type -> tigrisdata.v1.RollbackTransactionResponse + 17, // 108: tigrisdata.v1.Tigris.Insert:output_type -> tigrisdata.v1.InsertResponse + 22, // 109: tigrisdata.v1.Tigris.Replace:output_type -> tigrisdata.v1.ReplaceResponse + 25, // 110: tigrisdata.v1.Tigris.Delete:output_type -> tigrisdata.v1.DeleteResponse + 28, // 111: tigrisdata.v1.Tigris.Update:output_type -> tigrisdata.v1.UpdateResponse + 30, // 112: tigrisdata.v1.Tigris.Read:output_type -> tigrisdata.v1.ReadResponse + 32, // 113: tigrisdata.v1.Tigris.Count:output_type -> tigrisdata.v1.CountResponse + 82, // 114: tigrisdata.v1.Tigris.BuildCollectionIndex:output_type -> tigrisdata.v1.BuildCollectionIndexResponse + 84, // 115: tigrisdata.v1.Tigris.BuildSearchIndex:output_type -> tigrisdata.v1.BuildCollectionSearchIndexResponse + 33, // 116: tigrisdata.v1.Tigris.Explain:output_type -> tigrisdata.v1.ExplainResponse + 35, // 117: tigrisdata.v1.Tigris.Search:output_type -> tigrisdata.v1.SearchResponse + 19, // 118: tigrisdata.v1.Tigris.Import:output_type -> tigrisdata.v1.ImportResponse + 57, // 119: tigrisdata.v1.Tigris.CreateOrUpdateCollection:output_type -> tigrisdata.v1.CreateOrUpdateCollectionResponse + 60, // 120: tigrisdata.v1.Tigris.CreateOrUpdateCollections:output_type -> tigrisdata.v1.CreateOrUpdateCollectionsResponse + 62, // 121: tigrisdata.v1.Tigris.DropCollection:output_type -> tigrisdata.v1.DropCollectionResponse + 67, // 122: tigrisdata.v1.Tigris.ListProjects:output_type -> tigrisdata.v1.ListProjectsResponse + 69, // 123: tigrisdata.v1.Tigris.ListCollections:output_type -> tigrisdata.v1.ListCollectionsResponse + 47, // 124: tigrisdata.v1.Tigris.CreateProject:output_type -> tigrisdata.v1.CreateProjectResponse + 49, // 125: tigrisdata.v1.Tigris.DeleteProject:output_type -> tigrisdata.v1.DeleteProjectResponse + 72, // 126: tigrisdata.v1.Tigris.DescribeDatabase:output_type -> tigrisdata.v1.DescribeDatabaseResponse + 51, // 127: tigrisdata.v1.Tigris.CreateBranch:output_type -> tigrisdata.v1.CreateBranchResponse + 53, // 128: tigrisdata.v1.Tigris.DeleteBranch:output_type -> tigrisdata.v1.DeleteBranchResponse + 55, // 129: tigrisdata.v1.Tigris.ListBranches:output_type -> tigrisdata.v1.ListBranchesResponse + 73, // 130: tigrisdata.v1.Tigris.DescribeCollection:output_type -> tigrisdata.v1.DescribeCollectionResponse + 98, // 131: tigrisdata.v1.Tigris.CreateGlobalAppKey:output_type -> tigrisdata.v1.CreateGlobalAppKeyResponse + 100, // 132: tigrisdata.v1.Tigris.UpdateGlobalAppKey:output_type -> tigrisdata.v1.UpdateGlobalAppKeyResponse + 105, // 133: tigrisdata.v1.Tigris.DeleteGlobalAppKey:output_type -> tigrisdata.v1.DeleteGlobalAppKeyResponse + 103, // 134: tigrisdata.v1.Tigris.ListGlobalAppKeys:output_type -> tigrisdata.v1.ListGlobalAppKeysResponse + 107, // 135: tigrisdata.v1.Tigris.RotateGlobalAppKeySecret:output_type -> tigrisdata.v1.RotateGlobalAppKeySecretResponse + 87, // 136: tigrisdata.v1.Tigris.CreateAppKey:output_type -> tigrisdata.v1.CreateAppKeyResponse + 89, // 137: tigrisdata.v1.Tigris.UpdateAppKey:output_type -> tigrisdata.v1.UpdateAppKeyResponse + 94, // 138: tigrisdata.v1.Tigris.DeleteAppKey:output_type -> tigrisdata.v1.DeleteAppKeyResponse + 92, // 139: tigrisdata.v1.Tigris.ListAppKeys:output_type -> tigrisdata.v1.ListAppKeysResponse + 96, // 140: tigrisdata.v1.Tigris.RotateAppKeySecret:output_type -> tigrisdata.v1.RotateAppKeyResponse + 105, // [105:141] is the sub-list for method output_type + 69, // [69:105] is the sub-list for method input_type + 69, // [69:69] is the sub-list for extension type_name + 69, // [69:69] is the sub-list for extension extendee + 0, // [0:69] is the sub-list for field type_name } func init() { file_server_v1_api_proto_init() } @@ -8778,6 +9543,138 @@ func file_server_v1_api_proto_init() { return nil } } + file_server_v1_api_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateGlobalAppKeyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_server_v1_api_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateGlobalAppKeyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_server_v1_api_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateGlobalAppKeyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_server_v1_api_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateGlobalAppKeyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_server_v1_api_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GlobalAppKey); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_server_v1_api_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListGlobalAppKeysRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_server_v1_api_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListGlobalAppKeysResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_server_v1_api_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteGlobalAppKeyRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_server_v1_api_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteGlobalAppKeyResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_server_v1_api_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RotateGlobalAppKeySecretRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_server_v1_api_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RotateGlobalAppKeySecretResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_server_v1_api_proto_msgTypes[40].OneofWrappers = []interface{}{} file_server_v1_api_proto_msgTypes[43].OneofWrappers = []interface{}{} @@ -8787,7 +9684,7 @@ func file_server_v1_api_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_server_v1_api_proto_rawDesc, NumEnums: 0, - NumMessages: 98, + NumMessages: 109, NumExtensions: 0, NumServices: 1, }, diff --git a/api/server/v1/api.pb.gw.go b/api/server/v1/api.pb.gw.go index d51de5b..35b1531 100644 --- a/api/server/v1/api.pb.gw.go +++ b/api/server/v1/api.pb.gw.go @@ -1983,6 +1983,160 @@ func local_request_Tigris_DescribeCollection_0(ctx context.Context, marshaler ru } +func request_Tigris_CreateGlobalAppKey_0(ctx context.Context, marshaler runtime.Marshaler, client TigrisClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CreateGlobalAppKeyRequest + 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.CreateGlobalAppKey(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Tigris_CreateGlobalAppKey_0(ctx context.Context, marshaler runtime.Marshaler, server TigrisServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CreateGlobalAppKeyRequest + 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.CreateGlobalAppKey(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Tigris_UpdateGlobalAppKey_0(ctx context.Context, marshaler runtime.Marshaler, client TigrisClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UpdateGlobalAppKeyRequest + 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.UpdateGlobalAppKey(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Tigris_UpdateGlobalAppKey_0(ctx context.Context, marshaler runtime.Marshaler, server TigrisServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UpdateGlobalAppKeyRequest + 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.UpdateGlobalAppKey(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Tigris_DeleteGlobalAppKey_0(ctx context.Context, marshaler runtime.Marshaler, client TigrisClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DeleteGlobalAppKeyRequest + 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.DeleteGlobalAppKey(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Tigris_DeleteGlobalAppKey_0(ctx context.Context, marshaler runtime.Marshaler, server TigrisServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DeleteGlobalAppKeyRequest + 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.DeleteGlobalAppKey(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Tigris_ListGlobalAppKeys_0(ctx context.Context, marshaler runtime.Marshaler, client TigrisClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListGlobalAppKeysRequest + var metadata runtime.ServerMetadata + + msg, err := client.ListGlobalAppKeys(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Tigris_ListGlobalAppKeys_0(ctx context.Context, marshaler runtime.Marshaler, server TigrisServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListGlobalAppKeysRequest + var metadata runtime.ServerMetadata + + msg, err := server.ListGlobalAppKeys(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Tigris_RotateGlobalAppKeySecret_0(ctx context.Context, marshaler runtime.Marshaler, client TigrisClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RotateGlobalAppKeySecretRequest + 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.RotateGlobalAppKeySecret(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Tigris_RotateGlobalAppKeySecret_0(ctx context.Context, marshaler runtime.Marshaler, server TigrisServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RotateGlobalAppKeySecretRequest + 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.RotateGlobalAppKeySecret(ctx, &protoReq) + return msg, metadata, err + +} + func request_Tigris_CreateAppKey_0(ctx context.Context, marshaler runtime.Marshaler, client TigrisClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CreateAppKeyRequest var metadata runtime.ServerMetadata @@ -2927,6 +3081,131 @@ func RegisterTigrisHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser }) + mux.Handle("POST", pattern_Tigris_CreateGlobalAppKey_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, "/tigrisdata.v1.Tigris/CreateGlobalAppKey", runtime.WithHTTPPathPattern("/v1/apps/keys/create")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Tigris_CreateGlobalAppKey_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_Tigris_CreateGlobalAppKey_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_Tigris_UpdateGlobalAppKey_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, "/tigrisdata.v1.Tigris/UpdateGlobalAppKey", runtime.WithHTTPPathPattern("/v1/apps/keys/update")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Tigris_UpdateGlobalAppKey_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_Tigris_UpdateGlobalAppKey_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_Tigris_DeleteGlobalAppKey_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, "/tigrisdata.v1.Tigris/DeleteGlobalAppKey", runtime.WithHTTPPathPattern("/v1/apps/keys/delete")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Tigris_DeleteGlobalAppKey_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_Tigris_DeleteGlobalAppKey_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Tigris_ListGlobalAppKeys_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, "/tigrisdata.v1.Tigris/ListGlobalAppKeys", runtime.WithHTTPPathPattern("/v1/apps/keys")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Tigris_ListGlobalAppKeys_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_Tigris_ListGlobalAppKeys_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Tigris_RotateGlobalAppKeySecret_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, "/tigrisdata.v1.Tigris/RotateGlobalAppKeySecret", runtime.WithHTTPPathPattern("/v1/apps/keys/rotate")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Tigris_RotateGlobalAppKeySecret_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_Tigris_RotateGlobalAppKeySecret_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_Tigris_CreateAppKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -3665,6 +3944,116 @@ func RegisterTigrisHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli }) + mux.Handle("POST", pattern_Tigris_CreateGlobalAppKey_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, "/tigrisdata.v1.Tigris/CreateGlobalAppKey", runtime.WithHTTPPathPattern("/v1/apps/keys/create")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Tigris_CreateGlobalAppKey_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Tigris_CreateGlobalAppKey_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_Tigris_UpdateGlobalAppKey_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, "/tigrisdata.v1.Tigris/UpdateGlobalAppKey", runtime.WithHTTPPathPattern("/v1/apps/keys/update")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Tigris_UpdateGlobalAppKey_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Tigris_UpdateGlobalAppKey_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_Tigris_DeleteGlobalAppKey_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, "/tigrisdata.v1.Tigris/DeleteGlobalAppKey", runtime.WithHTTPPathPattern("/v1/apps/keys/delete")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Tigris_DeleteGlobalAppKey_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Tigris_DeleteGlobalAppKey_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Tigris_ListGlobalAppKeys_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, "/tigrisdata.v1.Tigris/ListGlobalAppKeys", runtime.WithHTTPPathPattern("/v1/apps/keys")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Tigris_ListGlobalAppKeys_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Tigris_ListGlobalAppKeys_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Tigris_RotateGlobalAppKeySecret_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, "/tigrisdata.v1.Tigris/RotateGlobalAppKeySecret", runtime.WithHTTPPathPattern("/v1/apps/keys/rotate")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Tigris_RotateGlobalAppKeySecret_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Tigris_RotateGlobalAppKeySecret_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_Tigris_CreateAppKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -3831,6 +4220,16 @@ var ( pattern_Tigris_DescribeCollection_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5, 2, 6}, []string{"v1", "projects", "project", "database", "collections", "collection", "describe"}, "")) + pattern_Tigris_CreateGlobalAppKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "apps", "keys", "create"}, "")) + + pattern_Tigris_UpdateGlobalAppKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "apps", "keys", "update"}, "")) + + pattern_Tigris_DeleteGlobalAppKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "apps", "keys", "delete"}, "")) + + pattern_Tigris_ListGlobalAppKeys_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "apps", "keys"}, "")) + + pattern_Tigris_RotateGlobalAppKeySecret_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "apps", "keys", "rotate"}, "")) + pattern_Tigris_CreateAppKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4, 2, 5}, []string{"v1", "projects", "project", "apps", "keys", "create"}, "")) pattern_Tigris_UpdateAppKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4, 2, 5}, []string{"v1", "projects", "project", "apps", "keys", "update"}, "")) @@ -3895,6 +4294,16 @@ var ( forward_Tigris_DescribeCollection_0 = runtime.ForwardResponseMessage + forward_Tigris_CreateGlobalAppKey_0 = runtime.ForwardResponseMessage + + forward_Tigris_UpdateGlobalAppKey_0 = runtime.ForwardResponseMessage + + forward_Tigris_DeleteGlobalAppKey_0 = runtime.ForwardResponseMessage + + forward_Tigris_ListGlobalAppKeys_0 = runtime.ForwardResponseMessage + + forward_Tigris_RotateGlobalAppKeySecret_0 = runtime.ForwardResponseMessage + forward_Tigris_CreateAppKey_0 = runtime.ForwardResponseMessage forward_Tigris_UpdateAppKey_0 = runtime.ForwardResponseMessage diff --git a/api/server/v1/api_grpc.pb.go b/api/server/v1/api_grpc.pb.go index d2a2c3b..b3ade93 100644 --- a/api/server/v1/api_grpc.pb.go +++ b/api/server/v1/api_grpc.pb.go @@ -59,6 +59,11 @@ const ( Tigris_DeleteBranch_FullMethodName = "/tigrisdata.v1.Tigris/DeleteBranch" Tigris_ListBranches_FullMethodName = "/tigrisdata.v1.Tigris/ListBranches" Tigris_DescribeCollection_FullMethodName = "/tigrisdata.v1.Tigris/DescribeCollection" + Tigris_CreateGlobalAppKey_FullMethodName = "/tigrisdata.v1.Tigris/CreateGlobalAppKey" + Tigris_UpdateGlobalAppKey_FullMethodName = "/tigrisdata.v1.Tigris/UpdateGlobalAppKey" + Tigris_DeleteGlobalAppKey_FullMethodName = "/tigrisdata.v1.Tigris/DeleteGlobalAppKey" + Tigris_ListGlobalAppKeys_FullMethodName = "/tigrisdata.v1.Tigris/ListGlobalAppKeys" + Tigris_RotateGlobalAppKeySecret_FullMethodName = "/tigrisdata.v1.Tigris/RotateGlobalAppKeySecret" Tigris_CreateAppKey_FullMethodName = "/tigrisdata.v1.Tigris/CreateAppKey" Tigris_UpdateAppKey_FullMethodName = "/tigrisdata.v1.Tigris/UpdateAppKey" Tigris_DeleteAppKey_FullMethodName = "/tigrisdata.v1.Tigris/DeleteAppKey" @@ -153,6 +158,16 @@ type TigrisClient interface { ListBranches(ctx context.Context, in *ListBranchesRequest, opts ...grpc.CallOption) (*ListBranchesResponse, error) // Returns the information related to the collection. This can be used to retrieve the schema or size of the collection. DescribeCollection(ctx context.Context, in *DescribeCollectionRequest, opts ...grpc.CallOption) (*DescribeCollectionResponse, error) + // Create a global app key. + CreateGlobalAppKey(ctx context.Context, in *CreateGlobalAppKeyRequest, opts ...grpc.CallOption) (*CreateGlobalAppKeyResponse, error) + // Update the description of the global app key. + UpdateGlobalAppKey(ctx context.Context, in *UpdateGlobalAppKeyRequest, opts ...grpc.CallOption) (*UpdateGlobalAppKeyResponse, error) + // Delete an global app key. + DeleteGlobalAppKey(ctx context.Context, in *DeleteGlobalAppKeyRequest, opts ...grpc.CallOption) (*DeleteGlobalAppKeyResponse, error) + // Lists all the global app keys visible to requesting actor. + ListGlobalAppKeys(ctx context.Context, in *ListGlobalAppKeysRequest, opts ...grpc.CallOption) (*ListGlobalAppKeysResponse, error) + // Endpoint is used to rotate the secret for the app key. + RotateGlobalAppKeySecret(ctx context.Context, in *RotateGlobalAppKeySecretRequest, opts ...grpc.CallOption) (*RotateGlobalAppKeySecretResponse, error) // Create an app key. CreateAppKey(ctx context.Context, in *CreateAppKeyRequest, opts ...grpc.CallOption) (*CreateAppKeyResponse, error) // Update the description of an app key. @@ -453,6 +468,51 @@ func (c *tigrisClient) DescribeCollection(ctx context.Context, in *DescribeColle return out, nil } +func (c *tigrisClient) CreateGlobalAppKey(ctx context.Context, in *CreateGlobalAppKeyRequest, opts ...grpc.CallOption) (*CreateGlobalAppKeyResponse, error) { + out := new(CreateGlobalAppKeyResponse) + err := c.cc.Invoke(ctx, Tigris_CreateGlobalAppKey_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tigrisClient) UpdateGlobalAppKey(ctx context.Context, in *UpdateGlobalAppKeyRequest, opts ...grpc.CallOption) (*UpdateGlobalAppKeyResponse, error) { + out := new(UpdateGlobalAppKeyResponse) + err := c.cc.Invoke(ctx, Tigris_UpdateGlobalAppKey_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tigrisClient) DeleteGlobalAppKey(ctx context.Context, in *DeleteGlobalAppKeyRequest, opts ...grpc.CallOption) (*DeleteGlobalAppKeyResponse, error) { + out := new(DeleteGlobalAppKeyResponse) + err := c.cc.Invoke(ctx, Tigris_DeleteGlobalAppKey_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tigrisClient) ListGlobalAppKeys(ctx context.Context, in *ListGlobalAppKeysRequest, opts ...grpc.CallOption) (*ListGlobalAppKeysResponse, error) { + out := new(ListGlobalAppKeysResponse) + err := c.cc.Invoke(ctx, Tigris_ListGlobalAppKeys_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tigrisClient) RotateGlobalAppKeySecret(ctx context.Context, in *RotateGlobalAppKeySecretRequest, opts ...grpc.CallOption) (*RotateGlobalAppKeySecretResponse, error) { + out := new(RotateGlobalAppKeySecretResponse) + err := c.cc.Invoke(ctx, Tigris_RotateGlobalAppKeySecret_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *tigrisClient) CreateAppKey(ctx context.Context, in *CreateAppKeyRequest, opts ...grpc.CallOption) (*CreateAppKeyResponse, error) { out := new(CreateAppKeyResponse) err := c.cc.Invoke(ctx, Tigris_CreateAppKey_FullMethodName, in, out, opts...) @@ -585,6 +645,16 @@ type TigrisServer interface { ListBranches(context.Context, *ListBranchesRequest) (*ListBranchesResponse, error) // Returns the information related to the collection. This can be used to retrieve the schema or size of the collection. DescribeCollection(context.Context, *DescribeCollectionRequest) (*DescribeCollectionResponse, error) + // Create a global app key. + CreateGlobalAppKey(context.Context, *CreateGlobalAppKeyRequest) (*CreateGlobalAppKeyResponse, error) + // Update the description of the global app key. + UpdateGlobalAppKey(context.Context, *UpdateGlobalAppKeyRequest) (*UpdateGlobalAppKeyResponse, error) + // Delete an global app key. + DeleteGlobalAppKey(context.Context, *DeleteGlobalAppKeyRequest) (*DeleteGlobalAppKeyResponse, error) + // Lists all the global app keys visible to requesting actor. + ListGlobalAppKeys(context.Context, *ListGlobalAppKeysRequest) (*ListGlobalAppKeysResponse, error) + // Endpoint is used to rotate the secret for the app key. + RotateGlobalAppKeySecret(context.Context, *RotateGlobalAppKeySecretRequest) (*RotateGlobalAppKeySecretResponse, error) // Create an app key. CreateAppKey(context.Context, *CreateAppKeyRequest) (*CreateAppKeyResponse, error) // Update the description of an app key. @@ -679,6 +749,21 @@ func (UnimplementedTigrisServer) ListBranches(context.Context, *ListBranchesRequ func (UnimplementedTigrisServer) DescribeCollection(context.Context, *DescribeCollectionRequest) (*DescribeCollectionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DescribeCollection not implemented") } +func (UnimplementedTigrisServer) CreateGlobalAppKey(context.Context, *CreateGlobalAppKeyRequest) (*CreateGlobalAppKeyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateGlobalAppKey not implemented") +} +func (UnimplementedTigrisServer) UpdateGlobalAppKey(context.Context, *UpdateGlobalAppKeyRequest) (*UpdateGlobalAppKeyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateGlobalAppKey not implemented") +} +func (UnimplementedTigrisServer) DeleteGlobalAppKey(context.Context, *DeleteGlobalAppKeyRequest) (*DeleteGlobalAppKeyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteGlobalAppKey not implemented") +} +func (UnimplementedTigrisServer) ListGlobalAppKeys(context.Context, *ListGlobalAppKeysRequest) (*ListGlobalAppKeysResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListGlobalAppKeys not implemented") +} +func (UnimplementedTigrisServer) RotateGlobalAppKeySecret(context.Context, *RotateGlobalAppKeySecretRequest) (*RotateGlobalAppKeySecretResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RotateGlobalAppKeySecret not implemented") +} func (UnimplementedTigrisServer) CreateAppKey(context.Context, *CreateAppKeyRequest) (*CreateAppKeyResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateAppKey not implemented") } @@ -1180,6 +1265,96 @@ func _Tigris_DescribeCollection_Handler(srv interface{}, ctx context.Context, de return interceptor(ctx, in, info, handler) } +func _Tigris_CreateGlobalAppKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateGlobalAppKeyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TigrisServer).CreateGlobalAppKey(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Tigris_CreateGlobalAppKey_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TigrisServer).CreateGlobalAppKey(ctx, req.(*CreateGlobalAppKeyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Tigris_UpdateGlobalAppKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateGlobalAppKeyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TigrisServer).UpdateGlobalAppKey(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Tigris_UpdateGlobalAppKey_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TigrisServer).UpdateGlobalAppKey(ctx, req.(*UpdateGlobalAppKeyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Tigris_DeleteGlobalAppKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteGlobalAppKeyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TigrisServer).DeleteGlobalAppKey(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Tigris_DeleteGlobalAppKey_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TigrisServer).DeleteGlobalAppKey(ctx, req.(*DeleteGlobalAppKeyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Tigris_ListGlobalAppKeys_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListGlobalAppKeysRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TigrisServer).ListGlobalAppKeys(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Tigris_ListGlobalAppKeys_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TigrisServer).ListGlobalAppKeys(ctx, req.(*ListGlobalAppKeysRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Tigris_RotateGlobalAppKeySecret_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RotateGlobalAppKeySecretRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TigrisServer).RotateGlobalAppKeySecret(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Tigris_RotateGlobalAppKeySecret_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TigrisServer).RotateGlobalAppKeySecret(ctx, req.(*RotateGlobalAppKeySecretRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Tigris_CreateAppKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateAppKeyRequest) if err := dec(in); err != nil { @@ -1373,6 +1548,26 @@ var Tigris_ServiceDesc = grpc.ServiceDesc{ MethodName: "DescribeCollection", Handler: _Tigris_DescribeCollection_Handler, }, + { + MethodName: "CreateGlobalAppKey", + Handler: _Tigris_CreateGlobalAppKey_Handler, + }, + { + MethodName: "UpdateGlobalAppKey", + Handler: _Tigris_UpdateGlobalAppKey_Handler, + }, + { + MethodName: "DeleteGlobalAppKey", + Handler: _Tigris_DeleteGlobalAppKey_Handler, + }, + { + MethodName: "ListGlobalAppKeys", + Handler: _Tigris_ListGlobalAppKeys_Handler, + }, + { + MethodName: "RotateGlobalAppKeySecret", + Handler: _Tigris_RotateGlobalAppKeySecret_Handler, + }, { MethodName: "CreateAppKey", Handler: _Tigris_CreateAppKey_Handler, diff --git a/api/server/v1/auth.pb.go b/api/server/v1/auth.pb.go index 558c44a..782f50b 100644 --- a/api/server/v1/auth.pb.go +++ b/api/server/v1/auth.pb.go @@ -345,6 +345,13 @@ type CreateInvitationsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + // machine friendly status = created + Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + // human friendly message + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + // number of invitations created + Count int32 `protobuf:"varint,3,opt,name=count,proto3" json:"count,omitempty"` } func (x *CreateInvitationsResponse) Reset() { @@ -379,6 +386,27 @@ func (*CreateInvitationsResponse) Descriptor() ([]byte, []int) { return file_server_v1_auth_proto_rawDescGZIP(), []int{4} } +func (x *CreateInvitationsResponse) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *CreateInvitationsResponse) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *CreateInvitationsResponse) GetCount() int32 { + if x != nil { + return x.Count + } + return 0 +} + type DeleteInvitationsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -438,6 +466,11 @@ type DeleteInvitationsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + // machine friendly status = deleted + Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + // human friendly message + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` } func (x *DeleteInvitationsResponse) Reset() { @@ -472,6 +505,20 @@ func (*DeleteInvitationsResponse) Descriptor() ([]byte, []int) { return file_server_v1_auth_proto_rawDescGZIP(), []int{6} } +func (x *DeleteInvitationsResponse) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *DeleteInvitationsResponse) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + type Invitation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1007,155 +1054,163 @@ var file_server_v1_auth_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x69, - 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x1b, 0x0a, 0x19, 0x43, 0x72, + 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x63, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x58, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x22, 0x1b, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9d, - 0x02, 0x0a, 0x0a, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, - 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x29, 0x0a, 0x10, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x69, 0x67, 0x72, 0x69, - 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x69, - 0x67, 0x72, 0x69, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x74, 0x69, 0x67, 0x72, 0x69, - 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, - 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x12, 0x26, 0x0a, - 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x40, - 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x22, 0x5b, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x69, - 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, - 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0b, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x43, 0x0a, - 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x12, - 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x22, 0x8d, 0x01, 0x0a, 0x18, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x76, - 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x29, 0x0a, 0x10, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x69, 0x67, 0x72, 0x69, - 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x69, - 0x67, 0x72, 0x69, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x74, 0x69, 0x67, 0x72, 0x69, - 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, - 0x6c, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x43, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x75, - 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x69, 0x67, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x58, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4d, 0x0a, 0x19, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x9d, 0x02, 0x0a, 0x0a, 0x49, 0x6e, 0x76, + 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, + 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x69, 0x67, + 0x72, 0x69, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x13, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x40, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, + 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x42, + 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x5b, 0x0a, 0x17, 0x4c, 0x69, + 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x7d, 0x0a, 0x04, 0x55, - 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x2a, 0x36, 0x0a, 0x09, 0x47, 0x72, - 0x61, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x46, 0x52, 0x45, - 0x53, 0x48, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x4c, - 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x53, - 0x10, 0x01, 0x32, 0xc0, 0x09, 0x0a, 0x04, 0x41, 0x75, 0x74, 0x68, 0x12, 0xa3, 0x01, 0x0a, 0x0e, - 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x29, - 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x69, 0x67, 0x72, - 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0xba, 0x47, 0x1e, 0x0a, 0x0e, 0x41, 0x75, 0x74, 0x68, - 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0c, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x20, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, - 0x2a, 0x22, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0xdc, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, - 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6a, 0xba, 0x47, 0x37, 0x0a, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, - 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6a, 0x6f, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x61, - 0x75, 0x74, 0x68, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x12, 0xdc, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, - 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x6a, 0xba, 0x47, 0x37, 0x0a, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x69, 0x6e, - 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6a, 0x6f, 0x69, - 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x2a, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, - 0x74, 0x68, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x76, - 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, - 0xd7, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, - 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, + 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x69, 0x6e, 0x76, 0x69, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x43, 0x0a, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x8d, 0x01, 0x0a, + 0x18, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x69, 0x67, + 0x72, 0x69, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x13, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x12, 0x0a, 0x10, + 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x43, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, + 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x7d, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, + 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x69, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x72, 0x6f, 0x6c, 0x65, 0x2a, 0x36, 0x0a, 0x09, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, 0x5f, 0x54, 0x4f, 0x4b, + 0x45, 0x4e, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x43, + 0x52, 0x45, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x53, 0x10, 0x01, 0x32, 0xc0, 0x09, 0x0a, + 0x04, 0x41, 0x75, 0x74, 0x68, 0x12, 0xa3, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x29, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, + 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x3a, 0xba, 0x47, 0x1e, 0x0a, 0x0e, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0c, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x3a, 0x01, 0x2a, 0x22, 0x0e, 0x2f, 0x76, 0x31, + 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0xdc, 0x01, 0x0a, 0x11, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x2c, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, + 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2b, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, - 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6b, 0xba, 0x47, - 0x3d, 0x0a, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x4c, - 0x69, 0x73, 0x74, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x76, - 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6a, 0x6f, 0x69, 0x6e, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0xc7, 0x01, 0x0a, 0x10, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, + 0x2d, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, + 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6a, + 0xba, 0x47, 0x37, 0x0a, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x29, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, + 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0xdc, 0x01, 0x0a, 0x11, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x2c, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, + 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, - 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6a, 0xba, + 0x47, 0x37, 0x0a, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x29, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, + 0x01, 0x2a, 0x2a, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0xd7, 0x01, 0x0a, 0x0f, 0x4c, 0x69, + 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x2e, + 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x74, 0x69, 0x67, 0x72, + 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6b, 0xba, 0x47, 0x3d, 0x0a, 0x0a, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x73, 0x20, 0x61, + 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, + 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, + 0x69, 0x73, 0x74, 0x12, 0xc7, 0x01, 0x0a, 0x10, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x49, 0x6e, + 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, + 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, + 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x58, 0xba, 0x47, 0x25, 0x0a, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, + 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x76, 0x69, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0xaf, 0x01, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x24, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, - 0x2e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x58, 0xba, 0x47, 0x25, 0x0a, 0x0a, - 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x69, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x76, - 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x2f, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x12, 0xaf, 0x01, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x73, 0x12, 0x24, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, - 0x64, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x55, - 0xba, 0x47, 0x32, 0x0a, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x24, 0x4c, 0x69, 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, - 0x20, 0x69, 0x6e, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x76, 0x31, - 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, - 0x75, 0x73, 0x65, 0x72, 0x73, 0x42, 0x41, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x74, 0x69, 0x67, - 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x64, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x5a, 0x20, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x74, 0x69, - 0x67, 0x72, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x55, 0xba, 0x47, 0x32, 0x0a, 0x0a, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x4c, 0x69, 0x73, 0x74, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x42, + 0x41, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x64, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x5a, 0x20, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x69, 0x67, + 0x72, 0x69, 0x73, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x74, 0x69, 0x67, 0x72, 0x69, 0x73, 0x2f, 0x61, + 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/server/v1/marshaler.go b/api/server/v1/marshaler.go index b0105b6..0644d62 100644 --- a/api/server/v1/marshaler.go +++ b/api/server/v1/marshaler.go @@ -36,7 +36,7 @@ type CustomDecoder struct { reader io.Reader } -func (f CustomDecoder) Decode(dst interface{}) error { +func (f CustomDecoder) Decode(dst any) error { if _, ok := dst.(*GetAccessTokenRequest); ok { byteArr, err := io.ReadAll(f.reader) if err != nil { @@ -53,7 +53,7 @@ type CustomMarshaler struct { JSONBuiltin *runtime.JSONBuiltin } -func (c *CustomMarshaler) NewDecoder(r io.Reader) runtime.Decoder { +func (*CustomMarshaler) NewDecoder(r io.Reader) runtime.Decoder { return CustomDecoder{ jsonDecoder: jsoniter.NewDecoder(r), reader: r, @@ -64,11 +64,11 @@ func (c *CustomMarshaler) NewEncoder(w io.Writer) runtime.Encoder { return c.JSONBuiltin.NewEncoder(w) } -func (c *CustomMarshaler) ContentType(v interface{}) string { +func (c *CustomMarshaler) ContentType(v any) string { return c.JSONBuiltin.ContentType(v) } -func (c *CustomMarshaler) Marshal(v interface{}) ([]byte, error) { +func (c *CustomMarshaler) Marshal(v any) ([]byte, error) { switch ty := v.(type) { case map[string]proto.Message: // this comes from GRPC-gateway streaming code @@ -96,14 +96,14 @@ func (c *CustomMarshaler) Marshal(v interface{}) ([]byte, error) { return c.JSONBuiltin.Marshal(v) } -func (c *CustomMarshaler) Unmarshal(data []byte, v interface{}) error { +func (c *CustomMarshaler) Unmarshal(data []byte, v any) error { if _, ok := v.(*GetAccessTokenRequest); ok { return unmarshalInternal(data, v) } return c.JSONBuiltin.Unmarshal(data, v) } -func unmarshalInternal(data []byte, v interface{}) error { +func unmarshalInternal(data []byte, v any) error { if v, ok := v.(*GetAccessTokenRequest); ok { values, err := url.ParseQuery(string(data)) if err != nil { @@ -134,7 +134,7 @@ func (x *ReadRequest) UnmarshalJSON(data []byte) error { } for key, value := range mp { - var v interface{} + var v any switch key { case "project": @@ -177,7 +177,7 @@ func (x *SearchRequest) UnmarshalJSON(data []byte) error { } for key, value := range mp { - var v interface{} + var v any switch key { case "project": @@ -236,7 +236,7 @@ func (x *ImportRequest) UnmarshalJSON(data []byte) error { } for key, value := range mp { - var v interface{} + var v any switch key { case "primary_key": @@ -259,10 +259,7 @@ func (x *ImportRequest) UnmarshalJSON(data []byte) error { return err } - x.Documents = make([][]byte, len(docs)) - for i := 0; i < len(docs); i++ { - x.Documents[i] = docs[i] - } + x.Documents = RawMessageToByte(docs) continue default: continue @@ -297,7 +294,7 @@ func (x *InsertRequest) UnmarshalJSON(data []byte) error { } for key, value := range mp { - var v interface{} + var v any switch key { case "project": @@ -314,10 +311,7 @@ func (x *InsertRequest) UnmarshalJSON(data []byte) error { return err } - x.Documents = make([][]byte, len(docs)) - for i := 0; i < len(docs); i++ { - x.Documents[i] = docs[i] - } + x.Documents = RawMessageToByte(docs) continue default: continue @@ -343,7 +337,7 @@ func (x *ReplaceRequest) UnmarshalJSON(data []byte) error { } for key, value := range mp { - var v interface{} + var v any switch key { case "project": @@ -358,10 +352,7 @@ func (x *ReplaceRequest) UnmarshalJSON(data []byte) error { return err } - x.Documents = make([][]byte, len(docs)) - for i := 0; i < len(docs); i++ { - x.Documents[i] = docs[i] - } + x.Documents = RawMessageToByte(docs) continue case "options": v = &x.Options @@ -387,7 +378,7 @@ func (x *UpdateRequest) UnmarshalJSON(data []byte) error { } for key, value := range mp { - var v interface{} + var v any switch key { case "project": @@ -428,7 +419,7 @@ func (x *DeleteRequest) UnmarshalJSON(data []byte) error { } for key, value := range mp { - var v interface{} + var v any switch key { case "project": @@ -465,7 +456,7 @@ func (x *CountRequest) UnmarshalJSON(data []byte) error { } for key, value := range mp { - var v interface{} + var v any switch key { case "project": @@ -499,7 +490,7 @@ func (x *CreateOrUpdateCollectionRequest) UnmarshalJSON(data []byte) error { } for key, value := range mp { - var v interface{} + var v any switch key { case "project": @@ -536,7 +527,7 @@ func (x *CreateOrUpdateCollectionsRequest) UnmarshalJSON(data []byte) error { } for key, value := range mp { - var v interface{} + var v any switch key { case "project": diff --git a/driver/driver.go b/driver/driver.go index 4e128da..c939cec 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -68,6 +68,12 @@ type Driver interface { UpdateAppKey(ctx context.Context, project string, id string, name string, description string) (*AppKey, error) ListAppKeys(ctx context.Context, project string) ([]*AppKey, error) RotateAppKeySecret(ctx context.Context, project string, id string) (*AppKey, error) + + CreateGlobalAppKey(ctx context.Context, name string, description string) (*GlobalAppKey, error) + DeleteGlobalAppKey(ctx context.Context, id string) error + UpdateGlobalAppKey(ctx context.Context, id string, name string, description string) (*GlobalAppKey, error) + ListGlobalAppKeys(ctx context.Context) ([]*GlobalAppKey, error) + RotateGlobalAppKeySecret(ctx context.Context, id string) (*GlobalAppKey, error) } // Tx object is used to atomically modify documents. diff --git a/driver/grpc.go b/driver/grpc.go index f98e08e..3edc9f5 100644 --- a/driver/grpc.go +++ b/driver/grpc.go @@ -650,6 +650,66 @@ func (c *grpcDriver) RotateAppKeySecret(ctx context.Context, project string, id return (*AppKey)(r.AppKey), nil } +func (c *grpcDriver) CreateGlobalAppKey(ctx context.Context, name string, description string) (*GlobalAppKey, error) { + r, err := c.api.CreateGlobalAppKey(ctx, &api.CreateGlobalAppKeyRequest{Name: name, Description: description}) + if err != nil { + return nil, GRPCError(err) + } + + if r.CreatedAppKey == nil { + return nil, Error{TigrisError: api.Errorf(api.Code_INTERNAL, "empty response")} + } + + return (*GlobalAppKey)(r.CreatedAppKey), nil +} + +func (c *grpcDriver) DeleteGlobalAppKey(ctx context.Context, id string) error { + _, err := c.api.DeleteGlobalAppKey(ctx, &api.DeleteGlobalAppKeyRequest{Id: id}) + + return GRPCError(err) +} + +func (c *grpcDriver) UpdateGlobalAppKey(ctx context.Context, id string, name string, description string, +) (*GlobalAppKey, error) { + r, err := c.api.UpdateGlobalAppKey(ctx, &api.UpdateGlobalAppKeyRequest{Id: id, Name: name, Description: description}) + if err != nil { + return nil, GRPCError(err) + } + + if r.UpdatedAppKey == nil { + return nil, Error{TigrisError: api.Errorf(api.Code_INTERNAL, "empty response")} + } + + return (*GlobalAppKey)(r.UpdatedAppKey), nil +} + +func (c *grpcDriver) ListGlobalAppKeys(ctx context.Context) ([]*GlobalAppKey, error) { + r, err := c.api.ListGlobalAppKeys(ctx, &api.ListGlobalAppKeysRequest{}) + if err != nil { + return nil, GRPCError(err) + } + + applications := make([]*GlobalAppKey, 0, len(r.AppKeys)) + for _, a := range r.GetAppKeys() { + applications = append(applications, (*GlobalAppKey)(a)) + } + + return applications, nil +} + +func (c *grpcDriver) RotateGlobalAppKeySecret(ctx context.Context, id string) (*GlobalAppKey, error) { + r, err := c.api.RotateGlobalAppKeySecret(ctx, &api.RotateGlobalAppKeySecretRequest{Id: id}) + if err != nil { + return nil, GRPCError(err) + } + + if r.AppKey == nil { + return nil, Error{TigrisError: api.Errorf(api.Code_INTERNAL, "empty response")} + } + + return (*GlobalAppKey)(r.AppKey), nil +} + func (c *grpcDriver) GetAccessToken(ctx context.Context, clientID string, clientSecret string, refreshToken string, ) (*TokenResponse, error) { diff --git a/driver/http.go b/driver/http.go index d9a8888..22f011a 100644 --- a/driver/http.go +++ b/driver/http.go @@ -324,7 +324,8 @@ func (c *httpDriver) Health(ctx context.Context) (*HealthResponse, error) { return &i, nil } -func (c *httpDriver) describeProjectWithOptions(ctx context.Context, project string, options *DescribeProjectOptions) (*DescribeDatabaseResponse, error) { +func (c *httpDriver) describeProjectWithOptions(ctx context.Context, project string, options *DescribeProjectOptions, +) (*DescribeDatabaseResponse, error) { resp, err := c.api.TigrisDescribeDatabase(ctx, project, apiHTTP.TigrisDescribeDatabaseJSONRequestBody{ SchemaFormat: &options.SchemaFormat, Branch: &c.cfg.Branch, @@ -362,7 +363,8 @@ func (c *httpDriver) describeProjectWithOptions(ctx context.Context, project str return &r, nil } -func (c *httpDriver) createProjectWithOptions(ctx context.Context, project string, _ *CreateProjectOptions) (*CreateProjectResponse, error) { +func (c *httpDriver) createProjectWithOptions(ctx context.Context, project string, _ *CreateProjectOptions, +) (*CreateProjectResponse, error) { resp, err := c.api.TigrisCreateProject(ctx, project, apiHTTP.TigrisCreateProjectJSONRequestBody{}) if err := HTTPError(err, resp); err != nil { return nil, err @@ -381,7 +383,8 @@ func (c *httpDriver) createProjectWithOptions(ctx context.Context, project strin return &r, nil } -func (c *httpDriver) deleteProjectWithOptions(ctx context.Context, project string, _ *DeleteProjectOptions) (*DeleteProjectResponse, error) { +func (c *httpDriver) deleteProjectWithOptions(ctx context.Context, project string, _ *DeleteProjectOptions, +) (*DeleteProjectResponse, error) { resp, err := c.api.TigrisDeleteProject(ctx, project, apiHTTP.TigrisDeleteProjectJSONRequestBody{}) if err := HTTPError(err, resp); err != nil { return nil, err @@ -549,7 +552,9 @@ func (c *httpCRUD) listCollectionsWithOptions(ctx context.Context, _ *Collection return collections, nil } -func (c *httpCRUD) describeCollectionWithOptions(ctx context.Context, collection string, options *DescribeCollectionOptions) (*DescribeCollectionResponse, error) { +func (c *httpCRUD) describeCollectionWithOptions(ctx context.Context, collection string, + options *DescribeCollectionOptions, +) (*DescribeCollectionResponse, error) { resp, err := c.api.TigrisDescribeCollection(ctx, c.db, collection, apiHTTP.TigrisDescribeCollectionJSONRequestBody{ Branch: &c.branch, SchemaFormat: &options.SchemaFormat, @@ -621,7 +626,8 @@ func (c *httpCRUD) dropCollectionWithOptions(ctx context.Context, collection str return HTTPError(err, resp) } -func (c *httpCRUD) insertWithOptions(ctx context.Context, collection string, docs []Document, options *InsertOptions) (*InsertResponse, error) { +func (c *httpCRUD) insertWithOptions(ctx context.Context, collection string, docs []Document, options *InsertOptions, +) (*InsertResponse, error) { ctx = setHTTPTxCtx(ctx, c.txCtx, c.cookies) resp, err := c.api.TigrisInsert(ctx, c.db, collection, apiHTTP.TigrisInsertJSONRequestBody{ @@ -642,7 +648,8 @@ func (c *httpCRUD) insertWithOptions(ctx context.Context, collection string, doc return &d, nil } -func (c *httpCRUD) replaceWithOptions(ctx context.Context, collection string, docs []Document, options *ReplaceOptions) (*ReplaceResponse, error) { +func (c *httpCRUD) replaceWithOptions(ctx context.Context, collection string, docs []Document, options *ReplaceOptions, +) (*ReplaceResponse, error) { ctx = setHTTPTxCtx(ctx, c.txCtx, c.cookies) resp, err := c.api.TigrisReplace(ctx, c.db, collection, apiHTTP.TigrisReplaceJSONRequestBody{ @@ -663,7 +670,9 @@ func (c *httpCRUD) replaceWithOptions(ctx context.Context, collection string, do return &d, nil } -func (c *httpCRUD) updateWithOptions(ctx context.Context, collection string, filter Filter, fields Update, options *UpdateOptions) (*UpdateResponse, error) { +func (c *httpCRUD) updateWithOptions(ctx context.Context, collection string, filter Filter, fields Update, + options *UpdateOptions, +) (*UpdateResponse, error) { ctx = setHTTPTxCtx(ctx, c.txCtx, c.cookies) resp, err := c.api.TigrisUpdate(ctx, c.db, collection, apiHTTP.TigrisUpdateJSONRequestBody{ @@ -685,7 +694,8 @@ func (c *httpCRUD) updateWithOptions(ctx context.Context, collection string, fil return &d, nil } -func (c *httpCRUD) deleteWithOptions(ctx context.Context, collection string, filter Filter, options *DeleteOptions) (*DeleteResponse, error) { +func (c *httpCRUD) deleteWithOptions(ctx context.Context, collection string, filter Filter, options *DeleteOptions, +) (*DeleteResponse, error) { ctx = setHTTPTxCtx(ctx, c.txCtx, c.cookies) resp, err := c.api.TigrisDelete(ctx, c.db, collection, apiHTTP.TigrisDeleteJSONRequestBody{ @@ -706,7 +716,9 @@ func (c *httpCRUD) deleteWithOptions(ctx context.Context, collection string, fil return &d, nil } -func (c *httpCRUD) readWithOptions(ctx context.Context, collection string, filter Filter, fields Projection, options *ReadOptions) (Iterator, error) { +func (c *httpCRUD) readWithOptions(ctx context.Context, collection string, filter Filter, fields Projection, + options *ReadOptions, +) (Iterator, error) { ctx = setHTTPTxCtx(ctx, c.txCtx, c.cookies) resp, err := c.api.TigrisRead(ctx, c.db, collection, apiHTTP.TigrisReadJSONRequestBody{ @@ -748,7 +760,9 @@ func (c *httpCRUD) countWithOptions(ctx context.Context, collection string, filt return PtrToInt64(r.Count), nil } -func (c *httpCRUD) explainWithOptions(ctx context.Context, collection string, filter Filter, fields Projection, options *ReadOptions) (*ExplainResponse, error) { +func (c *httpCRUD) explainWithOptions(ctx context.Context, collection string, filter Filter, fields Projection, + options *ReadOptions, +) (*ExplainResponse, error) { ctx = setHTTPTxCtx(ctx, c.txCtx, c.cookies) resp, err := c.api.TigrisExplain(ctx, c.db, collection, apiHTTP.TigrisReadJSONRequestBody{ @@ -897,21 +911,29 @@ func (g *httpSearchReader) close() error { return g.closer.Close() } -func (c *httpDriver) CreateAppKey(ctx context.Context, project string, name string, description string) (*AppKey, error) { - resp, err := c.api.TigrisCreateAppKey(ctx, project, apiHTTP.TigrisCreateAppKeyJSONRequestBody{Name: &name, Description: &description}) +func (c *httpDriver) CreateAppKey(ctx context.Context, project string, name string, description string, +) (*AppKey, error) { + resp, err := c.api.TigrisCreateAppKey(ctx, project, apiHTTP.TigrisCreateAppKeyJSONRequestBody{ + Name: &name, + Description: &description, + }) if err := HTTPError(err, resp); err != nil { return nil, err } var app struct { - CreatedAppKey AppKey `json:"created_app_key"` + CreatedAppKey *AppKey `json:"created_app_key"` } if err := respDecode(resp.Body, &app); err != nil { return nil, err } - return &app.CreatedAppKey, nil + if app.CreatedAppKey == nil { + return nil, Error{TigrisError: api.Errorf(api.Code_INTERNAL, "empty response")} + } + + return app.CreatedAppKey, nil } func (c *httpDriver) DeleteAppKey(ctx context.Context, project string, id string) error { @@ -920,21 +942,29 @@ func (c *httpDriver) DeleteAppKey(ctx context.Context, project string, id string return HTTPError(err, resp) } -func (c *httpDriver) UpdateAppKey(ctx context.Context, project string, id string, name string, description string) (*AppKey, error) { - resp, err := c.api.TigrisUpdateAppKey(ctx, project, apiHTTP.TigrisUpdateAppKeyJSONRequestBody{Id: &id, Name: &name, Description: &description}) +func (c *httpDriver) UpdateAppKey(ctx context.Context, project string, id string, name string, description string, +) (*AppKey, error) { + resp, err := c.api.TigrisUpdateAppKey(ctx, project, apiHTTP.TigrisUpdateAppKeyJSONRequestBody{ + Id: &id, + Name: &name, Description: &description, + }) if err := HTTPError(err, resp); err != nil { return nil, err } var app struct { - UpdatedAppKey AppKey `json:"updated_app_key"` + UpdatedAppKey *AppKey `json:"updated_app_key"` } - if err := respDecode(resp.Body, &app); err != nil { + if err = respDecode(resp.Body, &app); err != nil { return nil, err } - return &app.UpdatedAppKey, nil + if app.UpdatedAppKey == nil { + return nil, Error{TigrisError: api.Errorf(api.Code_INTERNAL, "empty response")} + } + + return app.UpdatedAppKey, nil } func (c *httpDriver) ListAppKeys(ctx context.Context, project string) ([]*AppKey, error) { @@ -947,7 +977,7 @@ func (c *httpDriver) ListAppKeys(ctx context.Context, project string) ([]*AppKey AppKeys []*AppKey `json:"app_keys"` } - if err := respDecode(resp.Body, &apps); err != nil { + if err = respDecode(resp.Body, &apps); err != nil { return nil, err } @@ -961,21 +991,121 @@ func (c *httpDriver) RotateAppKeySecret(ctx context.Context, project string, id } var app struct { - AppKey AppKey `json:"app_key"` + AppKey *AppKey `json:"app_key"` } - if err := respDecode(resp.Body, &app); err != nil { + if err = respDecode(resp.Body, &app); err != nil { + return nil, err + } + + if app.AppKey == nil { + return nil, Error{TigrisError: api.Errorf(api.Code_INTERNAL, "empty response")} + } + + return app.AppKey, nil +} + +func (c *httpDriver) CreateGlobalAppKey(ctx context.Context, name string, description string) (*GlobalAppKey, error) { + resp, err := c.api.TigrisCreateGlobalAppKey(ctx, apiHTTP.TigrisCreateGlobalAppKeyJSONRequestBody{ + Name: &name, + Description: &description, + }) + if err := HTTPError(err, resp); err != nil { + return nil, err + } + + var app struct { + CreatedAppKey *GlobalAppKey `json:"created_app_key"` + } + + if err = respDecode(resp.Body, &app); err != nil { + return nil, err + } + + if app.CreatedAppKey == nil { + return nil, Error{TigrisError: api.Errorf(api.Code_INTERNAL, "empty response")} + } + + return app.CreatedAppKey, nil +} + +func (c *httpDriver) DeleteGlobalAppKey(ctx context.Context, id string) error { + resp, err := c.api.TigrisDeleteGlobalAppKey(ctx, apiHTTP.TigrisDeleteGlobalAppKeyJSONRequestBody{Id: &id}) + + return HTTPError(err, resp) +} + +func (c *httpDriver) UpdateGlobalAppKey(ctx context.Context, id string, name string, description string, +) (*GlobalAppKey, error) { + resp, err := c.api.TigrisUpdateGlobalAppKey(ctx, apiHTTP.TigrisUpdateGlobalAppKeyJSONRequestBody{ + Id: &id, + Name: &name, Description: &description, + }) + if err := HTTPError(err, resp); err != nil { + return nil, err + } + + var app struct { + UpdatedAppKey *GlobalAppKey `json:"updated_app_key"` + } + + if err = respDecode(resp.Body, &app); err != nil { + return nil, err + } + + if app.UpdatedAppKey == nil { + return nil, Error{TigrisError: api.Errorf(api.Code_INTERNAL, "empty response")} + } + + return app.UpdatedAppKey, nil +} + +func (c *httpDriver) ListGlobalAppKeys(ctx context.Context) ([]*GlobalAppKey, error) { + resp, err := c.api.TigrisListGlobalAppKeys(ctx) + if err := HTTPError(err, resp); err != nil { + return nil, err + } + + var apps struct { + GlobalAppKeys []*GlobalAppKey `json:"app_keys"` + } + + if err := respDecode(resp.Body, &apps); err != nil { + return nil, err + } + + return apps.GlobalAppKeys, nil +} + +func (c *httpDriver) RotateGlobalAppKeySecret(ctx context.Context, id string) (*GlobalAppKey, error) { + resp, err := c.api.TigrisRotateGlobalAppKeySecret(ctx, apiHTTP.TigrisRotateGlobalAppKeySecretJSONRequestBody{Id: &id}) + if err := HTTPError(err, resp); err != nil { return nil, err } - return &app.AppKey, nil + var app struct { + AppKey *GlobalAppKey `json:"app_key"` + } + + if err = respDecode(resp.Body, &app); err != nil { + return nil, err + } + + if app.AppKey == nil { + return nil, Error{TigrisError: api.Errorf(api.Code_INTERNAL, "empty response")} + } + + return app.AppKey, nil } -func (c *httpDriver) GetAccessToken(ctx context.Context, clientID string, clientSecret string, refreshToken string) (*TokenResponse, error) { +func (c *httpDriver) GetAccessToken(ctx context.Context, clientID string, clientSecret string, refreshToken string, +) (*TokenResponse, error) { return getAccessToken(ctx, c.tokenURL, c.cfg, clientID, clientSecret, refreshToken) } -func getAccessToken(ctx context.Context, tokenURL string, cfg *config.Driver, clientID string, clientSecret string, refreshToken string) (*TokenResponse, error) { +func getAccessToken(ctx context.Context, tokenURL string, cfg *config.Driver, clientID string, clientSecret string, + refreshToken string, +) (*TokenResponse, error) { data := url.Values{ "client_id": {clientID}, "client_secret": {clientSecret}, diff --git a/driver/internal.go b/driver/internal.go index c982224..311c38f 100644 --- a/driver/internal.go +++ b/driver/internal.go @@ -42,6 +42,12 @@ type driverWithOptions interface { ListAppKeys(ctx context.Context, project string) ([]*AppKey, error) RotateAppKeySecret(ctx context.Context, project string, id string) (*AppKey, error) + CreateGlobalAppKey(ctx context.Context, name string, description string) (*GlobalAppKey, error) + DeleteGlobalAppKey(ctx context.Context, id string) error + UpdateGlobalAppKey(ctx context.Context, id string, name string, description string) (*GlobalAppKey, error) + ListGlobalAppKeys(ctx context.Context) ([]*GlobalAppKey, error) + RotateGlobalAppKeySecret(ctx context.Context, id string) (*GlobalAppKey, error) + Close() error } diff --git a/driver/management_grpc_test.go b/driver/management_grpc_test.go index c6a69df..503549c 100644 --- a/driver/management_grpc_test.go +++ b/driver/management_grpc_test.go @@ -62,7 +62,9 @@ func TestGRPCAuthDriver(t *testing.T) { drv, managementClient, mockServers, cancel := SetupMgmtGRPCTests(t, &config.Driver{}) defer cancel() testDriverAuth(t, drv, managementClient, mockServers.API, mockServers.Auth, mockServers.Mgmt) + testGlobalAppKeys(t, drv, mockServers.API) testDriverAuthNegative(t, drv, managementClient, mockServers.API, mockServers.Mgmt) + testGlobalGlobalAppKeysNegative(t, drv, mockServers.API) } func TestGRPCDriverCredentials(t *testing.T) { diff --git a/driver/management_http_test.go b/driver/management_http_test.go index 85030f2..184690c 100644 --- a/driver/management_http_test.go +++ b/driver/management_http_test.go @@ -31,6 +31,9 @@ func TestHTTPAuthDriver(t *testing.T) { drv, managementClient, mockServers, cancel := SetupMgmtHTTPTests(t, &config.Driver{}) defer cancel() testDriverAuth(t, drv, managementClient, mockServers.API, mockServers.Auth, mockServers.Mgmt) + testGlobalAppKeys(t, drv, mockServers.API) + testDriverAuthNegative(t, drv, managementClient, mockServers.API, mockServers.Mgmt) + testGlobalGlobalAppKeysNegative(t, drv, mockServers.API) } func TestHTTPGetInfo(t *testing.T) { diff --git a/driver/management_test.go b/driver/management_test.go index 0d77ec7..d60c706 100644 --- a/driver/management_test.go +++ b/driver/management_test.go @@ -41,6 +41,16 @@ func appEqual(t *testing.T, exp *api.AppKey, act *AppKey) { require.Equal(t, exp.Description, act.Description) } +func globalAppKeyEqual(t *testing.T, exp *api.GlobalAppKey, act *GlobalAppKey) { + t.Helper() + + require.Equal(t, exp.Id, act.Id) + require.Equal(t, exp.Name, act.Name) + require.Equal(t, exp.CreatedAt, act.CreatedAt) + require.Equal(t, exp.CreatedBy, act.CreatedBy) + require.Equal(t, exp.Description, act.Description) +} + func testDriverAuthNegative(t *testing.T, drv Driver, m Management, mt *mock.MockTigrisServer, mc *mock.MockManagementServer) { t.Helper() @@ -62,6 +72,13 @@ func testDriverAuthNegative(t *testing.T, drv Driver, m Management, mt *mock.Moc _, err = drv.UpdateAppKey(ctx, project1, "upd_id1", "upd_app1", "upd_description1") require.Error(t, err) + mt.EXPECT().UpdateAppKey(gomock.Any(), + pm(&api.UpdateAppKeyRequest{Id: "upd_id1", Project: project1, Name: "upd_app1", Description: "upd_description1"})).Return( + &api.UpdateAppKeyResponse{UpdatedAppKey: &api.AppKey{Id: "id1"}}, fmt.Errorf("some error")) + + _, err = drv.UpdateAppKey(ctx, project1, "upd_id1", "upd_app1", "upd_description1") + require.Error(t, err) + mt.EXPECT().ListAppKeys(gomock.Any(), pm(&api.ListAppKeysRequest{Project: project1})).Return( nil, fmt.Errorf("some error")) @@ -76,6 +93,13 @@ func testDriverAuthNegative(t *testing.T, drv Driver, m Management, mt *mock.Moc _, err = drv.RotateAppKeySecret(ctx, project1, "ras_id1") require.Error(t, err) + mt.EXPECT().RotateAppKeySecret(gomock.Any(), + pm(&api.RotateAppKeyRequest{Id: "ras_id1", Project: project1})).Return( + &api.RotateAppKeyResponse{AppKey: &api.AppKey{Id: "id1"}}, fmt.Errorf("some error")) + + _, err = drv.RotateAppKeySecret(ctx, project1, "ras_id1") + require.Error(t, err) + mc.EXPECT().CreateNamespace(gomock.Any(), pm(&api.CreateNamespaceRequest{Name: "app1"})).Return( nil, fmt.Errorf("some error")) @@ -91,7 +115,9 @@ func testDriverAuthNegative(t *testing.T, drv Driver, m Management, mt *mock.Moc require.Error(t, err) } -func testDriverAuth(t *testing.T, drv Driver, m Management, mt *mock.MockTigrisServer, ma *mock.MockAuthServer, mc *mock.MockManagementServer) { +func testDriverAuth(t *testing.T, drv Driver, m Management, mt *mock.MockTigrisServer, ma *mock.MockAuthServer, + mc *mock.MockManagementServer, +) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() @@ -168,7 +194,10 @@ func testDriverAuth(t *testing.T, drv Driver, m Management, mt *mock.MockTigrisS appEqual(t, lapp2, app) ma.EXPECT().GetAccessToken(gomock.Any(), - pm(&api.GetAccessTokenRequest{ClientId: "client_id1", ClientSecret: "secret1", GrantType: api.GrantType_CLIENT_CREDENTIALS})).Return( + pm(&api.GetAccessTokenRequest{ + ClientId: "client_id1", ClientSecret: "secret1", + GrantType: api.GrantType_CLIENT_CREDENTIALS, + })).Return( &api.GetAccessTokenResponse{AccessToken: "access_token1", RefreshToken: "refresh_token1"}, nil) token, err := m.GetAccessToken(ctx, "client_id1", "secret1", "") @@ -177,7 +206,10 @@ func testDriverAuth(t *testing.T, drv Driver, m Management, mt *mock.MockTigrisS require.Equal(t, "refresh_token1", token.RefreshToken) ma.EXPECT().GetAccessToken(gomock.Any(), - pm(&api.GetAccessTokenRequest{ClientId: "", ClientSecret: "", RefreshToken: "refresh_token_req", GrantType: api.GrantType_REFRESH_TOKEN})).Return( + pm(&api.GetAccessTokenRequest{ + ClientId: "", ClientSecret: "", RefreshToken: "refresh_token_req", + GrantType: api.GrantType_REFRESH_TOKEN, + })).Return( &api.GetAccessTokenResponse{AccessToken: "access_token2", RefreshToken: "refresh_token2"}, nil) token, err = m.GetAccessToken(ctx, "", "", "refresh_token_req") @@ -212,13 +244,141 @@ func testDriverAuth(t *testing.T, drv Driver, m Management, mt *mock.MockTigrisS require.NoError(t, err) } +func testGlobalAppKeys(t *testing.T, drv Driver, mt *mock.MockTigrisServer) { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + capp := &api.GlobalAppKey{Id: "id1", Name: "app1", Description: "desc1", CreatedAt: 111, CreatedBy: "cby", Secret: "secret"} + + mt.EXPECT().CreateGlobalAppKey(gomock.Any(), + pm(&api.CreateGlobalAppKeyRequest{Name: "app1", Description: "description1"})).Return( + &api.CreateGlobalAppKeyResponse{CreatedAppKey: capp}, nil) + + app, err := drv.CreateGlobalAppKey(ctx, "app1", "description1") + require.NoError(t, err) + + globalAppKeyEqual(t, capp, app) + + mt.EXPECT().DeleteGlobalAppKey(gomock.Any(), + pm(&api.DeleteGlobalAppKeyRequest{Id: "del_id1"})).Return( + &api.DeleteGlobalAppKeyResponse{Deleted: true}, nil) + + err = drv.DeleteGlobalAppKey(ctx, "del_id1") + require.NoError(t, err) + + uapp := &api.GlobalAppKey{Id: "upd_id1", Name: "upd_app1", Description: "upd_desc1", UpdatedAt: 222, UpdatedBy: "uby"} + + mt.EXPECT().UpdateGlobalAppKey(gomock.Any(), + pm(&api.UpdateGlobalAppKeyRequest{Id: "upd_id1", Name: "upd_app1", Description: "upd_description1"})).Return( + &api.UpdateGlobalAppKeyResponse{UpdatedAppKey: uapp}, nil) + + app, err = drv.UpdateGlobalAppKey(ctx, "upd_id1", "upd_app1", "upd_description1") + require.NoError(t, err) + + globalAppKeyEqual(t, uapp, app) + + lapp1 := &api.GlobalAppKey{ + Id: "list_id1", Name: "list_app1", Description: "list_desc1", UpdatedAt: 222, + UpdatedBy: "uby", CreatedAt: 111, CreatedBy: "cby", + } + lapp2 := &api.GlobalAppKey{ + Id: "list_id2", Name: "list_app2", Description: "list_desc2", UpdatedAt: 222222, + UpdatedBy: "uby2", CreatedAt: 111222, CreatedBy: "cby2", + } + lapp3 := &api.GlobalAppKey{ + Id: "list_id3", Name: "list_app3", Description: "list_desc3", UpdatedAt: 222333, + UpdatedBy: "uby3", CreatedAt: 111333, CreatedBy: "cby3", + } + + mt.EXPECT().ListGlobalAppKeys(gomock.Any(), + pm(&api.ListGlobalAppKeysRequest{})).Return( + &api.ListGlobalAppKeysResponse{AppKeys: []*api.GlobalAppKey{lapp1, lapp2, lapp3}}, nil) + + list, err := drv.ListGlobalAppKeys(ctx) + require.NoError(t, err) + + require.Equal(t, 3, len(list)) + globalAppKeyEqual(t, lapp1, list[0]) + globalAppKeyEqual(t, lapp2, list[1]) + globalAppKeyEqual(t, lapp3, list[2]) + + mt.EXPECT().ListGlobalAppKeys(gomock.Any(), + pm(&api.ListGlobalAppKeysRequest{})).Return( + &api.ListGlobalAppKeysResponse{}, nil) + + list, err = drv.ListGlobalAppKeys(ctx) + require.NoError(t, err) + require.Equal(t, 0, len(list)) + + mt.EXPECT().RotateGlobalAppKeySecret(gomock.Any(), + pm(&api.RotateGlobalAppKeySecretRequest{Id: "ras_id1"})).Return( + &api.RotateGlobalAppKeySecretResponse{AppKey: lapp2}, nil) + + app, err = drv.RotateGlobalAppKeySecret(ctx, "ras_id1") + require.NoError(t, err) + + globalAppKeyEqual(t, lapp2, app) +} + +func testGlobalGlobalAppKeysNegative(t *testing.T, drv Driver, mt *mock.MockTigrisServer) { + t.Helper() + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + mt.EXPECT().CreateGlobalAppKey(gomock.Any(), + pm(&api.CreateGlobalAppKeyRequest{Name: "app1", Description: "description1"})).Return( + &api.CreateGlobalAppKeyResponse{CreatedAppKey: nil}, nil) + + _, err := drv.CreateGlobalAppKey(ctx, "app1", "description1") + require.Error(t, err) + + mt.EXPECT().UpdateGlobalAppKey(gomock.Any(), + pm(&api.UpdateGlobalAppKeyRequest{Id: "upd_id1", Name: "upd_app1", Description: "upd_description1"})).Return( + &api.UpdateGlobalAppKeyResponse{UpdatedAppKey: nil}, nil) + + _, err = drv.UpdateGlobalAppKey(ctx, "upd_id1", "upd_app1", "upd_description1") + require.Error(t, err) + + mt.EXPECT().UpdateGlobalAppKey(gomock.Any(), + pm(&api.UpdateGlobalAppKeyRequest{Id: "upd_id1", Name: "upd_app1", Description: "upd_description1"})).Return( + &api.UpdateGlobalAppKeyResponse{UpdatedAppKey: &api.GlobalAppKey{Id: "id1"}}, fmt.Errorf("some error")) + + _, err = drv.UpdateGlobalAppKey(ctx, "upd_id1", "upd_app1", "upd_description1") + require.Error(t, err) + + mt.EXPECT().ListGlobalAppKeys(gomock.Any(), + pm(&api.ListGlobalAppKeysRequest{})).Return( + nil, fmt.Errorf("some error")) + + _, err = drv.ListGlobalAppKeys(ctx) + require.Error(t, err) + + mt.EXPECT().RotateGlobalAppKeySecret(gomock.Any(), + pm(&api.RotateGlobalAppKeySecretRequest{Id: "ras_id1"})).Return( + &api.RotateGlobalAppKeySecretResponse{AppKey: nil}, nil) + + _, err = drv.RotateGlobalAppKeySecret(ctx, "ras_id1") + require.Error(t, err) + + mt.EXPECT().RotateGlobalAppKeySecret(gomock.Any(), + pm(&api.RotateGlobalAppKeySecretRequest{Id: "ras_id1"})).Return( + &api.RotateGlobalAppKeySecretResponse{AppKey: &api.GlobalAppKey{Id: "id1"}}, fmt.Errorf("some error")) + + _, err = drv.RotateGlobalAppKeySecret(ctx, "ras_id1") + require.Error(t, err) +} + func testDriverToken(t *testing.T, d Driver, mc *mock.MockTigrisServer, mca *mock.MockAuthServer, token string, getToken bool) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if getToken { mca.EXPECT().GetAccessToken(gomock.Any(), - pm(&api.GetAccessTokenRequest{ClientId: "client_id_test", ClientSecret: "client_secret_test", GrantType: api.GrantType_CLIENT_CREDENTIALS})).Return( + pm(&api.GetAccessTokenRequest{ + ClientId: "client_id_test", ClientSecret: "client_secret_test", + GrantType: api.GrantType_CLIENT_CREDENTIALS, + })).Return( &api.GetAccessTokenResponse{AccessToken: token, RefreshToken: "refresh_token1", ExpiresIn: 11}, nil) } diff --git a/driver/types.go b/driver/types.go index d096709..983e99a 100644 --- a/driver/types.go +++ b/driver/types.go @@ -165,6 +165,7 @@ func (e *Error) As(i any) bool { type ( AppKey api.AppKey + GlobalAppKey api.GlobalAppKey TokenResponse api.GetAccessTokenResponse Namespace api.NamespaceInfo diff --git a/mock/api/grpc.go b/mock/api/grpc.go index 2ab4691..547e375 100644 --- a/mock/api/grpc.go +++ b/mock/api/grpc.go @@ -140,6 +140,21 @@ func (mr *MockTigrisServerMockRecorder) CreateBranch(arg0, arg1 interface{}) *go return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBranch", reflect.TypeOf((*MockTigrisServer)(nil).CreateBranch), arg0, arg1) } +// CreateGlobalAppKey mocks base method. +func (m *MockTigrisServer) CreateGlobalAppKey(arg0 context.Context, arg1 *api.CreateGlobalAppKeyRequest) (*api.CreateGlobalAppKeyResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateGlobalAppKey", arg0, arg1) + ret0, _ := ret[0].(*api.CreateGlobalAppKeyResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateGlobalAppKey indicates an expected call of CreateGlobalAppKey. +func (mr *MockTigrisServerMockRecorder) CreateGlobalAppKey(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateGlobalAppKey", reflect.TypeOf((*MockTigrisServer)(nil).CreateGlobalAppKey), arg0, arg1) +} + // CreateOrUpdateCollection mocks base method. func (m *MockTigrisServer) CreateOrUpdateCollection(arg0 context.Context, arg1 *api.CreateOrUpdateCollectionRequest) (*api.CreateOrUpdateCollectionResponse, error) { m.ctrl.T.Helper() @@ -230,6 +245,21 @@ func (mr *MockTigrisServerMockRecorder) DeleteBranch(arg0, arg1 interface{}) *go return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBranch", reflect.TypeOf((*MockTigrisServer)(nil).DeleteBranch), arg0, arg1) } +// DeleteGlobalAppKey mocks base method. +func (m *MockTigrisServer) DeleteGlobalAppKey(arg0 context.Context, arg1 *api.DeleteGlobalAppKeyRequest) (*api.DeleteGlobalAppKeyResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteGlobalAppKey", arg0, arg1) + ret0, _ := ret[0].(*api.DeleteGlobalAppKeyResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteGlobalAppKey indicates an expected call of DeleteGlobalAppKey. +func (mr *MockTigrisServerMockRecorder) DeleteGlobalAppKey(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteGlobalAppKey", reflect.TypeOf((*MockTigrisServer)(nil).DeleteGlobalAppKey), arg0, arg1) +} + // DeleteProject mocks base method. func (m *MockTigrisServer) DeleteProject(arg0 context.Context, arg1 *api.DeleteProjectRequest) (*api.DeleteProjectResponse, error) { m.ctrl.T.Helper() @@ -380,6 +410,21 @@ func (mr *MockTigrisServerMockRecorder) ListCollections(arg0, arg1 interface{}) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListCollections", reflect.TypeOf((*MockTigrisServer)(nil).ListCollections), arg0, arg1) } +// ListGlobalAppKeys mocks base method. +func (m *MockTigrisServer) ListGlobalAppKeys(arg0 context.Context, arg1 *api.ListGlobalAppKeysRequest) (*api.ListGlobalAppKeysResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListGlobalAppKeys", arg0, arg1) + ret0, _ := ret[0].(*api.ListGlobalAppKeysResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListGlobalAppKeys indicates an expected call of ListGlobalAppKeys. +func (mr *MockTigrisServerMockRecorder) ListGlobalAppKeys(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListGlobalAppKeys", reflect.TypeOf((*MockTigrisServer)(nil).ListGlobalAppKeys), arg0, arg1) +} + // ListProjects mocks base method. func (m *MockTigrisServer) ListProjects(arg0 context.Context, arg1 *api.ListProjectsRequest) (*api.ListProjectsResponse, error) { m.ctrl.T.Helper() @@ -454,6 +499,21 @@ func (mr *MockTigrisServerMockRecorder) RotateAppKeySecret(arg0, arg1 interface{ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RotateAppKeySecret", reflect.TypeOf((*MockTigrisServer)(nil).RotateAppKeySecret), arg0, arg1) } +// RotateGlobalAppKeySecret mocks base method. +func (m *MockTigrisServer) RotateGlobalAppKeySecret(arg0 context.Context, arg1 *api.RotateGlobalAppKeySecretRequest) (*api.RotateGlobalAppKeySecretResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RotateGlobalAppKeySecret", arg0, arg1) + ret0, _ := ret[0].(*api.RotateGlobalAppKeySecretResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RotateGlobalAppKeySecret indicates an expected call of RotateGlobalAppKeySecret. +func (mr *MockTigrisServerMockRecorder) RotateGlobalAppKeySecret(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RotateGlobalAppKeySecret", reflect.TypeOf((*MockTigrisServer)(nil).RotateGlobalAppKeySecret), arg0, arg1) +} + // Search mocks base method. func (m *MockTigrisServer) Search(arg0 *api.SearchRequest, arg1 api.Tigris_SearchServer) error { m.ctrl.T.Helper() @@ -498,6 +558,21 @@ func (mr *MockTigrisServerMockRecorder) UpdateAppKey(arg0, arg1 interface{}) *go return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateAppKey", reflect.TypeOf((*MockTigrisServer)(nil).UpdateAppKey), arg0, arg1) } +// UpdateGlobalAppKey mocks base method. +func (m *MockTigrisServer) UpdateGlobalAppKey(arg0 context.Context, arg1 *api.UpdateGlobalAppKeyRequest) (*api.UpdateGlobalAppKeyResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateGlobalAppKey", arg0, arg1) + ret0, _ := ret[0].(*api.UpdateGlobalAppKeyResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateGlobalAppKey indicates an expected call of UpdateGlobalAppKey. +func (mr *MockTigrisServerMockRecorder) UpdateGlobalAppKey(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateGlobalAppKey", reflect.TypeOf((*MockTigrisServer)(nil).UpdateGlobalAppKey), arg0, arg1) +} + // MockAuthServer is a mock of AuthServer interface. type MockAuthServer struct { ctrl *gomock.Controller diff --git a/mock/driver.go b/mock/driver.go index 30b915f..89fee9e 100644 --- a/mock/driver.go +++ b/mock/driver.go @@ -65,6 +65,21 @@ func (mr *MockDriverMockRecorder) CreateAppKey(arg0, arg1, arg2, arg3 interface{ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateAppKey", reflect.TypeOf((*MockDriver)(nil).CreateAppKey), arg0, arg1, arg2, arg3) } +// CreateGlobalAppKey mocks base method. +func (m *MockDriver) CreateGlobalAppKey(arg0 context.Context, arg1, arg2 string) (*driver.GlobalAppKey, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateGlobalAppKey", arg0, arg1, arg2) + ret0, _ := ret[0].(*driver.GlobalAppKey) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateGlobalAppKey indicates an expected call of CreateGlobalAppKey. +func (mr *MockDriverMockRecorder) CreateGlobalAppKey(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateGlobalAppKey", reflect.TypeOf((*MockDriver)(nil).CreateGlobalAppKey), arg0, arg1, arg2) +} + // CreateProject mocks base method. func (m *MockDriver) CreateProject(arg0 context.Context, arg1 string, arg2 ...*driver.CreateProjectOptions) (*driver.CreateProjectResponse, error) { m.ctrl.T.Helper() @@ -99,6 +114,20 @@ func (mr *MockDriverMockRecorder) DeleteAppKey(arg0, arg1, arg2 interface{}) *go return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAppKey", reflect.TypeOf((*MockDriver)(nil).DeleteAppKey), arg0, arg1, arg2) } +// DeleteGlobalAppKey mocks base method. +func (m *MockDriver) DeleteGlobalAppKey(arg0 context.Context, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteGlobalAppKey", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteGlobalAppKey indicates an expected call of DeleteGlobalAppKey. +func (mr *MockDriverMockRecorder) DeleteGlobalAppKey(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteGlobalAppKey", reflect.TypeOf((*MockDriver)(nil).DeleteGlobalAppKey), arg0, arg1) +} + // DeleteProject mocks base method. func (m *MockDriver) DeleteProject(arg0 context.Context, arg1 string, arg2 ...*driver.DeleteProjectOptions) (*driver.DeleteProjectResponse, error) { m.ctrl.T.Helper() @@ -184,6 +213,21 @@ func (mr *MockDriverMockRecorder) ListAppKeys(arg0, arg1 interface{}) *gomock.Ca return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAppKeys", reflect.TypeOf((*MockDriver)(nil).ListAppKeys), arg0, arg1) } +// ListGlobalAppKeys mocks base method. +func (m *MockDriver) ListGlobalAppKeys(arg0 context.Context) ([]*driver.GlobalAppKey, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListGlobalAppKeys", arg0) + ret0, _ := ret[0].([]*driver.GlobalAppKey) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListGlobalAppKeys indicates an expected call of ListGlobalAppKeys. +func (mr *MockDriverMockRecorder) ListGlobalAppKeys(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListGlobalAppKeys", reflect.TypeOf((*MockDriver)(nil).ListGlobalAppKeys), arg0) +} + // ListProjects mocks base method. func (m *MockDriver) ListProjects(arg0 context.Context) ([]string, error) { m.ctrl.T.Helper() @@ -214,6 +258,21 @@ func (mr *MockDriverMockRecorder) RotateAppKeySecret(arg0, arg1, arg2 interface{ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RotateAppKeySecret", reflect.TypeOf((*MockDriver)(nil).RotateAppKeySecret), arg0, arg1, arg2) } +// RotateGlobalAppKeySecret mocks base method. +func (m *MockDriver) RotateGlobalAppKeySecret(arg0 context.Context, arg1 string) (*driver.GlobalAppKey, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RotateGlobalAppKeySecret", arg0, arg1) + ret0, _ := ret[0].(*driver.GlobalAppKey) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// RotateGlobalAppKeySecret indicates an expected call of RotateGlobalAppKeySecret. +func (mr *MockDriverMockRecorder) RotateGlobalAppKeySecret(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RotateGlobalAppKeySecret", reflect.TypeOf((*MockDriver)(nil).RotateGlobalAppKeySecret), arg0, arg1) +} + // UpdateAppKey mocks base method. func (m *MockDriver) UpdateAppKey(arg0 context.Context, arg1, arg2, arg3, arg4 string) (*driver.AppKey, error) { m.ctrl.T.Helper() @@ -229,6 +288,21 @@ func (mr *MockDriverMockRecorder) UpdateAppKey(arg0, arg1, arg2, arg3, arg4 inte return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateAppKey", reflect.TypeOf((*MockDriver)(nil).UpdateAppKey), arg0, arg1, arg2, arg3, arg4) } +// UpdateGlobalAppKey mocks base method. +func (m *MockDriver) UpdateGlobalAppKey(arg0 context.Context, arg1, arg2, arg3 string) (*driver.GlobalAppKey, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateGlobalAppKey", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*driver.GlobalAppKey) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateGlobalAppKey indicates an expected call of UpdateGlobalAppKey. +func (mr *MockDriverMockRecorder) UpdateGlobalAppKey(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateGlobalAppKey", reflect.TypeOf((*MockDriver)(nil).UpdateGlobalAppKey), arg0, arg1, arg2, arg3) +} + // UseDatabase mocks base method. func (m *MockDriver) UseDatabase(arg0 string) driver.Database { m.ctrl.T.Helper() diff --git a/test/setup.go b/test/setup.go index 3625b8f..095ee91 100644 --- a/test/setup.go +++ b/test/setup.go @@ -49,6 +49,7 @@ var ( apiPathPrefix + ("/management/*"), apiPathPrefix + ("/observability/*"), apiPathPrefix + ("/auth/*"), + apiPathPrefix + ("/apps/*"), } ) From 0bb4e049b1fa38cc5d4d4adc54cff61a64c7ba24 Mon Sep 17 00:00:00 2001 From: Yevgeniy Firsov Date: Sat, 6 May 2023 21:15:16 -0700 Subject: [PATCH 3/3] feat: Invitations API --- driver/grpc.go | 70 ++++++++++ driver/http.go | 79 +++++++++++ driver/management.go | 6 + driver/management_grpc_test.go | 2 + driver/management_http_test.go | 2 + driver/management_test.go | 245 +++++++++++++++++++++++++++++++++ driver/types.go | 11 +- 7 files changed, 411 insertions(+), 4 deletions(-) diff --git a/driver/grpc.go b/driver/grpc.go index 3edc9f5..f502b37 100644 --- a/driver/grpc.go +++ b/driver/grpc.go @@ -731,6 +731,76 @@ func (c *grpcDriver) GetAccessToken(ctx context.Context, clientID string, client return (*TokenResponse)(r), nil } +func (c *grpcDriver) CreateInvitations(ctx context.Context, invitations []*InvitationInfo) error { + invs := make([]*api.InvitationInfo, 0, len(invitations)) + for _, a := range invitations { + invs = append(invs, (*api.InvitationInfo)(a)) + } + + _, err := c.auth.CreateInvitations(ctx, &api.CreateInvitationsRequest{ + Invitations: invs, + }) + if err != nil { + return GRPCError(err) + } + + return nil +} + +func (c *grpcDriver) DeleteInvitations(ctx context.Context, email string, status string) error { + _, err := c.auth.DeleteInvitations(ctx, &api.DeleteInvitationsRequest{ + Email: email, + Status: &status, + }) + if err != nil { + return GRPCError(err) + } + + return nil +} + +func (c *grpcDriver) ListInvitations(ctx context.Context, status string) ([]*Invitation, error) { + resp, err := c.auth.ListInvitations(ctx, &api.ListInvitationsRequest{ + Status: &status, + }) + if err != nil { + return nil, GRPCError(err) + } + + invs := make([]*Invitation, 0, len(resp.Invitations)) + for _, a := range resp.Invitations { + invs = append(invs, (*Invitation)(a)) + } + + return invs, nil +} + +func (c *grpcDriver) VerifyInvitation(ctx context.Context, email string, code string) error { + _, err := c.auth.VerifyInvitation(ctx, &api.VerifyInvitationRequest{ + Email: email, + Code: code, + }) + if err != nil { + return GRPCError(err) + } + + return nil +} + +func (c *grpcDriver) ListUsers(ctx context.Context) ([]*User, error) { + resp, err := c.auth.ListUsers(ctx, &api.ListUsersRequest{}) + if err != nil { + return nil, GRPCError(err) + } + + users := make([]*User, 0, len(resp.Users)) + for _, a := range resp.Users { + users = append(users, (*User)(a)) + } + + return users, nil +} + func (c *grpcDriver) CreateNamespace(ctx context.Context, name string) error { _, err := c.mgmt.CreateNamespace(ctx, &api.CreateNamespaceRequest{Name: name}) if err != nil { diff --git a/driver/http.go b/driver/http.go index 22f011a..0bc0d57 100644 --- a/driver/http.go +++ b/driver/http.go @@ -1159,6 +1159,85 @@ func getAccessToken(ctx context.Context, tokenURL string, cfg *config.Driver, cl return &tr, nil } +func (c *httpDriver) CreateInvitations(ctx context.Context, invitations []*InvitationInfo) error { + invs := make([]apiHTTP.InvitationInfo, 0, len(invitations)) + for _, a := range invitations { + invs = append(invs, apiHTTP.InvitationInfo{ + Email: &a.Email, + InvitationSentByName: &a.InvitationSentByName, + Role: &a.Role, + }) + } + + resp, err := c.api.AuthCreateInvitations(ctx, apiHTTP.AuthCreateInvitationsJSONRequestBody{ + Invitations: &invs, + }) + if err = HTTPError(err, resp); err != nil { + return err + } + + return nil +} + +func (c *httpDriver) DeleteInvitations(ctx context.Context, email string, status string) error { + resp, err := c.api.AuthDeleteInvitations(ctx, apiHTTP.AuthDeleteInvitationsJSONRequestBody{ + Email: &email, + Status: &status, + }) + + return HTTPError(err, resp) +} + +func (c *httpDriver) ListInvitations(ctx context.Context, status string) ([]*Invitation, error) { + resp, err := c.api.AuthListInvitations(ctx, &apiHTTP.AuthListInvitationsParams{ + Status: &status, + }) + if err = HTTPError(err, resp); err != nil { + return nil, err + } + + var r api.ListInvitationsResponse + if err := respDecode(resp.Body, &r); err != nil { + return nil, err + } + + invs := make([]*Invitation, 0, len(r.Invitations)) + for _, a := range r.Invitations { + invs = append(invs, (*Invitation)(a)) + } + + return invs, nil +} + +func (c *httpDriver) VerifyInvitation(ctx context.Context, email string, code string) error { + resp, err := c.api.AuthVerifyInvitation(ctx, apiHTTP.AuthVerifyInvitationJSONRequestBody{ + Email: &email, + Code: &code, + }) + + return HTTPError(err, resp) +} + +func (c *httpDriver) ListUsers(ctx context.Context) ([]*User, error) { + resp, err := c.api.AuthListUsers(ctx) + + if err = HTTPError(err, resp); err != nil { + return nil, err + } + + var r api.ListUsersResponse + if err := respDecode(resp.Body, &r); err != nil { + return nil, err + } + + users := make([]*User, 0, len(r.Users)) + for _, a := range r.Users { + users = append(users, (*User)(a)) + } + + return users, nil +} + func (c *httpDriver) CreateNamespace(ctx context.Context, name string) error { resp, err := c.api.ManagementCreateNamespace(ctx, apiHTTP.ManagementCreateNamespaceJSONRequestBody{Name: &name}) if err := HTTPError(err, resp); err != nil { diff --git a/driver/management.go b/driver/management.go index 1a960d3..c8ea105 100644 --- a/driver/management.go +++ b/driver/management.go @@ -28,6 +28,12 @@ type Management interface { CreateNamespace(ctx context.Context, name string) error ListNamespaces(ctx context.Context) ([]*Namespace, error) + CreateInvitations(ctx context.Context, invitations []*InvitationInfo) error + DeleteInvitations(ctx context.Context, email string, status string) error + ListInvitations(ctx context.Context, status string) ([]*Invitation, error) + VerifyInvitation(ctx context.Context, email string, code string) error + ListUsers(ctx context.Context) ([]*User, error) + Close() error } diff --git a/driver/management_grpc_test.go b/driver/management_grpc_test.go index 503549c..b069121 100644 --- a/driver/management_grpc_test.go +++ b/driver/management_grpc_test.go @@ -65,6 +65,8 @@ func TestGRPCAuthDriver(t *testing.T) { testGlobalAppKeys(t, drv, mockServers.API) testDriverAuthNegative(t, drv, managementClient, mockServers.API, mockServers.Mgmt) testGlobalGlobalAppKeysNegative(t, drv, mockServers.API) + testInvitations(t, managementClient, mockServers.Auth) + testInvitationsNegative(t, managementClient, mockServers.Auth) } func TestGRPCDriverCredentials(t *testing.T) { diff --git a/driver/management_http_test.go b/driver/management_http_test.go index 184690c..f521104 100644 --- a/driver/management_http_test.go +++ b/driver/management_http_test.go @@ -34,6 +34,8 @@ func TestHTTPAuthDriver(t *testing.T) { testGlobalAppKeys(t, drv, mockServers.API) testDriverAuthNegative(t, drv, managementClient, mockServers.API, mockServers.Mgmt) testGlobalGlobalAppKeysNegative(t, drv, mockServers.API) + testInvitations(t, managementClient, mockServers.Auth) + testInvitationsNegative(t, managementClient, mockServers.Auth) } func TestHTTPGetInfo(t *testing.T) { diff --git a/driver/management_test.go b/driver/management_test.go index d60c706..ae54b16 100644 --- a/driver/management_test.go +++ b/driver/management_test.go @@ -441,3 +441,248 @@ func testGetInfo(t *testing.T, c Driver, mc *mock.MockObservabilityServer) { _, err = c.Info(ctx) require.Error(t, err) } + +func testInvitations(t *testing.T, m Management, ma *mock.MockAuthServer) { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + t.Run("create_invitations", func(t *testing.T) { + ma.EXPECT().CreateInvitations(gomock.Any(), + pm(&api.CreateInvitationsRequest{ + Invitations: []*api.InvitationInfo{ + { + Email: "email1", + Role: "role1", + InvitationSentByName: "inv_by_name1", + }, + { + Email: "email2", + Role: "role2", + InvitationSentByName: "inv_by_name2", + }, + }, + })).Return(&api.CreateInvitationsResponse{ + Status: "created", + Message: "msg1", + Count: 2, + }, nil) + + err := m.CreateInvitations(ctx, []*InvitationInfo{ + { + Email: "email1", + Role: "role1", + InvitationSentByName: "inv_by_name1", + }, + { + Email: "email2", + Role: "role2", + InvitationSentByName: "inv_by_name2", + }, + }) + require.NoError(t, err) + }) + + t.Run("delete_invitations", func(t *testing.T) { + status := "status1" + + ma.EXPECT().DeleteInvitations(gomock.Any(), + pm(&api.DeleteInvitationsRequest{ + Email: "email1", + Status: &status, + }), + ).Return(&api.DeleteInvitationsResponse{Status: "deleted", Message: "msg1"}, nil) + + err := m.DeleteInvitations(ctx, "email1", "status1") + require.NoError(t, err) + }) + + t.Run("verify_invitations", func(t *testing.T) { + ma.EXPECT().VerifyInvitation(gomock.Any(), + pm(&api.VerifyInvitationRequest{ + Email: "email1", + Code: "code1", + }), + ).Return(&api.VerifyInvitationResponse{ + TigrisNamespace: "ns1", + TigrisNamespaceName: "ns_name1", + Role: "role1", + }, nil) + + err := m.VerifyInvitation(ctx, "email1", "code1") + require.NoError(t, err) + }) + + t.Run("list_invitations", func(t *testing.T) { + status := "status1" + ma.EXPECT().ListInvitations(gomock.Any(), + pm(&api.ListInvitationsRequest{ + Status: &status, + }), + ).Return(&api.ListInvitationsResponse{ + Invitations: []*api.Invitation{ + { + Email: "email1", + Role: "role1", + Status: "status1", + TigrisNamespace: "ns1", + TigrisNamespaceName: "ns_name1", + CreatedBy: "created_by1", + CreatedByName: "created_by_name1", + ExpirationTime: 12345, + }, + { + Email: "email2", + Role: "role2", + Status: "status2", + TigrisNamespace: "ns2", + TigrisNamespaceName: "ns_name2", + CreatedBy: "created_by2", + CreatedByName: "created_by_name2", + ExpirationTime: 22345, + }, + }, + }, nil) + + invs, err := m.ListInvitations(ctx, "status1") + require.NoError(t, err) + + require.Equal(t, []*Invitation{ + { + Email: "email1", + Role: "role1", + Status: "status1", + TigrisNamespace: "ns1", + TigrisNamespaceName: "ns_name1", + CreatedBy: "created_by1", + CreatedByName: "created_by_name1", + ExpirationTime: 12345, + }, + { + Email: "email2", + Role: "role2", + Status: "status2", + TigrisNamespace: "ns2", + TigrisNamespaceName: "ns_name2", + CreatedBy: "created_by2", + CreatedByName: "created_by_name2", + ExpirationTime: 22345, + }, + }, invs) + }) + + t.Run("list_users", func(t *testing.T) { + ma.EXPECT().ListUsers(gomock.Any(), + pm(&api.ListUsersRequest{}), + ).Return(&api.ListUsersResponse{ + Users: []*api.User{ + { + Email: "email1", + Name: "name1", + CreatedAt: 12345, + Picture: "pic1", + Role: "role1", + }, + { + Email: "email2", + Name: "name2", + CreatedAt: 22345, + Picture: "pic2", + Role: "role2", + }, + }, + }, nil) + users, err := m.ListUsers(ctx) + require.NoError(t, err) + require.Equal(t, []*User{ + { + Email: "email1", + Name: "name1", + CreatedAt: 12345, + Picture: "pic1", + Role: "role1", + }, + { + Email: "email2", + Name: "name2", + CreatedAt: 22345, + Picture: "pic2", + Role: "role2", + }, + }, users) + }) +} + +func testInvitationsNegative(t *testing.T, m Management, ma *mock.MockAuthServer) { + t.Helper() + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + t.Run("create_invitations", func(t *testing.T) { + ma.EXPECT().CreateInvitations(gomock.Any(), + pm(&api.CreateInvitationsRequest{ + Invitations: []*api.InvitationInfo{ + { + Email: "email1", + Role: "role1", + InvitationSentByName: "inv_by_name1", + }, + }, + })).Return(nil, fmt.Errorf("some error")) + + err := m.CreateInvitations(ctx, []*InvitationInfo{ + { + Email: "email1", + Role: "role1", + InvitationSentByName: "inv_by_name1", + }, + }) + require.Error(t, err) + }) + + t.Run("delete_invitations", func(t *testing.T) { + status := "status1" + + ma.EXPECT().DeleteInvitations(gomock.Any(), + pm(&api.DeleteInvitationsRequest{ + Email: "email1", + Status: &status, + }), + ).Return(nil, fmt.Errorf("some error")) + + err := m.DeleteInvitations(ctx, "email1", "status1") + require.Error(t, err) + }) + + t.Run("verify_invitations", func(t *testing.T) { + ma.EXPECT().VerifyInvitation(gomock.Any(), + pm(&api.VerifyInvitationRequest{ + Email: "email1", + Code: "code1", + }), + ).Return(nil, fmt.Errorf("some error")) + + err := m.VerifyInvitation(ctx, "email1", "code1") + require.Error(t, err) + }) + + t.Run("list_invitations", func(t *testing.T) { + status := "status1" + ma.EXPECT().ListInvitations(gomock.Any(), + pm(&api.ListInvitationsRequest{ + Status: &status, + }), + ).Return(nil, fmt.Errorf("some error")) + + _, err := m.ListInvitations(ctx, "status1") + require.Error(t, err) + }) + + t.Run("list_users", func(t *testing.T) { + ma.EXPECT().ListUsers(gomock.Any(), + pm(&api.ListUsersRequest{}), + ).Return(nil, nil) + _, err := m.ListUsers(ctx) + require.Error(t, err) + }) +} diff --git a/driver/types.go b/driver/types.go index 983e99a..eb6ff46 100644 --- a/driver/types.go +++ b/driver/types.go @@ -164,10 +164,13 @@ func (e *Error) As(i any) bool { } type ( - AppKey api.AppKey - GlobalAppKey api.GlobalAppKey - TokenResponse api.GetAccessTokenResponse - Namespace api.NamespaceInfo + AppKey api.AppKey + GlobalAppKey api.GlobalAppKey + TokenResponse api.GetAccessTokenResponse + Namespace api.NamespaceInfo + User api.User + Invitation api.Invitation + InvitationInfo api.InvitationInfo QuotaLimits api.QuotaLimitsResponse QuotaUsage api.QuotaUsageResponse