From 45b92b0ffb23db9dee600e7239f1e993bb833130 Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Thu, 9 Apr 2026 13:56:31 -0400 Subject: [PATCH 01/18] added enum, obligationssort message, and sort field to list request has buf.validate as per usual and comments for docs. regen protos as well --- docs/grpc/index.html | 91 +- .../obligations/obligations.openapi.yaml | 38 +- .../go/policy/obligations/obligations.pb.go | 1517 +++++++++-------- service/policy/obligations/obligations.proto | 19 + 4 files changed, 987 insertions(+), 678 deletions(-) diff --git a/docs/grpc/index.html b/docs/grpc/index.html index 818a98e7d6..dbbd6a25fb 100644 --- a/docs/grpc/index.html +++ b/docs/grpc/index.html @@ -1548,6 +1548,10 @@

Table of Contents

MListObligationsResponse +
  • + MObligationsSort +
  • +
  • MRemoveObligationTriggerRequest
  • @@ -1577,6 +1581,10 @@

    Table of Contents

    +
  • + ESortObligationsType +
  • +
  • @@ -13195,7 +13203,7 @@

    DeleteObligationValueR

    GetObligationRequest

    -

    Definitions

    +

    @@ -13562,6 +13570,15 @@

    ListObligationsRequest

    + + + + + + +

    Optional

    sortObligationsSortrepeated

    Optional - CONSTRAINT: max 1 item +Default ordering when omitted or when the first entry's field is UNSPECIFIED: +created_at DESC, then id ASC (tie-breaker).

    @@ -13600,6 +13617,37 @@

    ListObligationsResponse

    +

    ObligationsSort

    +

    + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    fieldSortObligationsType

    directionpolicy.SortDirection

    + + + + +

    RemoveObligationTriggerRequest

    @@ -13835,6 +13883,47 @@

    ValueTriggerRequest

    +

    SortObligationsType

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameNumberDescription
    SORT_OBLIGATIONS_TYPE_UNSPECIFIED0

    SORT_OBLIGATIONS_TYPE_NAME1

    SORT_OBLIGATIONS_TYPE_FQN2

    SORT_OBLIGATIONS_TYPE_CREATED_AT3

    SORT_OBLIGATIONS_TYPE_UPDATED_AT4

    + diff --git a/docs/openapi/policy/obligations/obligations.openapi.yaml b/docs/openapi/policy/obligations/obligations.openapi.yaml index dbe62f43ca..859f98f7fd 100644 --- a/docs/openapi/policy/obligations/obligations.openapi.yaml +++ b/docs/openapi/policy/obligations/obligations.openapi.yaml @@ -544,6 +544,13 @@ components: - KAS_PUBLIC_KEY_ALG_ENUM_EC_SECP256R1 - KAS_PUBLIC_KEY_ALG_ENUM_EC_SECP384R1 - KAS_PUBLIC_KEY_ALG_ENUM_EC_SECP521R1 + policy.SortDirection: + type: string + title: SortDirection + enum: + - SORT_DIRECTION_UNSPECIFIED + - SORT_DIRECTION_ASC + - SORT_DIRECTION_DESC policy.SourceType: type: string title: SourceType @@ -563,6 +570,15 @@ components: - SUBJECT_MAPPING_OPERATOR_ENUM_IN - SUBJECT_MAPPING_OPERATOR_ENUM_NOT_IN - SUBJECT_MAPPING_OPERATOR_ENUM_IN_CONTAINS + policy.obligations.SortObligationsType: + type: string + title: SortObligationsType + enum: + - SORT_OBLIGATIONS_TYPE_UNSPECIFIED + - SORT_OBLIGATIONS_TYPE_NAME + - SORT_OBLIGATIONS_TYPE_FQN + - SORT_OBLIGATIONS_TYPE_CREATED_AT + - SORT_OBLIGATIONS_TYPE_UPDATED_AT common.IdFqnIdentifier: type: object properties: @@ -1604,7 +1620,6 @@ components: format: uri title: GetObligationRequest additionalProperties: false - description: Definitions policy.obligations.GetObligationResponse: type: object properties: @@ -1763,6 +1778,16 @@ components: title: pagination description: Optional $ref: '#/components/schemas/policy.PageRequest' + sort: + type: array + items: + $ref: '#/components/schemas/policy.obligations.ObligationsSort' + title: sort + maxItems: 1 + description: |- + Optional - CONSTRAINT: max 1 item + Default ordering when omitted or when the first entry's field is UNSPECIFIED: + created_at DESC, then id ASC (tie-breaker). title: ListObligationsRequest additionalProperties: false policy.obligations.ListObligationsResponse: @@ -1778,6 +1803,17 @@ components: $ref: '#/components/schemas/policy.PageResponse' title: ListObligationsResponse additionalProperties: false + policy.obligations.ObligationsSort: + type: object + properties: + field: + title: field + $ref: '#/components/schemas/policy.obligations.SortObligationsType' + direction: + title: direction + $ref: '#/components/schemas/policy.SortDirection' + title: ObligationsSort + additionalProperties: false policy.obligations.RemoveObligationTriggerRequest: type: object properties: diff --git a/protocol/go/policy/obligations/obligations.pb.go b/protocol/go/policy/obligations/obligations.pb.go index 0d25666cc2..ef179fc709 100644 --- a/protocol/go/policy/obligations/obligations.pb.go +++ b/protocol/go/policy/obligations/obligations.pb.go @@ -23,7 +23,116 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// Definitions +type SortObligationsType int32 + +const ( + SortObligationsType_SORT_OBLIGATIONS_TYPE_UNSPECIFIED SortObligationsType = 0 + SortObligationsType_SORT_OBLIGATIONS_TYPE_NAME SortObligationsType = 1 + SortObligationsType_SORT_OBLIGATIONS_TYPE_FQN SortObligationsType = 2 + SortObligationsType_SORT_OBLIGATIONS_TYPE_CREATED_AT SortObligationsType = 3 + SortObligationsType_SORT_OBLIGATIONS_TYPE_UPDATED_AT SortObligationsType = 4 +) + +// Enum value maps for SortObligationsType. +var ( + SortObligationsType_name = map[int32]string{ + 0: "SORT_OBLIGATIONS_TYPE_UNSPECIFIED", + 1: "SORT_OBLIGATIONS_TYPE_NAME", + 2: "SORT_OBLIGATIONS_TYPE_FQN", + 3: "SORT_OBLIGATIONS_TYPE_CREATED_AT", + 4: "SORT_OBLIGATIONS_TYPE_UPDATED_AT", + } + SortObligationsType_value = map[string]int32{ + "SORT_OBLIGATIONS_TYPE_UNSPECIFIED": 0, + "SORT_OBLIGATIONS_TYPE_NAME": 1, + "SORT_OBLIGATIONS_TYPE_FQN": 2, + "SORT_OBLIGATIONS_TYPE_CREATED_AT": 3, + "SORT_OBLIGATIONS_TYPE_UPDATED_AT": 4, + } +) + +func (x SortObligationsType) Enum() *SortObligationsType { + p := new(SortObligationsType) + *p = x + return p +} + +func (x SortObligationsType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SortObligationsType) Descriptor() protoreflect.EnumDescriptor { + return file_policy_obligations_obligations_proto_enumTypes[0].Descriptor() +} + +func (SortObligationsType) Type() protoreflect.EnumType { + return &file_policy_obligations_obligations_proto_enumTypes[0] +} + +func (x SortObligationsType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SortObligationsType.Descriptor instead. +func (SortObligationsType) EnumDescriptor() ([]byte, []int) { + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{0} +} + +type ObligationsSort struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Field SortObligationsType `protobuf:"varint,1,opt,name=field,proto3,enum=policy.obligations.SortObligationsType" json:"field,omitempty"` + Direction policy.SortDirection `protobuf:"varint,2,opt,name=direction,proto3,enum=policy.SortDirection" json:"direction,omitempty"` +} + +func (x *ObligationsSort) Reset() { + *x = ObligationsSort{} + if protoimpl.UnsafeEnabled { + mi := &file_policy_obligations_obligations_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ObligationsSort) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ObligationsSort) ProtoMessage() {} + +func (x *ObligationsSort) ProtoReflect() protoreflect.Message { + mi := &file_policy_obligations_obligations_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ObligationsSort.ProtoReflect.Descriptor instead. +func (*ObligationsSort) Descriptor() ([]byte, []int) { + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{0} +} + +func (x *ObligationsSort) GetField() SortObligationsType { + if x != nil { + return x.Field + } + return SortObligationsType_SORT_OBLIGATIONS_TYPE_UNSPECIFIED +} + +func (x *ObligationsSort) GetDirection() policy.SortDirection { + if x != nil { + return x.Direction + } + return policy.SortDirection(0) +} + type GetObligationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -36,7 +145,7 @@ type GetObligationRequest struct { func (x *GetObligationRequest) Reset() { *x = GetObligationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[0] + mi := &file_policy_obligations_obligations_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -49,7 +158,7 @@ func (x *GetObligationRequest) String() string { func (*GetObligationRequest) ProtoMessage() {} func (x *GetObligationRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[0] + mi := &file_policy_obligations_obligations_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -62,7 +171,7 @@ func (x *GetObligationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObligationRequest.ProtoReflect.Descriptor instead. func (*GetObligationRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{0} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{1} } func (x *GetObligationRequest) GetId() string { @@ -95,7 +204,7 @@ type ValueTriggerRequest struct { func (x *ValueTriggerRequest) Reset() { *x = ValueTriggerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[1] + mi := &file_policy_obligations_obligations_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -108,7 +217,7 @@ func (x *ValueTriggerRequest) String() string { func (*ValueTriggerRequest) ProtoMessage() {} func (x *ValueTriggerRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[1] + mi := &file_policy_obligations_obligations_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -121,7 +230,7 @@ func (x *ValueTriggerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ValueTriggerRequest.ProtoReflect.Descriptor instead. func (*ValueTriggerRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{1} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{2} } func (x *ValueTriggerRequest) GetAction() *common.IdNameIdentifier { @@ -156,7 +265,7 @@ type GetObligationResponse struct { func (x *GetObligationResponse) Reset() { *x = GetObligationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[2] + mi := &file_policy_obligations_obligations_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -169,7 +278,7 @@ func (x *GetObligationResponse) String() string { func (*GetObligationResponse) ProtoMessage() {} func (x *GetObligationResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[2] + mi := &file_policy_obligations_obligations_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -182,7 +291,7 @@ func (x *GetObligationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObligationResponse.ProtoReflect.Descriptor instead. func (*GetObligationResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{2} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{3} } func (x *GetObligationResponse) GetObligation() *policy.Obligation { @@ -203,7 +312,7 @@ type GetObligationsByFQNsRequest struct { func (x *GetObligationsByFQNsRequest) Reset() { *x = GetObligationsByFQNsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[3] + mi := &file_policy_obligations_obligations_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -216,7 +325,7 @@ func (x *GetObligationsByFQNsRequest) String() string { func (*GetObligationsByFQNsRequest) ProtoMessage() {} func (x *GetObligationsByFQNsRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[3] + mi := &file_policy_obligations_obligations_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -229,7 +338,7 @@ func (x *GetObligationsByFQNsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObligationsByFQNsRequest.ProtoReflect.Descriptor instead. func (*GetObligationsByFQNsRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{3} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{4} } func (x *GetObligationsByFQNsRequest) GetFqns() []string { @@ -250,7 +359,7 @@ type GetObligationsByFQNsResponse struct { func (x *GetObligationsByFQNsResponse) Reset() { *x = GetObligationsByFQNsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[4] + mi := &file_policy_obligations_obligations_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -263,7 +372,7 @@ func (x *GetObligationsByFQNsResponse) String() string { func (*GetObligationsByFQNsResponse) ProtoMessage() {} func (x *GetObligationsByFQNsResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[4] + mi := &file_policy_obligations_obligations_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -276,7 +385,7 @@ func (x *GetObligationsByFQNsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObligationsByFQNsResponse.ProtoReflect.Descriptor instead. func (*GetObligationsByFQNsResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{4} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{5} } func (x *GetObligationsByFQNsResponse) GetFqnObligationMap() map[string]*policy.Obligation { @@ -304,7 +413,7 @@ type CreateObligationRequest struct { func (x *CreateObligationRequest) Reset() { *x = CreateObligationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[5] + mi := &file_policy_obligations_obligations_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -317,7 +426,7 @@ func (x *CreateObligationRequest) String() string { func (*CreateObligationRequest) ProtoMessage() {} func (x *CreateObligationRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[5] + mi := &file_policy_obligations_obligations_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -330,7 +439,7 @@ func (x *CreateObligationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateObligationRequest.ProtoReflect.Descriptor instead. func (*CreateObligationRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{5} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{6} } func (x *CreateObligationRequest) GetNamespaceId() string { @@ -379,7 +488,7 @@ type CreateObligationResponse struct { func (x *CreateObligationResponse) Reset() { *x = CreateObligationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[6] + mi := &file_policy_obligations_obligations_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -392,7 +501,7 @@ func (x *CreateObligationResponse) String() string { func (*CreateObligationResponse) ProtoMessage() {} func (x *CreateObligationResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[6] + mi := &file_policy_obligations_obligations_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -405,7 +514,7 @@ func (x *CreateObligationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateObligationResponse.ProtoReflect.Descriptor instead. func (*CreateObligationResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{6} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{7} } func (x *CreateObligationResponse) GetObligation() *policy.Obligation { @@ -431,7 +540,7 @@ type UpdateObligationRequest struct { func (x *UpdateObligationRequest) Reset() { *x = UpdateObligationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[7] + mi := &file_policy_obligations_obligations_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -444,7 +553,7 @@ func (x *UpdateObligationRequest) String() string { func (*UpdateObligationRequest) ProtoMessage() {} func (x *UpdateObligationRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[7] + mi := &file_policy_obligations_obligations_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -457,7 +566,7 @@ func (x *UpdateObligationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateObligationRequest.ProtoReflect.Descriptor instead. func (*UpdateObligationRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{7} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{8} } func (x *UpdateObligationRequest) GetId() string { @@ -499,7 +608,7 @@ type UpdateObligationResponse struct { func (x *UpdateObligationResponse) Reset() { *x = UpdateObligationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[8] + mi := &file_policy_obligations_obligations_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -512,7 +621,7 @@ func (x *UpdateObligationResponse) String() string { func (*UpdateObligationResponse) ProtoMessage() {} func (x *UpdateObligationResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[8] + mi := &file_policy_obligations_obligations_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -525,7 +634,7 @@ func (x *UpdateObligationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateObligationResponse.ProtoReflect.Descriptor instead. func (*UpdateObligationResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{8} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{9} } func (x *UpdateObligationResponse) GetObligation() *policy.Obligation { @@ -547,7 +656,7 @@ type DeleteObligationRequest struct { func (x *DeleteObligationRequest) Reset() { *x = DeleteObligationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[9] + mi := &file_policy_obligations_obligations_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -560,7 +669,7 @@ func (x *DeleteObligationRequest) String() string { func (*DeleteObligationRequest) ProtoMessage() {} func (x *DeleteObligationRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[9] + mi := &file_policy_obligations_obligations_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -573,7 +682,7 @@ func (x *DeleteObligationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObligationRequest.ProtoReflect.Descriptor instead. func (*DeleteObligationRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{9} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{10} } func (x *DeleteObligationRequest) GetId() string { @@ -601,7 +710,7 @@ type DeleteObligationResponse struct { func (x *DeleteObligationResponse) Reset() { *x = DeleteObligationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[10] + mi := &file_policy_obligations_obligations_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -614,7 +723,7 @@ func (x *DeleteObligationResponse) String() string { func (*DeleteObligationResponse) ProtoMessage() {} func (x *DeleteObligationResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[10] + mi := &file_policy_obligations_obligations_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -627,7 +736,7 @@ func (x *DeleteObligationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObligationResponse.ProtoReflect.Descriptor instead. func (*DeleteObligationResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{10} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{11} } func (x *DeleteObligationResponse) GetObligation() *policy.Obligation { @@ -646,12 +755,16 @@ type ListObligationsRequest struct { NamespaceFqn string `protobuf:"bytes,2,opt,name=namespace_fqn,json=namespaceFqn,proto3" json:"namespace_fqn,omitempty"` // Optional Pagination *policy.PageRequest `protobuf:"bytes,10,opt,name=pagination,proto3" json:"pagination,omitempty"` + // Optional - CONSTRAINT: max 1 item + // Default ordering when omitted or when the first entry's field is UNSPECIFIED: + // created_at DESC, then id ASC (tie-breaker). + Sort []*ObligationsSort `protobuf:"bytes,11,rep,name=sort,proto3" json:"sort,omitempty"` } func (x *ListObligationsRequest) Reset() { *x = ListObligationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[11] + mi := &file_policy_obligations_obligations_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -664,7 +777,7 @@ func (x *ListObligationsRequest) String() string { func (*ListObligationsRequest) ProtoMessage() {} func (x *ListObligationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[11] + mi := &file_policy_obligations_obligations_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -677,7 +790,7 @@ func (x *ListObligationsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObligationsRequest.ProtoReflect.Descriptor instead. func (*ListObligationsRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{11} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{12} } func (x *ListObligationsRequest) GetNamespaceId() string { @@ -701,6 +814,13 @@ func (x *ListObligationsRequest) GetPagination() *policy.PageRequest { return nil } +func (x *ListObligationsRequest) GetSort() []*ObligationsSort { + if x != nil { + return x.Sort + } + return nil +} + type ListObligationsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -713,7 +833,7 @@ type ListObligationsResponse struct { func (x *ListObligationsResponse) Reset() { *x = ListObligationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[12] + mi := &file_policy_obligations_obligations_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -726,7 +846,7 @@ func (x *ListObligationsResponse) String() string { func (*ListObligationsResponse) ProtoMessage() {} func (x *ListObligationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[12] + mi := &file_policy_obligations_obligations_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -739,7 +859,7 @@ func (x *ListObligationsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObligationsResponse.ProtoReflect.Descriptor instead. func (*ListObligationsResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{12} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{13} } func (x *ListObligationsResponse) GetObligations() []*policy.Obligation { @@ -769,7 +889,7 @@ type GetObligationValueRequest struct { func (x *GetObligationValueRequest) Reset() { *x = GetObligationValueRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[13] + mi := &file_policy_obligations_obligations_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -782,7 +902,7 @@ func (x *GetObligationValueRequest) String() string { func (*GetObligationValueRequest) ProtoMessage() {} func (x *GetObligationValueRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[13] + mi := &file_policy_obligations_obligations_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -795,7 +915,7 @@ func (x *GetObligationValueRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObligationValueRequest.ProtoReflect.Descriptor instead. func (*GetObligationValueRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{13} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{14} } func (x *GetObligationValueRequest) GetId() string { @@ -823,7 +943,7 @@ type GetObligationValueResponse struct { func (x *GetObligationValueResponse) Reset() { *x = GetObligationValueResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[14] + mi := &file_policy_obligations_obligations_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -836,7 +956,7 @@ func (x *GetObligationValueResponse) String() string { func (*GetObligationValueResponse) ProtoMessage() {} func (x *GetObligationValueResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[14] + mi := &file_policy_obligations_obligations_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -849,7 +969,7 @@ func (x *GetObligationValueResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObligationValueResponse.ProtoReflect.Descriptor instead. func (*GetObligationValueResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{14} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{15} } func (x *GetObligationValueResponse) GetValue() *policy.ObligationValue { @@ -870,7 +990,7 @@ type GetObligationValuesByFQNsRequest struct { func (x *GetObligationValuesByFQNsRequest) Reset() { *x = GetObligationValuesByFQNsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[15] + mi := &file_policy_obligations_obligations_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -883,7 +1003,7 @@ func (x *GetObligationValuesByFQNsRequest) String() string { func (*GetObligationValuesByFQNsRequest) ProtoMessage() {} func (x *GetObligationValuesByFQNsRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[15] + mi := &file_policy_obligations_obligations_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -896,7 +1016,7 @@ func (x *GetObligationValuesByFQNsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObligationValuesByFQNsRequest.ProtoReflect.Descriptor instead. func (*GetObligationValuesByFQNsRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{15} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{16} } func (x *GetObligationValuesByFQNsRequest) GetFqns() []string { @@ -917,7 +1037,7 @@ type GetObligationValuesByFQNsResponse struct { func (x *GetObligationValuesByFQNsResponse) Reset() { *x = GetObligationValuesByFQNsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[16] + mi := &file_policy_obligations_obligations_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -930,7 +1050,7 @@ func (x *GetObligationValuesByFQNsResponse) String() string { func (*GetObligationValuesByFQNsResponse) ProtoMessage() {} func (x *GetObligationValuesByFQNsResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[16] + mi := &file_policy_obligations_obligations_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -943,7 +1063,7 @@ func (x *GetObligationValuesByFQNsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use GetObligationValuesByFQNsResponse.ProtoReflect.Descriptor instead. func (*GetObligationValuesByFQNsResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{16} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{17} } func (x *GetObligationValuesByFQNsResponse) GetFqnValueMap() map[string]*policy.ObligationValue { @@ -972,7 +1092,7 @@ type CreateObligationValueRequest struct { func (x *CreateObligationValueRequest) Reset() { *x = CreateObligationValueRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[17] + mi := &file_policy_obligations_obligations_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -985,7 +1105,7 @@ func (x *CreateObligationValueRequest) String() string { func (*CreateObligationValueRequest) ProtoMessage() {} func (x *CreateObligationValueRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[17] + mi := &file_policy_obligations_obligations_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -998,7 +1118,7 @@ func (x *CreateObligationValueRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateObligationValueRequest.ProtoReflect.Descriptor instead. func (*CreateObligationValueRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{17} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{18} } func (x *CreateObligationValueRequest) GetObligationId() string { @@ -1047,7 +1167,7 @@ type CreateObligationValueResponse struct { func (x *CreateObligationValueResponse) Reset() { *x = CreateObligationValueResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[18] + mi := &file_policy_obligations_obligations_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1060,7 +1180,7 @@ func (x *CreateObligationValueResponse) String() string { func (*CreateObligationValueResponse) ProtoMessage() {} func (x *CreateObligationValueResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[18] + mi := &file_policy_obligations_obligations_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1073,7 +1193,7 @@ func (x *CreateObligationValueResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateObligationValueResponse.ProtoReflect.Descriptor instead. func (*CreateObligationValueResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{18} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{19} } func (x *CreateObligationValueResponse) GetValue() *policy.ObligationValue { @@ -1104,7 +1224,7 @@ type UpdateObligationValueRequest struct { func (x *UpdateObligationValueRequest) Reset() { *x = UpdateObligationValueRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[19] + mi := &file_policy_obligations_obligations_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1117,7 +1237,7 @@ func (x *UpdateObligationValueRequest) String() string { func (*UpdateObligationValueRequest) ProtoMessage() {} func (x *UpdateObligationValueRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[19] + mi := &file_policy_obligations_obligations_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1130,7 +1250,7 @@ func (x *UpdateObligationValueRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateObligationValueRequest.ProtoReflect.Descriptor instead. func (*UpdateObligationValueRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{19} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{20} } func (x *UpdateObligationValueRequest) GetId() string { @@ -1179,7 +1299,7 @@ type UpdateObligationValueResponse struct { func (x *UpdateObligationValueResponse) Reset() { *x = UpdateObligationValueResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[20] + mi := &file_policy_obligations_obligations_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1192,7 +1312,7 @@ func (x *UpdateObligationValueResponse) String() string { func (*UpdateObligationValueResponse) ProtoMessage() {} func (x *UpdateObligationValueResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[20] + mi := &file_policy_obligations_obligations_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1205,7 +1325,7 @@ func (x *UpdateObligationValueResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateObligationValueResponse.ProtoReflect.Descriptor instead. func (*UpdateObligationValueResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{20} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{21} } func (x *UpdateObligationValueResponse) GetValue() *policy.ObligationValue { @@ -1227,7 +1347,7 @@ type DeleteObligationValueRequest struct { func (x *DeleteObligationValueRequest) Reset() { *x = DeleteObligationValueRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[21] + mi := &file_policy_obligations_obligations_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1240,7 +1360,7 @@ func (x *DeleteObligationValueRequest) String() string { func (*DeleteObligationValueRequest) ProtoMessage() {} func (x *DeleteObligationValueRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[21] + mi := &file_policy_obligations_obligations_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1253,7 +1373,7 @@ func (x *DeleteObligationValueRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObligationValueRequest.ProtoReflect.Descriptor instead. func (*DeleteObligationValueRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{21} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{22} } func (x *DeleteObligationValueRequest) GetId() string { @@ -1281,7 +1401,7 @@ type DeleteObligationValueResponse struct { func (x *DeleteObligationValueResponse) Reset() { *x = DeleteObligationValueResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[22] + mi := &file_policy_obligations_obligations_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1294,7 +1414,7 @@ func (x *DeleteObligationValueResponse) String() string { func (*DeleteObligationValueResponse) ProtoMessage() {} func (x *DeleteObligationValueResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[22] + mi := &file_policy_obligations_obligations_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1307,7 +1427,7 @@ func (x *DeleteObligationValueResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObligationValueResponse.ProtoReflect.Descriptor instead. func (*DeleteObligationValueResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{22} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{23} } func (x *DeleteObligationValueResponse) GetValue() *policy.ObligationValue { @@ -1340,7 +1460,7 @@ type AddObligationTriggerRequest struct { func (x *AddObligationTriggerRequest) Reset() { *x = AddObligationTriggerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[23] + mi := &file_policy_obligations_obligations_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1353,7 +1473,7 @@ func (x *AddObligationTriggerRequest) String() string { func (*AddObligationTriggerRequest) ProtoMessage() {} func (x *AddObligationTriggerRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[23] + mi := &file_policy_obligations_obligations_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1366,7 +1486,7 @@ func (x *AddObligationTriggerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddObligationTriggerRequest.ProtoReflect.Descriptor instead. func (*AddObligationTriggerRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{23} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{24} } func (x *AddObligationTriggerRequest) GetObligationValue() *common.IdFqnIdentifier { @@ -1415,7 +1535,7 @@ type AddObligationTriggerResponse struct { func (x *AddObligationTriggerResponse) Reset() { *x = AddObligationTriggerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[24] + mi := &file_policy_obligations_obligations_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1428,7 +1548,7 @@ func (x *AddObligationTriggerResponse) String() string { func (*AddObligationTriggerResponse) ProtoMessage() {} func (x *AddObligationTriggerResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[24] + mi := &file_policy_obligations_obligations_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1441,7 +1561,7 @@ func (x *AddObligationTriggerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AddObligationTriggerResponse.ProtoReflect.Descriptor instead. func (*AddObligationTriggerResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{24} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{25} } func (x *AddObligationTriggerResponse) GetTrigger() *policy.ObligationTrigger { @@ -1463,7 +1583,7 @@ type RemoveObligationTriggerRequest struct { func (x *RemoveObligationTriggerRequest) Reset() { *x = RemoveObligationTriggerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[25] + mi := &file_policy_obligations_obligations_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1476,7 +1596,7 @@ func (x *RemoveObligationTriggerRequest) String() string { func (*RemoveObligationTriggerRequest) ProtoMessage() {} func (x *RemoveObligationTriggerRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[25] + mi := &file_policy_obligations_obligations_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1489,7 +1609,7 @@ func (x *RemoveObligationTriggerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveObligationTriggerRequest.ProtoReflect.Descriptor instead. func (*RemoveObligationTriggerRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{25} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{26} } func (x *RemoveObligationTriggerRequest) GetId() string { @@ -1510,7 +1630,7 @@ type RemoveObligationTriggerResponse struct { func (x *RemoveObligationTriggerResponse) Reset() { *x = RemoveObligationTriggerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[26] + mi := &file_policy_obligations_obligations_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1523,7 +1643,7 @@ func (x *RemoveObligationTriggerResponse) String() string { func (*RemoveObligationTriggerResponse) ProtoMessage() {} func (x *RemoveObligationTriggerResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[26] + mi := &file_policy_obligations_obligations_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1536,7 +1656,7 @@ func (x *RemoveObligationTriggerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveObligationTriggerResponse.ProtoReflect.Descriptor instead. func (*RemoveObligationTriggerResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{26} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{27} } func (x *RemoveObligationTriggerResponse) GetTrigger() *policy.ObligationTrigger { @@ -1560,7 +1680,7 @@ type ListObligationTriggersRequest struct { func (x *ListObligationTriggersRequest) Reset() { *x = ListObligationTriggersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[27] + mi := &file_policy_obligations_obligations_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1573,7 +1693,7 @@ func (x *ListObligationTriggersRequest) String() string { func (*ListObligationTriggersRequest) ProtoMessage() {} func (x *ListObligationTriggersRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[27] + mi := &file_policy_obligations_obligations_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1586,7 +1706,7 @@ func (x *ListObligationTriggersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObligationTriggersRequest.ProtoReflect.Descriptor instead. func (*ListObligationTriggersRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{27} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{28} } func (x *ListObligationTriggersRequest) GetNamespaceId() string { @@ -1622,7 +1742,7 @@ type ListObligationTriggersResponse struct { func (x *ListObligationTriggersResponse) Reset() { *x = ListObligationTriggersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[28] + mi := &file_policy_obligations_obligations_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1635,7 +1755,7 @@ func (x *ListObligationTriggersResponse) String() string { func (*ListObligationTriggersResponse) ProtoMessage() {} func (x *ListObligationTriggersResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[28] + mi := &file_policy_obligations_obligations_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1648,7 +1768,7 @@ func (x *ListObligationTriggersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObligationTriggersResponse.ProtoReflect.Descriptor instead. func (*ListObligationTriggersResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{28} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{29} } func (x *ListObligationTriggersResponse) GetTriggers() []*policy.ObligationTrigger { @@ -1677,472 +1797,497 @@ var file_policy_obligations_obligations_proto_rawDesc = []byte{ 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x60, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, - 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x03, - 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, - 0x10, 0x01, 0x88, 0x01, 0x01, 0x52, 0x03, 0x66, 0x71, 0x6e, 0x3a, 0x10, 0xba, 0x48, 0x0d, 0x22, - 0x0b, 0x0a, 0x02, 0x69, 0x64, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x10, 0x01, 0x22, 0xcb, 0x01, 0x0a, - 0x13, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x49, 0x64, - 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, 0x06, - 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x48, - 0x0a, 0x0f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x49, 0x64, 0x46, 0x71, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x4b, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x49, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4f, 0x62, - 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x66, 0x71, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x42, 0x16, 0xba, 0x48, 0x13, 0x92, 0x01, 0x10, 0x08, 0x01, 0x10, 0xfa, - 0x01, 0x18, 0x01, 0x22, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, 0x52, 0x04, 0x66, 0x71, - 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x12, 0x66, 0x71, 0x6e, 0x5f, 0x6f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x46, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x46, 0x71, 0x6e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, - 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x71, 0x6e, 0x4f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x1a, 0x57, 0x0a, 0x15, 0x46, 0x71, 0x6e, - 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xd4, 0x04, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, - 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0b, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0d, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, 0x52, 0x0c, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x46, 0x71, 0x6e, 0x12, 0xa7, 0x02, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x92, 0x02, 0xba, 0x48, - 0x8e, 0x02, 0xba, 0x01, 0x82, 0x02, 0x0a, 0x16, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0xaa, - 0x01, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, - 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, - 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, - 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, - 0x73, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, - 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, - 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, - 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x1a, 0x3b, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, - 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, - 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, - 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0xc8, 0x01, 0x01, 0x72, 0x03, 0x18, 0xfd, 0x01, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x56, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x42, 0x3e, 0xba, 0x48, 0x3b, 0x92, 0x01, 0x38, 0x08, 0x00, - 0x18, 0x01, 0x22, 0x32, 0x72, 0x30, 0x18, 0xfd, 0x01, 0x32, 0x2b, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, - 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, - 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, - 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x33, - 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x3a, 0x24, 0xba, 0x48, 0x21, 0x22, 0x1f, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x5f, 0x66, 0x71, 0x6e, 0x10, 0x01, 0x22, 0x4e, 0x0a, 0x18, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x85, 0x01, 0x0a, 0x0f, 0x4f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x6f, 0x72, 0x74, 0x12, 0x3d, + 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x33, 0x0a, + 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x15, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x53, 0x6f, 0x72, 0x74, 0x44, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x60, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, 0x52, 0x03, 0x66, + 0x71, 0x6e, 0x3a, 0x10, 0xba, 0x48, 0x0d, 0x22, 0x0b, 0x0a, 0x02, 0x69, 0x64, 0x0a, 0x03, 0x66, + 0x71, 0x6e, 0x10, 0x01, 0x22, 0xcb, 0x01, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x06, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x49, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x06, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x0f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x49, 0x64, 0x46, 0x71, 0x6e, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, + 0x52, 0x0e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x30, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x22, 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0a, 0x6f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x49, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, + 0x0a, 0x04, 0x66, 0x71, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x16, 0xba, 0x48, + 0x13, 0x92, 0x01, 0x10, 0x08, 0x01, 0x10, 0xfa, 0x01, 0x18, 0x01, 0x22, 0x07, 0x72, 0x05, 0x10, + 0x01, 0x88, 0x01, 0x01, 0x52, 0x04, 0x66, 0x71, 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x1c, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x46, + 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x12, 0x66, + 0x71, 0x6e, 0x5f, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, + 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, + 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x71, 0x6e, 0x4f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x10, 0x66, 0x71, 0x6e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, + 0x70, 0x1a, 0x57, 0x0a, 0x15, 0x46, 0x71, 0x6e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x04, 0x0a, 0x17, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, + 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, + 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x46, 0x71, 0x6e, 0x12, 0xa7, 0x02, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x92, 0x02, 0xba, 0x48, 0x8e, 0x02, 0xba, 0x01, 0x82, 0x02, 0x0a, 0x16, + 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0xaa, 0x01, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, + 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, + 0x67, 0x20, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, + 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, + 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, + 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, + 0x73, 0x65, 0x2e, 0x1a, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, + 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, + 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, + 0xc8, 0x01, 0x01, 0x72, 0x03, 0x18, 0xfd, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x56, + 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x42, 0x3e, + 0xba, 0x48, 0x3b, 0x92, 0x01, 0x38, 0x08, 0x00, 0x18, 0x01, 0x22, 0x32, 0x72, 0x30, 0x18, 0xfd, + 0x01, 0x32, 0x2b, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, + 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, + 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x52, 0x06, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x24, 0xba, 0x48, 0x21, + 0x22, 0x1f, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x66, 0x71, 0x6e, 0x10, + 0x01, 0x22, 0x4e, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, + 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x80, 0x04, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, + 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0xbf, 0x02, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xaa, 0x02, 0xba, 0x48, 0xa6, 0x02, 0xba, 0x01, 0x9a, + 0x02, 0x0a, 0x16, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0xaa, 0x01, 0x4f, 0x62, 0x6c, 0x69, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, + 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x65, + 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x62, 0x75, 0x74, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, + 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, + 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, + 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x1a, 0x53, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, + 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, + 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, + 0x3f, 0x24, 0x27, 0x29, 0x20, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xc8, 0x01, 0x00, 0x72, 0x03, + 0x18, 0xfd, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x54, + 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x16, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x65, 0x68, 0x61, + 0x76, 0x69, 0x6f, 0x72, 0x22, 0x4e, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, + 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x32, 0x0a, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, + 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x63, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, + 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, + 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x03, 0x66, 0x71, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, + 0x01, 0x01, 0x52, 0x03, 0x66, 0x71, 0x6e, 0x3a, 0x10, 0xba, 0x48, 0x0d, 0x22, 0x0b, 0x0a, 0x02, + 0x69, 0x64, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x10, 0x01, 0x22, 0x4e, 0x0a, 0x18, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, - 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x80, 0x04, 0x0a, 0x17, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x94, 0x02, 0x0a, 0x16, 0x4c, 0x69, + 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, + 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, + 0x64, 0x12, 0x2f, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x66, + 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, + 0x01, 0x88, 0x01, 0x01, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x46, + 0x71, 0x6e, 0x12, 0x33, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, + 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x6f, 0x72, 0x74, 0x42, 0x08, 0xba, 0x48, 0x05, 0x92, + 0x01, 0x02, 0x10, 0x01, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x3a, 0x24, 0xba, 0x48, 0x21, 0x22, + 0x1f, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x0a, + 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x66, 0x71, 0x6e, 0x10, 0x00, + 0x22, 0x85, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x0b, + 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x65, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, - 0xbf, 0x02, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xaa, - 0x02, 0xba, 0x48, 0xa6, 0x02, 0xba, 0x01, 0x9a, 0x02, 0x0a, 0x16, 0x6f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x12, 0xaa, 0x01, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, - 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x79, 0x70, - 0x68, 0x65, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, - 0x6f, 0x72, 0x65, 0x73, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x73, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, - 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, - 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, - 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x1a, 0x53, - 0x73, 0x69, 0x7a, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, - 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, - 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, - 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0x20, 0x3a, 0x20, 0x74, - 0x72, 0x75, 0x65, 0xc8, 0x01, 0x00, 0x72, 0x03, 0x18, 0xfd, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x54, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, - 0x6f, 0x72, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x22, 0x4e, 0x0a, 0x18, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0a, 0x6f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x63, 0x0a, 0x17, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x1c, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, - 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, 0x52, 0x03, 0x66, 0x71, 0x6e, 0x3a, - 0x10, 0xba, 0x48, 0x0d, 0x22, 0x0b, 0x0a, 0x02, 0x69, 0x64, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x10, - 0x01, 0x22, 0x4e, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, - 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0xd1, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0b, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, 0x52, 0x0c, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x46, 0x71, 0x6e, 0x12, 0x33, 0x0a, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, - 0x24, 0xba, 0x48, 0x21, 0x22, 0x1f, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, - 0x66, 0x71, 0x6e, 0x10, 0x00, 0x22, 0x85, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, - 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x34, 0x0a, 0x0b, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, - 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x6f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x65, 0x0a, - 0x19, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, 0x52, 0x03, 0x66, - 0x71, 0x6e, 0x3a, 0x10, 0xba, 0x48, 0x0d, 0x22, 0x0b, 0x0a, 0x02, 0x69, 0x64, 0x0a, 0x03, 0x66, - 0x71, 0x6e, 0x10, 0x01, 0x22, 0x4b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x4e, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x66, 0x71, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x42, 0x16, 0xba, 0x48, 0x13, 0x92, 0x01, 0x10, 0x08, 0x01, 0x10, 0xfa, 0x01, - 0x18, 0x01, 0x22, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, 0x52, 0x04, 0x66, 0x71, 0x6e, - 0x73, 0x22, 0xe8, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x0d, 0x66, 0x71, 0x6e, 0x5f, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, - 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x71, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, - 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x66, 0x71, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x4d, 0x61, 0x70, 0x1a, 0x57, 0x0a, 0x10, 0x46, 0x71, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, - 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x04, 0x0a, - 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, - 0x0d, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0c, - 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x0e, - 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x71, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, - 0x52, 0x0d, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x71, 0x6e, 0x12, - 0xac, 0x02, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x95, 0x02, 0xba, 0x48, 0x91, 0x02, 0xba, 0x01, 0x85, 0x02, 0x0a, 0x17, 0x6f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x12, 0xac, 0x01, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, - 0x6e, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, - 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, - 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, - 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, - 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, - 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, - 0x65, 0x2e, 0x1a, 0x3b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, - 0x28, 0x27, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, - 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, - 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0xc8, - 0x01, 0x01, 0x72, 0x03, 0x18, 0xfd, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x43, - 0x0a, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x27, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x26, 0xba, 0x48, 0x23, 0x22, 0x21, 0x0a, - 0x0d, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x0a, 0x0e, - 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x71, 0x6e, 0x10, 0x01, - 0x22, 0x4e, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x22, 0xcf, 0x04, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, - 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0xc4, 0x02, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xad, 0x02, 0xba, 0x48, - 0xa9, 0x02, 0xba, 0x01, 0x9d, 0x02, 0x0a, 0x17, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, - 0xac, 0x01, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x79, 0x70, 0x68, - 0x65, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, - 0x72, 0x65, 0x73, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x73, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, - 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, - 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x1a, 0x53, - 0x73, 0x69, 0x7a, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, - 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, - 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, - 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0x20, 0x3a, 0x20, 0x74, - 0x72, 0x75, 0x65, 0xc8, 0x01, 0x00, 0x72, 0x03, 0x18, 0xfd, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, - 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x08, 0x74, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x54, 0x0a, 0x18, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, - 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, - 0x6f, 0x72, 0x22, 0x4e, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0x68, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, - 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x03, - 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, - 0x10, 0x01, 0x88, 0x01, 0x01, 0x52, 0x03, 0x66, 0x71, 0x6e, 0x3a, 0x10, 0xba, 0x48, 0x0d, 0x22, - 0x0b, 0x0a, 0x02, 0x69, 0x64, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x10, 0x01, 0x22, 0x4e, 0x0a, 0x1d, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x1c, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xba, 0x48, + 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, 0x52, 0x03, 0x66, 0x71, 0x6e, 0x3a, 0x10, 0xba, + 0x48, 0x0d, 0x22, 0x0b, 0x0a, 0x02, 0x69, 0x64, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x10, 0x01, 0x22, + 0x4b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xd4, 0x02, 0x0a, - 0x1b, 0x41, 0x64, 0x64, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4a, 0x0a, 0x10, - 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x49, 0x64, 0x46, 0x71, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, - 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0f, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x49, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x0f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x49, 0x64, 0x46, 0x71, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0e, 0x61, 0x74, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x07, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x33, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4e, 0x0a, 0x20, + 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2a, 0x0a, 0x04, 0x66, 0x71, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x16, + 0xba, 0x48, 0x13, 0x92, 0x01, 0x10, 0x08, 0x01, 0x10, 0xfa, 0x01, 0x18, 0x01, 0x22, 0x07, 0x72, + 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, 0x52, 0x04, 0x66, 0x71, 0x6e, 0x73, 0x22, 0xe8, 0x01, 0x0a, + 0x21, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x0d, 0x66, 0x71, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, + 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x46, 0x71, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0b, 0x66, 0x71, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x1a, 0x57, + 0x0a, 0x10, 0x46, 0x71, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x04, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x0d, 0x6f, 0x62, 0x6c, 0x69, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0c, 0x6f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x0e, 0x6f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, 0x52, 0x0d, 0x6f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x71, 0x6e, 0x12, 0xac, 0x02, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x95, 0x02, 0xba, 0x48, 0x91, + 0x02, 0xba, 0x01, 0x85, 0x02, 0x0a, 0x17, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0xac, + 0x01, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x79, 0x70, 0x68, 0x65, + 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, + 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x1a, 0x3b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x61, + 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, + 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, + 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0xc8, 0x01, 0x01, 0x72, 0x03, 0x18, + 0xfd, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x74, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x22, 0x53, 0x0a, 0x1c, 0x41, 0x64, 0x64, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, - 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, - 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0x3a, 0x0a, 0x1e, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, - 0x52, 0x02, 0x69, 0x64, 0x22, 0x56, 0x0a, 0x1f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x62, - 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0xd8, 0x01, 0x0a, - 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, - 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0b, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0d, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, 0x52, 0x0c, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x46, 0x71, 0x6e, 0x12, 0x33, 0x0a, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x3a, 0x24, 0xba, 0x48, 0x21, 0x22, 0x1f, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x66, 0x71, 0x6e, 0x10, 0x00, 0x22, 0x8d, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, + 0x61, 0x74, 0x61, 0x3a, 0x26, 0xba, 0x48, 0x23, 0x22, 0x21, 0x0a, 0x0d, 0x6f, 0x62, 0x6c, 0x69, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x0a, 0x0e, 0x6f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x71, 0x6e, 0x10, 0x01, 0x22, 0x4e, 0x0a, 0x1d, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xcf, 0x04, 0x0a, 0x1c, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, + 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0xc4, 0x02, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xad, 0x02, 0xba, 0x48, 0xa9, 0x02, 0xba, 0x01, 0x9d, + 0x02, 0x0a, 0x17, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0xac, 0x01, 0x4f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6d, 0x75, + 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x6e, 0x75, + 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x62, + 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x61, 0x63, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, + 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, + 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x1a, 0x53, 0x73, 0x69, 0x7a, 0x65, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x28, 0x27, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, + 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, + 0x30, 0x2d, 0x39, 0x5f, 0x2d, 0x5d, 0x2a, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, + 0x39, 0x5d, 0x29, 0x3f, 0x24, 0x27, 0x29, 0x20, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0xc8, 0x01, + 0x00, 0x72, 0x03, 0x18, 0xfd, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x43, 0x0a, + 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x54, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, + 0x69, 0x6f, 0x72, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x22, 0x4e, 0x0a, + 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x68, 0x0a, + 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, + 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xba, 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, + 0x52, 0x03, 0x66, 0x71, 0x6e, 0x3a, 0x10, 0xba, 0x48, 0x0d, 0x22, 0x0b, 0x0a, 0x02, 0x69, 0x64, + 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x10, 0x01, 0x22, 0x4e, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xd4, 0x02, 0x0a, 0x1b, 0x41, 0x64, 0x64, 0x4f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4a, 0x0a, 0x10, 0x6f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x49, 0x64, 0x46, 0x71, 0x6e, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, + 0x01, 0x01, 0x52, 0x0f, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x49, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, 0x06, 0xba, + 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, + 0x0f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x49, 0x64, 0x46, 0x71, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, + 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x53, + 0x0a, 0x1c, 0x41, 0x64, 0x64, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, + 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x22, 0x3a, 0x0a, 0x1e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, + 0x56, 0x0a, 0x1f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0xd8, 0x01, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x74, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x32, 0xcd, 0x0d, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x6f, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, - 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x03, 0x90, 0x02, 0x01, 0x12, 0x69, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, - 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, - 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x29, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, - 0x7e, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x12, 0x2f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, - 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x46, 0x51, - 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, - 0x6f, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, - 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x6f, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, - 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, + 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xba, + 0x48, 0x07, 0x72, 0x05, 0x10, 0x01, 0x88, 0x01, 0x01, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x46, 0x71, 0x6e, 0x12, 0x33, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x24, 0xba, 0x48, + 0x21, 0x22, 0x1f, 0x0a, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x66, 0x71, 0x6e, + 0x10, 0x00, 0x22, 0x8d, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x52, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2a, 0xc7, 0x01, 0x0a, 0x13, 0x53, 0x6f, 0x72, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x21, 0x53, 0x4f, + 0x52, 0x54, 0x5f, 0x4f, 0x42, 0x4c, 0x49, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x4f, 0x42, 0x4c, 0x49, 0x47, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, + 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x4f, 0x42, 0x4c, 0x49, 0x47, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x51, 0x4e, 0x10, 0x02, + 0x12, 0x24, 0x0a, 0x20, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x4f, 0x42, 0x4c, 0x49, 0x47, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, + 0x44, 0x5f, 0x41, 0x54, 0x10, 0x03, 0x12, 0x24, 0x0a, 0x20, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x4f, + 0x42, 0x4c, 0x49, 0x47, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x41, 0x54, 0x10, 0x04, 0x32, 0xcd, 0x0d, 0x0a, + 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6f, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, + 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x2e, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x69, 0x0a, 0x0d, 0x47, 0x65, 0x74, + 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, + 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x6f, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, - 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, - 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x78, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, - 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x8d, 0x01, 0x0a, - 0x19, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x12, 0x34, 0x2e, 0x70, 0x6f, 0x6c, + 0x03, 0x90, 0x02, 0x01, 0x12, 0x7e, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x12, 0x2f, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x03, 0x90, 0x02, 0x01, 0x12, 0x6f, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, + 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, + 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2d, 0x2e, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, + 0x01, 0x12, 0x8d, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x12, + 0x34, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, + 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, + 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, + 0x01, 0x12, 0x7e, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x35, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x7e, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, - 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x15, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x7e, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x2e, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, - 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x15, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x7e, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x2e, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, - 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x14, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x7b, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x2f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, + 0x64, 0x64, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x12, 0x2f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, - 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x4f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, - 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x4f, 0x62, - 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x84, 0x01, 0x0a, 0x17, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x32, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, - 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x84, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x31, 0x2e, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, + 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x84, + 0x01, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x32, 0x2e, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x42, 0xcf, 0x01, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x2e, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x42, 0x10, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x64, 0x66, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, - 0x6f, 0x72, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x67, 0x6f, 0x2f, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2f, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0xa2, 0x02, 0x03, 0x50, 0x4f, 0x58, 0xaa, 0x02, 0x12, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xca, 0x02, 0x12, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5c, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0xe2, 0x02, 0x1e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5c, 0x4f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0xea, 0x02, 0x13, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3a, 0x3a, 0x4f, 0x62, - 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x84, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, + 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, + 0x12, 0x31, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x42, 0xcf, 0x01, 0x0a, + 0x16, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x10, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x64, 0x66, 0x2f, + 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2f, 0x6f, 0x62, 0x6c, 0x69, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa2, 0x02, 0x03, 0x50, 0x4f, 0x58, 0xaa, 0x02, 0x12, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0xca, 0x02, 0x12, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5c, 0x4f, 0x62, 0x6c, 0x69, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xe2, 0x02, 0x1e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x5c, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5c, 0x47, 0x50, 0x42, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x13, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x3a, 0x3a, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2157,120 +2302,127 @@ func file_policy_obligations_obligations_proto_rawDescGZIP() []byte { return file_policy_obligations_obligations_proto_rawDescData } -var file_policy_obligations_obligations_proto_msgTypes = make([]protoimpl.MessageInfo, 31) +var file_policy_obligations_obligations_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_policy_obligations_obligations_proto_msgTypes = make([]protoimpl.MessageInfo, 32) var file_policy_obligations_obligations_proto_goTypes = []interface{}{ - (*GetObligationRequest)(nil), // 0: policy.obligations.GetObligationRequest - (*ValueTriggerRequest)(nil), // 1: policy.obligations.ValueTriggerRequest - (*GetObligationResponse)(nil), // 2: policy.obligations.GetObligationResponse - (*GetObligationsByFQNsRequest)(nil), // 3: policy.obligations.GetObligationsByFQNsRequest - (*GetObligationsByFQNsResponse)(nil), // 4: policy.obligations.GetObligationsByFQNsResponse - (*CreateObligationRequest)(nil), // 5: policy.obligations.CreateObligationRequest - (*CreateObligationResponse)(nil), // 6: policy.obligations.CreateObligationResponse - (*UpdateObligationRequest)(nil), // 7: policy.obligations.UpdateObligationRequest - (*UpdateObligationResponse)(nil), // 8: policy.obligations.UpdateObligationResponse - (*DeleteObligationRequest)(nil), // 9: policy.obligations.DeleteObligationRequest - (*DeleteObligationResponse)(nil), // 10: policy.obligations.DeleteObligationResponse - (*ListObligationsRequest)(nil), // 11: policy.obligations.ListObligationsRequest - (*ListObligationsResponse)(nil), // 12: policy.obligations.ListObligationsResponse - (*GetObligationValueRequest)(nil), // 13: policy.obligations.GetObligationValueRequest - (*GetObligationValueResponse)(nil), // 14: policy.obligations.GetObligationValueResponse - (*GetObligationValuesByFQNsRequest)(nil), // 15: policy.obligations.GetObligationValuesByFQNsRequest - (*GetObligationValuesByFQNsResponse)(nil), // 16: policy.obligations.GetObligationValuesByFQNsResponse - (*CreateObligationValueRequest)(nil), // 17: policy.obligations.CreateObligationValueRequest - (*CreateObligationValueResponse)(nil), // 18: policy.obligations.CreateObligationValueResponse - (*UpdateObligationValueRequest)(nil), // 19: policy.obligations.UpdateObligationValueRequest - (*UpdateObligationValueResponse)(nil), // 20: policy.obligations.UpdateObligationValueResponse - (*DeleteObligationValueRequest)(nil), // 21: policy.obligations.DeleteObligationValueRequest - (*DeleteObligationValueResponse)(nil), // 22: policy.obligations.DeleteObligationValueResponse - (*AddObligationTriggerRequest)(nil), // 23: policy.obligations.AddObligationTriggerRequest - (*AddObligationTriggerResponse)(nil), // 24: policy.obligations.AddObligationTriggerResponse - (*RemoveObligationTriggerRequest)(nil), // 25: policy.obligations.RemoveObligationTriggerRequest - (*RemoveObligationTriggerResponse)(nil), // 26: policy.obligations.RemoveObligationTriggerResponse - (*ListObligationTriggersRequest)(nil), // 27: policy.obligations.ListObligationTriggersRequest - (*ListObligationTriggersResponse)(nil), // 28: policy.obligations.ListObligationTriggersResponse - nil, // 29: policy.obligations.GetObligationsByFQNsResponse.FqnObligationMapEntry - nil, // 30: policy.obligations.GetObligationValuesByFQNsResponse.FqnValueMapEntry - (*common.IdNameIdentifier)(nil), // 31: common.IdNameIdentifier - (*common.IdFqnIdentifier)(nil), // 32: common.IdFqnIdentifier - (*policy.RequestContext)(nil), // 33: policy.RequestContext - (*policy.Obligation)(nil), // 34: policy.Obligation - (*common.MetadataMutable)(nil), // 35: common.MetadataMutable - (common.MetadataUpdateEnum)(0), // 36: common.MetadataUpdateEnum - (*policy.PageRequest)(nil), // 37: policy.PageRequest - (*policy.PageResponse)(nil), // 38: policy.PageResponse - (*policy.ObligationValue)(nil), // 39: policy.ObligationValue - (*policy.ObligationTrigger)(nil), // 40: policy.ObligationTrigger + (SortObligationsType)(0), // 0: policy.obligations.SortObligationsType + (*ObligationsSort)(nil), // 1: policy.obligations.ObligationsSort + (*GetObligationRequest)(nil), // 2: policy.obligations.GetObligationRequest + (*ValueTriggerRequest)(nil), // 3: policy.obligations.ValueTriggerRequest + (*GetObligationResponse)(nil), // 4: policy.obligations.GetObligationResponse + (*GetObligationsByFQNsRequest)(nil), // 5: policy.obligations.GetObligationsByFQNsRequest + (*GetObligationsByFQNsResponse)(nil), // 6: policy.obligations.GetObligationsByFQNsResponse + (*CreateObligationRequest)(nil), // 7: policy.obligations.CreateObligationRequest + (*CreateObligationResponse)(nil), // 8: policy.obligations.CreateObligationResponse + (*UpdateObligationRequest)(nil), // 9: policy.obligations.UpdateObligationRequest + (*UpdateObligationResponse)(nil), // 10: policy.obligations.UpdateObligationResponse + (*DeleteObligationRequest)(nil), // 11: policy.obligations.DeleteObligationRequest + (*DeleteObligationResponse)(nil), // 12: policy.obligations.DeleteObligationResponse + (*ListObligationsRequest)(nil), // 13: policy.obligations.ListObligationsRequest + (*ListObligationsResponse)(nil), // 14: policy.obligations.ListObligationsResponse + (*GetObligationValueRequest)(nil), // 15: policy.obligations.GetObligationValueRequest + (*GetObligationValueResponse)(nil), // 16: policy.obligations.GetObligationValueResponse + (*GetObligationValuesByFQNsRequest)(nil), // 17: policy.obligations.GetObligationValuesByFQNsRequest + (*GetObligationValuesByFQNsResponse)(nil), // 18: policy.obligations.GetObligationValuesByFQNsResponse + (*CreateObligationValueRequest)(nil), // 19: policy.obligations.CreateObligationValueRequest + (*CreateObligationValueResponse)(nil), // 20: policy.obligations.CreateObligationValueResponse + (*UpdateObligationValueRequest)(nil), // 21: policy.obligations.UpdateObligationValueRequest + (*UpdateObligationValueResponse)(nil), // 22: policy.obligations.UpdateObligationValueResponse + (*DeleteObligationValueRequest)(nil), // 23: policy.obligations.DeleteObligationValueRequest + (*DeleteObligationValueResponse)(nil), // 24: policy.obligations.DeleteObligationValueResponse + (*AddObligationTriggerRequest)(nil), // 25: policy.obligations.AddObligationTriggerRequest + (*AddObligationTriggerResponse)(nil), // 26: policy.obligations.AddObligationTriggerResponse + (*RemoveObligationTriggerRequest)(nil), // 27: policy.obligations.RemoveObligationTriggerRequest + (*RemoveObligationTriggerResponse)(nil), // 28: policy.obligations.RemoveObligationTriggerResponse + (*ListObligationTriggersRequest)(nil), // 29: policy.obligations.ListObligationTriggersRequest + (*ListObligationTriggersResponse)(nil), // 30: policy.obligations.ListObligationTriggersResponse + nil, // 31: policy.obligations.GetObligationsByFQNsResponse.FqnObligationMapEntry + nil, // 32: policy.obligations.GetObligationValuesByFQNsResponse.FqnValueMapEntry + (policy.SortDirection)(0), // 33: policy.SortDirection + (*common.IdNameIdentifier)(nil), // 34: common.IdNameIdentifier + (*common.IdFqnIdentifier)(nil), // 35: common.IdFqnIdentifier + (*policy.RequestContext)(nil), // 36: policy.RequestContext + (*policy.Obligation)(nil), // 37: policy.Obligation + (*common.MetadataMutable)(nil), // 38: common.MetadataMutable + (common.MetadataUpdateEnum)(0), // 39: common.MetadataUpdateEnum + (*policy.PageRequest)(nil), // 40: policy.PageRequest + (*policy.PageResponse)(nil), // 41: policy.PageResponse + (*policy.ObligationValue)(nil), // 42: policy.ObligationValue + (*policy.ObligationTrigger)(nil), // 43: policy.ObligationTrigger } var file_policy_obligations_obligations_proto_depIdxs = []int32{ - 31, // 0: policy.obligations.ValueTriggerRequest.action:type_name -> common.IdNameIdentifier - 32, // 1: policy.obligations.ValueTriggerRequest.attribute_value:type_name -> common.IdFqnIdentifier - 33, // 2: policy.obligations.ValueTriggerRequest.context:type_name -> policy.RequestContext - 34, // 3: policy.obligations.GetObligationResponse.obligation:type_name -> policy.Obligation - 29, // 4: policy.obligations.GetObligationsByFQNsResponse.fqn_obligation_map:type_name -> policy.obligations.GetObligationsByFQNsResponse.FqnObligationMapEntry - 35, // 5: policy.obligations.CreateObligationRequest.metadata:type_name -> common.MetadataMutable - 34, // 6: policy.obligations.CreateObligationResponse.obligation:type_name -> policy.Obligation - 35, // 7: policy.obligations.UpdateObligationRequest.metadata:type_name -> common.MetadataMutable - 36, // 8: policy.obligations.UpdateObligationRequest.metadata_update_behavior:type_name -> common.MetadataUpdateEnum - 34, // 9: policy.obligations.UpdateObligationResponse.obligation:type_name -> policy.Obligation - 34, // 10: policy.obligations.DeleteObligationResponse.obligation:type_name -> policy.Obligation - 37, // 11: policy.obligations.ListObligationsRequest.pagination:type_name -> policy.PageRequest - 34, // 12: policy.obligations.ListObligationsResponse.obligations:type_name -> policy.Obligation - 38, // 13: policy.obligations.ListObligationsResponse.pagination:type_name -> policy.PageResponse - 39, // 14: policy.obligations.GetObligationValueResponse.value:type_name -> policy.ObligationValue - 30, // 15: policy.obligations.GetObligationValuesByFQNsResponse.fqn_value_map:type_name -> policy.obligations.GetObligationValuesByFQNsResponse.FqnValueMapEntry - 1, // 16: policy.obligations.CreateObligationValueRequest.triggers:type_name -> policy.obligations.ValueTriggerRequest - 35, // 17: policy.obligations.CreateObligationValueRequest.metadata:type_name -> common.MetadataMutable - 39, // 18: policy.obligations.CreateObligationValueResponse.value:type_name -> policy.ObligationValue - 1, // 19: policy.obligations.UpdateObligationValueRequest.triggers:type_name -> policy.obligations.ValueTriggerRequest - 35, // 20: policy.obligations.UpdateObligationValueRequest.metadata:type_name -> common.MetadataMutable - 36, // 21: policy.obligations.UpdateObligationValueRequest.metadata_update_behavior:type_name -> common.MetadataUpdateEnum - 39, // 22: policy.obligations.UpdateObligationValueResponse.value:type_name -> policy.ObligationValue - 39, // 23: policy.obligations.DeleteObligationValueResponse.value:type_name -> policy.ObligationValue - 32, // 24: policy.obligations.AddObligationTriggerRequest.obligation_value:type_name -> common.IdFqnIdentifier - 31, // 25: policy.obligations.AddObligationTriggerRequest.action:type_name -> common.IdNameIdentifier - 32, // 26: policy.obligations.AddObligationTriggerRequest.attribute_value:type_name -> common.IdFqnIdentifier - 33, // 27: policy.obligations.AddObligationTriggerRequest.context:type_name -> policy.RequestContext - 35, // 28: policy.obligations.AddObligationTriggerRequest.metadata:type_name -> common.MetadataMutable - 40, // 29: policy.obligations.AddObligationTriggerResponse.trigger:type_name -> policy.ObligationTrigger - 40, // 30: policy.obligations.RemoveObligationTriggerResponse.trigger:type_name -> policy.ObligationTrigger - 37, // 31: policy.obligations.ListObligationTriggersRequest.pagination:type_name -> policy.PageRequest - 40, // 32: policy.obligations.ListObligationTriggersResponse.triggers:type_name -> policy.ObligationTrigger - 38, // 33: policy.obligations.ListObligationTriggersResponse.pagination:type_name -> policy.PageResponse - 34, // 34: policy.obligations.GetObligationsByFQNsResponse.FqnObligationMapEntry.value:type_name -> policy.Obligation - 39, // 35: policy.obligations.GetObligationValuesByFQNsResponse.FqnValueMapEntry.value:type_name -> policy.ObligationValue - 11, // 36: policy.obligations.Service.ListObligations:input_type -> policy.obligations.ListObligationsRequest - 0, // 37: policy.obligations.Service.GetObligation:input_type -> policy.obligations.GetObligationRequest - 3, // 38: policy.obligations.Service.GetObligationsByFQNs:input_type -> policy.obligations.GetObligationsByFQNsRequest - 5, // 39: policy.obligations.Service.CreateObligation:input_type -> policy.obligations.CreateObligationRequest - 7, // 40: policy.obligations.Service.UpdateObligation:input_type -> policy.obligations.UpdateObligationRequest - 9, // 41: policy.obligations.Service.DeleteObligation:input_type -> policy.obligations.DeleteObligationRequest - 13, // 42: policy.obligations.Service.GetObligationValue:input_type -> policy.obligations.GetObligationValueRequest - 15, // 43: policy.obligations.Service.GetObligationValuesByFQNs:input_type -> policy.obligations.GetObligationValuesByFQNsRequest - 17, // 44: policy.obligations.Service.CreateObligationValue:input_type -> policy.obligations.CreateObligationValueRequest - 19, // 45: policy.obligations.Service.UpdateObligationValue:input_type -> policy.obligations.UpdateObligationValueRequest - 21, // 46: policy.obligations.Service.DeleteObligationValue:input_type -> policy.obligations.DeleteObligationValueRequest - 23, // 47: policy.obligations.Service.AddObligationTrigger:input_type -> policy.obligations.AddObligationTriggerRequest - 25, // 48: policy.obligations.Service.RemoveObligationTrigger:input_type -> policy.obligations.RemoveObligationTriggerRequest - 27, // 49: policy.obligations.Service.ListObligationTriggers:input_type -> policy.obligations.ListObligationTriggersRequest - 12, // 50: policy.obligations.Service.ListObligations:output_type -> policy.obligations.ListObligationsResponse - 2, // 51: policy.obligations.Service.GetObligation:output_type -> policy.obligations.GetObligationResponse - 4, // 52: policy.obligations.Service.GetObligationsByFQNs:output_type -> policy.obligations.GetObligationsByFQNsResponse - 6, // 53: policy.obligations.Service.CreateObligation:output_type -> policy.obligations.CreateObligationResponse - 8, // 54: policy.obligations.Service.UpdateObligation:output_type -> policy.obligations.UpdateObligationResponse - 10, // 55: policy.obligations.Service.DeleteObligation:output_type -> policy.obligations.DeleteObligationResponse - 14, // 56: policy.obligations.Service.GetObligationValue:output_type -> policy.obligations.GetObligationValueResponse - 16, // 57: policy.obligations.Service.GetObligationValuesByFQNs:output_type -> policy.obligations.GetObligationValuesByFQNsResponse - 18, // 58: policy.obligations.Service.CreateObligationValue:output_type -> policy.obligations.CreateObligationValueResponse - 20, // 59: policy.obligations.Service.UpdateObligationValue:output_type -> policy.obligations.UpdateObligationValueResponse - 22, // 60: policy.obligations.Service.DeleteObligationValue:output_type -> policy.obligations.DeleteObligationValueResponse - 24, // 61: policy.obligations.Service.AddObligationTrigger:output_type -> policy.obligations.AddObligationTriggerResponse - 26, // 62: policy.obligations.Service.RemoveObligationTrigger:output_type -> policy.obligations.RemoveObligationTriggerResponse - 28, // 63: policy.obligations.Service.ListObligationTriggers:output_type -> policy.obligations.ListObligationTriggersResponse - 50, // [50:64] is the sub-list for method output_type - 36, // [36:50] is the sub-list for method input_type - 36, // [36:36] is the sub-list for extension type_name - 36, // [36:36] is the sub-list for extension extendee - 0, // [0:36] is the sub-list for field type_name + 0, // 0: policy.obligations.ObligationsSort.field:type_name -> policy.obligations.SortObligationsType + 33, // 1: policy.obligations.ObligationsSort.direction:type_name -> policy.SortDirection + 34, // 2: policy.obligations.ValueTriggerRequest.action:type_name -> common.IdNameIdentifier + 35, // 3: policy.obligations.ValueTriggerRequest.attribute_value:type_name -> common.IdFqnIdentifier + 36, // 4: policy.obligations.ValueTriggerRequest.context:type_name -> policy.RequestContext + 37, // 5: policy.obligations.GetObligationResponse.obligation:type_name -> policy.Obligation + 31, // 6: policy.obligations.GetObligationsByFQNsResponse.fqn_obligation_map:type_name -> policy.obligations.GetObligationsByFQNsResponse.FqnObligationMapEntry + 38, // 7: policy.obligations.CreateObligationRequest.metadata:type_name -> common.MetadataMutable + 37, // 8: policy.obligations.CreateObligationResponse.obligation:type_name -> policy.Obligation + 38, // 9: policy.obligations.UpdateObligationRequest.metadata:type_name -> common.MetadataMutable + 39, // 10: policy.obligations.UpdateObligationRequest.metadata_update_behavior:type_name -> common.MetadataUpdateEnum + 37, // 11: policy.obligations.UpdateObligationResponse.obligation:type_name -> policy.Obligation + 37, // 12: policy.obligations.DeleteObligationResponse.obligation:type_name -> policy.Obligation + 40, // 13: policy.obligations.ListObligationsRequest.pagination:type_name -> policy.PageRequest + 1, // 14: policy.obligations.ListObligationsRequest.sort:type_name -> policy.obligations.ObligationsSort + 37, // 15: policy.obligations.ListObligationsResponse.obligations:type_name -> policy.Obligation + 41, // 16: policy.obligations.ListObligationsResponse.pagination:type_name -> policy.PageResponse + 42, // 17: policy.obligations.GetObligationValueResponse.value:type_name -> policy.ObligationValue + 32, // 18: policy.obligations.GetObligationValuesByFQNsResponse.fqn_value_map:type_name -> policy.obligations.GetObligationValuesByFQNsResponse.FqnValueMapEntry + 3, // 19: policy.obligations.CreateObligationValueRequest.triggers:type_name -> policy.obligations.ValueTriggerRequest + 38, // 20: policy.obligations.CreateObligationValueRequest.metadata:type_name -> common.MetadataMutable + 42, // 21: policy.obligations.CreateObligationValueResponse.value:type_name -> policy.ObligationValue + 3, // 22: policy.obligations.UpdateObligationValueRequest.triggers:type_name -> policy.obligations.ValueTriggerRequest + 38, // 23: policy.obligations.UpdateObligationValueRequest.metadata:type_name -> common.MetadataMutable + 39, // 24: policy.obligations.UpdateObligationValueRequest.metadata_update_behavior:type_name -> common.MetadataUpdateEnum + 42, // 25: policy.obligations.UpdateObligationValueResponse.value:type_name -> policy.ObligationValue + 42, // 26: policy.obligations.DeleteObligationValueResponse.value:type_name -> policy.ObligationValue + 35, // 27: policy.obligations.AddObligationTriggerRequest.obligation_value:type_name -> common.IdFqnIdentifier + 34, // 28: policy.obligations.AddObligationTriggerRequest.action:type_name -> common.IdNameIdentifier + 35, // 29: policy.obligations.AddObligationTriggerRequest.attribute_value:type_name -> common.IdFqnIdentifier + 36, // 30: policy.obligations.AddObligationTriggerRequest.context:type_name -> policy.RequestContext + 38, // 31: policy.obligations.AddObligationTriggerRequest.metadata:type_name -> common.MetadataMutable + 43, // 32: policy.obligations.AddObligationTriggerResponse.trigger:type_name -> policy.ObligationTrigger + 43, // 33: policy.obligations.RemoveObligationTriggerResponse.trigger:type_name -> policy.ObligationTrigger + 40, // 34: policy.obligations.ListObligationTriggersRequest.pagination:type_name -> policy.PageRequest + 43, // 35: policy.obligations.ListObligationTriggersResponse.triggers:type_name -> policy.ObligationTrigger + 41, // 36: policy.obligations.ListObligationTriggersResponse.pagination:type_name -> policy.PageResponse + 37, // 37: policy.obligations.GetObligationsByFQNsResponse.FqnObligationMapEntry.value:type_name -> policy.Obligation + 42, // 38: policy.obligations.GetObligationValuesByFQNsResponse.FqnValueMapEntry.value:type_name -> policy.ObligationValue + 13, // 39: policy.obligations.Service.ListObligations:input_type -> policy.obligations.ListObligationsRequest + 2, // 40: policy.obligations.Service.GetObligation:input_type -> policy.obligations.GetObligationRequest + 5, // 41: policy.obligations.Service.GetObligationsByFQNs:input_type -> policy.obligations.GetObligationsByFQNsRequest + 7, // 42: policy.obligations.Service.CreateObligation:input_type -> policy.obligations.CreateObligationRequest + 9, // 43: policy.obligations.Service.UpdateObligation:input_type -> policy.obligations.UpdateObligationRequest + 11, // 44: policy.obligations.Service.DeleteObligation:input_type -> policy.obligations.DeleteObligationRequest + 15, // 45: policy.obligations.Service.GetObligationValue:input_type -> policy.obligations.GetObligationValueRequest + 17, // 46: policy.obligations.Service.GetObligationValuesByFQNs:input_type -> policy.obligations.GetObligationValuesByFQNsRequest + 19, // 47: policy.obligations.Service.CreateObligationValue:input_type -> policy.obligations.CreateObligationValueRequest + 21, // 48: policy.obligations.Service.UpdateObligationValue:input_type -> policy.obligations.UpdateObligationValueRequest + 23, // 49: policy.obligations.Service.DeleteObligationValue:input_type -> policy.obligations.DeleteObligationValueRequest + 25, // 50: policy.obligations.Service.AddObligationTrigger:input_type -> policy.obligations.AddObligationTriggerRequest + 27, // 51: policy.obligations.Service.RemoveObligationTrigger:input_type -> policy.obligations.RemoveObligationTriggerRequest + 29, // 52: policy.obligations.Service.ListObligationTriggers:input_type -> policy.obligations.ListObligationTriggersRequest + 14, // 53: policy.obligations.Service.ListObligations:output_type -> policy.obligations.ListObligationsResponse + 4, // 54: policy.obligations.Service.GetObligation:output_type -> policy.obligations.GetObligationResponse + 6, // 55: policy.obligations.Service.GetObligationsByFQNs:output_type -> policy.obligations.GetObligationsByFQNsResponse + 8, // 56: policy.obligations.Service.CreateObligation:output_type -> policy.obligations.CreateObligationResponse + 10, // 57: policy.obligations.Service.UpdateObligation:output_type -> policy.obligations.UpdateObligationResponse + 12, // 58: policy.obligations.Service.DeleteObligation:output_type -> policy.obligations.DeleteObligationResponse + 16, // 59: policy.obligations.Service.GetObligationValue:output_type -> policy.obligations.GetObligationValueResponse + 18, // 60: policy.obligations.Service.GetObligationValuesByFQNs:output_type -> policy.obligations.GetObligationValuesByFQNsResponse + 20, // 61: policy.obligations.Service.CreateObligationValue:output_type -> policy.obligations.CreateObligationValueResponse + 22, // 62: policy.obligations.Service.UpdateObligationValue:output_type -> policy.obligations.UpdateObligationValueResponse + 24, // 63: policy.obligations.Service.DeleteObligationValue:output_type -> policy.obligations.DeleteObligationValueResponse + 26, // 64: policy.obligations.Service.AddObligationTrigger:output_type -> policy.obligations.AddObligationTriggerResponse + 28, // 65: policy.obligations.Service.RemoveObligationTrigger:output_type -> policy.obligations.RemoveObligationTriggerResponse + 30, // 66: policy.obligations.Service.ListObligationTriggers:output_type -> policy.obligations.ListObligationTriggersResponse + 53, // [53:67] is the sub-list for method output_type + 39, // [39:53] is the sub-list for method input_type + 39, // [39:39] is the sub-list for extension type_name + 39, // [39:39] is the sub-list for extension extendee + 0, // [0:39] is the sub-list for field type_name } func init() { file_policy_obligations_obligations_proto_init() } @@ -2280,7 +2432,7 @@ func file_policy_obligations_obligations_proto_init() { } if !protoimpl.UnsafeEnabled { file_policy_obligations_obligations_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObligationRequest); i { + switch v := v.(*ObligationsSort); i { case 0: return &v.state case 1: @@ -2292,7 +2444,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValueTriggerRequest); i { + switch v := v.(*GetObligationRequest); i { case 0: return &v.state case 1: @@ -2304,7 +2456,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObligationResponse); i { + switch v := v.(*ValueTriggerRequest); i { case 0: return &v.state case 1: @@ -2316,7 +2468,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObligationsByFQNsRequest); i { + switch v := v.(*GetObligationResponse); i { case 0: return &v.state case 1: @@ -2328,7 +2480,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObligationsByFQNsResponse); i { + switch v := v.(*GetObligationsByFQNsRequest); i { case 0: return &v.state case 1: @@ -2340,7 +2492,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateObligationRequest); i { + switch v := v.(*GetObligationsByFQNsResponse); i { case 0: return &v.state case 1: @@ -2352,7 +2504,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateObligationResponse); i { + switch v := v.(*CreateObligationRequest); i { case 0: return &v.state case 1: @@ -2364,7 +2516,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateObligationRequest); i { + switch v := v.(*CreateObligationResponse); i { case 0: return &v.state case 1: @@ -2376,7 +2528,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateObligationResponse); i { + switch v := v.(*UpdateObligationRequest); i { case 0: return &v.state case 1: @@ -2388,7 +2540,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteObligationRequest); i { + switch v := v.(*UpdateObligationResponse); i { case 0: return &v.state case 1: @@ -2400,7 +2552,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteObligationResponse); i { + switch v := v.(*DeleteObligationRequest); i { case 0: return &v.state case 1: @@ -2412,7 +2564,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListObligationsRequest); i { + switch v := v.(*DeleteObligationResponse); i { case 0: return &v.state case 1: @@ -2424,7 +2576,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListObligationsResponse); i { + switch v := v.(*ListObligationsRequest); i { case 0: return &v.state case 1: @@ -2436,7 +2588,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObligationValueRequest); i { + switch v := v.(*ListObligationsResponse); i { case 0: return &v.state case 1: @@ -2448,7 +2600,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObligationValueResponse); i { + switch v := v.(*GetObligationValueRequest); i { case 0: return &v.state case 1: @@ -2460,7 +2612,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObligationValuesByFQNsRequest); i { + switch v := v.(*GetObligationValueResponse); i { case 0: return &v.state case 1: @@ -2472,7 +2624,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObligationValuesByFQNsResponse); i { + switch v := v.(*GetObligationValuesByFQNsRequest); i { case 0: return &v.state case 1: @@ -2484,7 +2636,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateObligationValueRequest); i { + switch v := v.(*GetObligationValuesByFQNsResponse); i { case 0: return &v.state case 1: @@ -2496,7 +2648,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateObligationValueResponse); i { + switch v := v.(*CreateObligationValueRequest); i { case 0: return &v.state case 1: @@ -2508,7 +2660,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateObligationValueRequest); i { + switch v := v.(*CreateObligationValueResponse); i { case 0: return &v.state case 1: @@ -2520,7 +2672,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateObligationValueResponse); i { + switch v := v.(*UpdateObligationValueRequest); i { case 0: return &v.state case 1: @@ -2532,7 +2684,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteObligationValueRequest); i { + switch v := v.(*UpdateObligationValueResponse); i { case 0: return &v.state case 1: @@ -2544,7 +2696,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteObligationValueResponse); i { + switch v := v.(*DeleteObligationValueRequest); i { case 0: return &v.state case 1: @@ -2556,7 +2708,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddObligationTriggerRequest); i { + switch v := v.(*DeleteObligationValueResponse); i { case 0: return &v.state case 1: @@ -2568,7 +2720,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddObligationTriggerResponse); i { + switch v := v.(*AddObligationTriggerRequest); i { case 0: return &v.state case 1: @@ -2580,7 +2732,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveObligationTriggerRequest); i { + switch v := v.(*AddObligationTriggerResponse); i { case 0: return &v.state case 1: @@ -2592,7 +2744,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveObligationTriggerResponse); i { + switch v := v.(*RemoveObligationTriggerRequest); i { case 0: return &v.state case 1: @@ -2604,7 +2756,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListObligationTriggersRequest); i { + switch v := v.(*RemoveObligationTriggerResponse); i { case 0: return &v.state case 1: @@ -2616,6 +2768,18 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListObligationTriggersRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_policy_obligations_obligations_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListObligationTriggersResponse); i { case 0: return &v.state @@ -2633,13 +2797,14 @@ func file_policy_obligations_obligations_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_policy_obligations_obligations_proto_rawDesc, - NumEnums: 0, - NumMessages: 31, + NumEnums: 1, + NumMessages: 32, NumExtensions: 0, NumServices: 1, }, GoTypes: file_policy_obligations_obligations_proto_goTypes, DependencyIndexes: file_policy_obligations_obligations_proto_depIdxs, + EnumInfos: file_policy_obligations_obligations_proto_enumTypes, MessageInfos: file_policy_obligations_obligations_proto_msgTypes, }.Build() File_policy_obligations_obligations_proto = out.File diff --git a/service/policy/obligations/obligations.proto b/service/policy/obligations/obligations.proto index a2812b3d61..613f99dcb9 100644 --- a/service/policy/obligations/obligations.proto +++ b/service/policy/obligations/obligations.proto @@ -12,6 +12,20 @@ import "buf/validate/validate.proto"; /// // Definitions + +enum SortObligationsType { + SORT_OBLIGATIONS_TYPE_UNSPECIFIED = 0; + SORT_OBLIGATIONS_TYPE_NAME = 1; + SORT_OBLIGATIONS_TYPE_FQN = 2; + SORT_OBLIGATIONS_TYPE_CREATED_AT = 3; + SORT_OBLIGATIONS_TYPE_UPDATED_AT = 4; +} + +message ObligationsSort { + SortObligationsType field = 1; + policy.SortDirection direction = 2; +} + message GetObligationRequest { option (buf.validate.message).oneof = { fields: ["id", "fqn"], required: true }; string id = 1 [(buf.validate.field).string.uuid = true]; @@ -150,6 +164,11 @@ message ListObligationsRequest { // Optional policy.PageRequest pagination = 10; + + // Optional - CONSTRAINT: max 1 item + // Default ordering when omitted or when the first entry's field is UNSPECIFIED: + // created_at DESC, then id ASC (tie-breaker). + repeated ObligationsSort sort = 11 [(buf.validate.field).repeated.max_items = 1]; } message ListObligationsResponse { From a7d43f5d25fb8ea809774419352724541407749c Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:42:55 -0400 Subject: [PATCH 02/18] add protovalidate tests api-level tests for no items, 1 item, and 2 items sort (pass pass fail) --- .../policy/obligations/obligations_test.go | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/service/policy/obligations/obligations_test.go b/service/policy/obligations/obligations_test.go index d37d4f3d3b..aa0eb9eec4 100644 --- a/service/policy/obligations/obligations_test.go +++ b/service/policy/obligations/obligations_test.go @@ -1246,3 +1246,39 @@ func Test_ListObligationTriggers_Request(t *testing.T) { }) } } + +func Test_ListObligationRequest_Sort(t *testing.T) { + v := getValidator() + + // no sort (valid) + req := &obligations.ListObligationsRequest{} + require.NoError(t, v.Validate(req)) + + // one sorted item (valid) + req = &obligations.ListObligationsRequest{ + Sort: []*obligations.ObligationsSort{ + { + Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_CREATED_AT, + Direction: policy.SortDirection_SORT_DIRECTION_ASC, + }, + }, + } + require.NoError(t, v.Validate(req)) + + // two items sorted (invalid, exceeds max_items = 1) + req = &obligations.ListObligationsRequest{ + Sort: []*obligations.ObligationsSort{ + { + Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_CREATED_AT, + Direction: policy.SortDirection_SORT_DIRECTION_ASC, + }, + { + Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_NAME, + Direction: policy.SortDirection_SORT_DIRECTION_DESC, + }, + }, + } + err := v.Validate(req) + require.Error(t, err) + require.Contains(t, err.Error(), "sort") +} From 47484a6f10803182339056705edd499f0e352a91 Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:48:36 -0400 Subject: [PATCH 03/18] rename test to regular convention --- service/policy/obligations/obligations_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/policy/obligations/obligations_test.go b/service/policy/obligations/obligations_test.go index aa0eb9eec4..d0f8cadb99 100644 --- a/service/policy/obligations/obligations_test.go +++ b/service/policy/obligations/obligations_test.go @@ -1247,7 +1247,7 @@ func Test_ListObligationTriggers_Request(t *testing.T) { } } -func Test_ListObligationRequest_Sort(t *testing.T) { +func Test_ListObligationsRequest_Sort(t *testing.T) { v := getValidator() // no sort (valid) From 33b2cb676455a7060f857c58d8e418c9eeb9db3c Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:54:47 -0400 Subject: [PATCH 04/18] add constants fqn and name in utils --- service/policy/db/utils.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/service/policy/db/utils.go b/service/policy/db/utils.go index 9030e19d71..e27608027a 100644 --- a/service/policy/db/utils.go +++ b/service/policy/db/utils.go @@ -20,6 +20,8 @@ import ( const ( sortFieldCreatedAt = "created_at" sortFieldUpdatedAt = "updated_at" + sortFieldName = "name" + SortFieldFQN = "fqn" ) // Gathers request pagination limit/offset or configured default From 7a860f19346e840db26646593c47247fd80d9f91 Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:59:54 -0400 Subject: [PATCH 05/18] replace SQL with CASE WHEN in listObligations query, remove ORDER BY replace with CASE WHEN block. FQN is assembled here. also regenerated sqlc --- service/policy/db/obligations.sql.go | 44 +++++++++++++++++------ service/policy/db/queries/obligations.sql | 12 ++++++- 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/service/policy/db/obligations.sql.go b/service/policy/db/obligations.sql.go index 2e51dc545b..f7a764a220 100644 --- a/service/policy/db/obligations.sql.go +++ b/service/policy/db/obligations.sql.go @@ -1522,16 +1522,28 @@ WHERE ($1::uuid IS NULL OR od.namespace_id = $1::uuid) AND ($2::text IS NULL OR fqns.fqn = $2::text) GROUP BY od.id, n.id, fqns.fqn, counted.total -ORDER BY od.created_at DESC -LIMIT $4 -OFFSET $3 +ORDER BY + CASE WHEN $3::text = 'name' AND $4::text = 'ASC' THEN od.name END ASC, + CASE WHEN $3::text = 'name' AND $4::text = 'DESC' THEN od.name END DESC, + CASE WHEN $3::text = 'fqn' AND $4::text = 'ASC' THEN fqns.fqn || '/obl/' || LOWER(od.name) END ASC, + CASE WHEN $3::text = 'fqn' AND $4::text = 'DESC' THEN fqns.fqn || '/obl/' || LOWER(od.name) END DESC, + CASE WHEN $3::text = 'created_at' AND $4::text = 'ASC' THEN od.created_at END ASC, + CASE WHEN $3::text = 'created_at' AND $4::text = 'DESC' THEN od.created_at END DESC, + CASE WHEN $3::text = 'updated_at' AND $4::text = 'ASC' THEN od.updated_at END ASC, + CASE WHEN $3::text = 'updated_at' AND $4::text = 'DESC' THEN od.updated_at END DESC, + od.created_at DESC, + od.id ASC +LIMIT $6 +OFFSET $5 ` type listObligationsParams struct { - NamespaceID pgtype.UUID `json:"namespace_id"` - NamespaceFqn pgtype.Text `json:"namespace_fqn"` - Offset int32 `json:"offset_"` - Limit int32 `json:"limit_"` + NamespaceID pgtype.UUID `json:"namespace_id"` + NamespaceFqn pgtype.Text `json:"namespace_fqn"` + SortField string `json:"sort_field"` + SortDirection string `json:"sort_direction"` + Offset int32 `json:"offset_"` + Limit int32 `json:"limit_"` } type listObligationsRow struct { @@ -1614,13 +1626,25 @@ type listObligationsRow struct { // ($1::uuid IS NULL OR od.namespace_id = $1::uuid) AND // ($2::text IS NULL OR fqns.fqn = $2::text) // GROUP BY od.id, n.id, fqns.fqn, counted.total -// ORDER BY od.created_at DESC -// LIMIT $4 -// OFFSET $3 +// ORDER BY +// CASE WHEN $3::text = 'name' AND $4::text = 'ASC' THEN od.name END ASC, +// CASE WHEN $3::text = 'name' AND $4::text = 'DESC' THEN od.name END DESC, +// CASE WHEN $3::text = 'fqn' AND $4::text = 'ASC' THEN fqns.fqn || '/obl/' || LOWER(od.name) END ASC, +// CASE WHEN $3::text = 'fqn' AND $4::text = 'DESC' THEN fqns.fqn || '/obl/' || LOWER(od.name) END DESC, +// CASE WHEN $3::text = 'created_at' AND $4::text = 'ASC' THEN od.created_at END ASC, +// CASE WHEN $3::text = 'created_at' AND $4::text = 'DESC' THEN od.created_at END DESC, +// CASE WHEN $3::text = 'updated_at' AND $4::text = 'ASC' THEN od.updated_at END ASC, +// CASE WHEN $3::text = 'updated_at' AND $4::text = 'DESC' THEN od.updated_at END DESC, +// od.created_at DESC, +// od.id ASC +// LIMIT $6 +// OFFSET $5 func (q *Queries) listObligations(ctx context.Context, arg listObligationsParams) ([]listObligationsRow, error) { rows, err := q.db.Query(ctx, listObligations, arg.NamespaceID, arg.NamespaceFqn, + arg.SortField, + arg.SortDirection, arg.Offset, arg.Limit, ) diff --git a/service/policy/db/queries/obligations.sql b/service/policy/db/queries/obligations.sql index 5b4c259f2b..fad2585cca 100644 --- a/service/policy/db/queries/obligations.sql +++ b/service/policy/db/queries/obligations.sql @@ -187,7 +187,17 @@ WHERE (sqlc.narg('namespace_id')::uuid IS NULL OR od.namespace_id = sqlc.narg('namespace_id')::uuid) AND (sqlc.narg('namespace_fqn')::text IS NULL OR fqns.fqn = sqlc.narg('namespace_fqn')::text) GROUP BY od.id, n.id, fqns.fqn, counted.total -ORDER BY od.created_at DESC +ORDER BY + CASE WHEN @sort_field::text = 'name' AND @sort_direction::text = 'ASC' THEN od.name END ASC, + CASE WHEN @sort_field::text = 'name' AND @sort_direction::text = 'DESC' THEN od.name END DESC, + CASE WHEN @sort_field::text = 'fqn' AND @sort_direction::text = 'ASC' THEN fqns.fqn || '/obl/' || LOWER(od.name) END ASC, + CASE WHEN @sort_field::text = 'fqn' AND @sort_direction::text = 'DESC' THEN fqns.fqn || '/obl/' || LOWER(od.name) END DESC, + CASE WHEN @sort_field::text = 'created_at' AND @sort_direction::text = 'ASC' THEN od.created_at END ASC, + CASE WHEN @sort_field::text = 'created_at' AND @sort_direction::text = 'DESC' THEN od.created_at END DESC, + CASE WHEN @sort_field::text = 'updated_at' AND @sort_direction::text = 'ASC' THEN od.updated_at END ASC, + CASE WHEN @sort_field::text = 'updated_at' AND @sort_direction::text = 'DESC' THEN od.updated_at END DESC, + od.created_at DESC, + od.id ASC LIMIT @limit_ OFFSET @offset_; From ce925f2c20841d9bd4463503bb61452c57f358d2 Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Mon, 13 Apr 2026 14:11:08 -0400 Subject: [PATCH 06/18] remove tie breaker this is getting saved for a later PR since its inconsistent across listAPIs --- service/policy/db/queries/obligations.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/service/policy/db/queries/obligations.sql b/service/policy/db/queries/obligations.sql index fad2585cca..88396ebf5c 100644 --- a/service/policy/db/queries/obligations.sql +++ b/service/policy/db/queries/obligations.sql @@ -197,7 +197,6 @@ ORDER BY CASE WHEN @sort_field::text = 'updated_at' AND @sort_direction::text = 'ASC' THEN od.updated_at END ASC, CASE WHEN @sort_field::text = 'updated_at' AND @sort_direction::text = 'DESC' THEN od.updated_at END DESC, od.created_at DESC, - od.id ASC LIMIT @limit_ OFFSET @offset_; From a5313b0588c5534dd2e8141eff5cb84b95d2e070 Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Mon, 13 Apr 2026 14:13:16 -0400 Subject: [PATCH 07/18] regenerate sql --- service/policy/db/obligations.sql.go | 6 ++---- service/policy/db/queries/obligations.sql | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/service/policy/db/obligations.sql.go b/service/policy/db/obligations.sql.go index f7a764a220..f5d6db6ac3 100644 --- a/service/policy/db/obligations.sql.go +++ b/service/policy/db/obligations.sql.go @@ -1531,8 +1531,7 @@ ORDER BY CASE WHEN $3::text = 'created_at' AND $4::text = 'DESC' THEN od.created_at END DESC, CASE WHEN $3::text = 'updated_at' AND $4::text = 'ASC' THEN od.updated_at END ASC, CASE WHEN $3::text = 'updated_at' AND $4::text = 'DESC' THEN od.updated_at END DESC, - od.created_at DESC, - od.id ASC + od.created_at DESC LIMIT $6 OFFSET $5 ` @@ -1635,8 +1634,7 @@ type listObligationsRow struct { // CASE WHEN $3::text = 'created_at' AND $4::text = 'DESC' THEN od.created_at END DESC, // CASE WHEN $3::text = 'updated_at' AND $4::text = 'ASC' THEN od.updated_at END ASC, // CASE WHEN $3::text = 'updated_at' AND $4::text = 'DESC' THEN od.updated_at END DESC, -// od.created_at DESC, -// od.id ASC +// od.created_at DESC // LIMIT $6 // OFFSET $5 func (q *Queries) listObligations(ctx context.Context, arg listObligationsParams) ([]listObligationsRow, error) { diff --git a/service/policy/db/queries/obligations.sql b/service/policy/db/queries/obligations.sql index 88396ebf5c..d0002e4a24 100644 --- a/service/policy/db/queries/obligations.sql +++ b/service/policy/db/queries/obligations.sql @@ -196,7 +196,7 @@ ORDER BY CASE WHEN @sort_field::text = 'created_at' AND @sort_direction::text = 'DESC' THEN od.created_at END DESC, CASE WHEN @sort_field::text = 'updated_at' AND @sort_direction::text = 'ASC' THEN od.updated_at END ASC, CASE WHEN @sort_field::text = 'updated_at' AND @sort_direction::text = 'DESC' THEN od.updated_at END DESC, - od.created_at DESC, + od.created_at DESC LIMIT @limit_ OFFSET @offset_; From b1d28f2a9a094c34dc008a462146eba060729422 Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Mon, 13 Apr 2026 14:36:45 -0400 Subject: [PATCH 08/18] add getSortParams in utils and unit tests function 12 unit tests, full coverage) in utils_test.go --- service/policy/db/utils.go | 30 +++++++++ service/policy/db/utils_test.go | 109 ++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) diff --git a/service/policy/db/utils.go b/service/policy/db/utils.go index e27608027a..1f185070eb 100644 --- a/service/policy/db/utils.go +++ b/service/policy/db/utils.go @@ -11,6 +11,7 @@ import ( "github.com/opentdf/platform/protocol/go/policy" "github.com/opentdf/platform/protocol/go/policy/attributes" "github.com/opentdf/platform/protocol/go/policy/namespaces" + "github.com/opentdf/platform/protocol/go/policy/obligations" "github.com/opentdf/platform/protocol/go/policy/subjectmapping" "github.com/opentdf/platform/service/pkg/db" "google.golang.org/protobuf/encoding/protojson" @@ -101,6 +102,35 @@ func GetSubjectConditionSetsSortParams(sort []*subjectmapping.SubjectConditionSe return field, getSortDirection(s.GetDirection()) } +// GetObligationsSortParams maps the strongly-typed ObligationsSort enum to +// SQL-compatible field name and direction strings. +// Returns empty strings when sort is nil or empty (backward compatible — +// callers fall back to default ORDER BY created_at DESC). +func GetObligationsSortParams(sort []*obligations.ObligationsSort) (string, string) { + if len(sort) == 0 || sort[0] == nil { + return "", "" + } + s := sort[0] + + var field string + switch s.GetField() { + case obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_NAME: + field = sortFieldName + case obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_FQN: + field = SortFieldFQN + case obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_CREATED_AT: + field = sortFieldCreatedAt + case obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_UPDATED_AT: + field = sortFieldUpdatedAt + case obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_UNSPECIFIED: + return "", "" + default: + return "", "" + } + + return field, getSortDirection(s.GetDirection()) +} + // Returns next page's offset if has not yet reached total, or else returns 0 func getNextOffset(currentOffset, limit, total int32) int32 { next := currentOffset + limit diff --git a/service/policy/db/utils_test.go b/service/policy/db/utils_test.go index 0e29a6c2ae..0eb99a9634 100644 --- a/service/policy/db/utils_test.go +++ b/service/policy/db/utils_test.go @@ -6,6 +6,7 @@ import ( "github.com/opentdf/platform/protocol/go/policy" "github.com/opentdf/platform/protocol/go/policy/attributes" "github.com/opentdf/platform/protocol/go/policy/namespaces" + "github.com/opentdf/platform/protocol/go/policy/obligations" "github.com/opentdf/platform/protocol/go/policy/subjectmapping" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -599,3 +600,111 @@ func Test_GetSubjectConditionSetsSortParams(t *testing.T) { }) } } + +func Test_GetObligationsSortParams(t *testing.T) { + cases := []struct { + name string + sort []*obligations.ObligationsSort + expectedField string + expectedDir string + }{ + { + name: "nil sort returns empty strings", + sort: nil, + expectedField: "", + expectedDir: "", + }, + { + name: "empty slice returns empty strings", + sort: []*obligations.ObligationsSort{}, + expectedField: "", + expectedDir: "", + }, + { + name: "nil element returns empty strings", + sort: []*obligations.ObligationsSort{nil}, + expectedField: "", + expectedDir: "", + }, + { + name: "UNSPECIFIED returns empty strings", + sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_UNSPECIFIED, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + expectedField: "", + expectedDir: "", + }, + { + name: "NAME with ASC", + sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_NAME, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + expectedField: "name", + expectedDir: "ASC", + }, + { + name: "NAME with DESC", + sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_NAME, Direction: policy.SortDirection_SORT_DIRECTION_DESC}, + }, + expectedField: "name", + expectedDir: "DESC", + }, + { + name: "FQN with ASC", + sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_FQN, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + expectedField: "fqn", + expectedDir: "ASC", + }, + { + name: "FQN with unspecified direction defaults to ASC", + sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_FQN}, + }, + expectedField: "fqn", + expectedDir: "ASC", + }, + { + name: "CREATED_AT with ASC", + sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_CREATED_AT, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + expectedField: "created_at", + expectedDir: "ASC", + }, + { + name: "CREATED_AT with DESC", + sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_CREATED_AT, Direction: policy.SortDirection_SORT_DIRECTION_DESC}, + }, + expectedField: "created_at", + expectedDir: "DESC", + }, + { + name: "UPDATED_AT with ASC", + sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_UPDATED_AT, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + expectedField: "updated_at", + expectedDir: "ASC", + }, + { + name: "UPDATED_AT with DESC", + sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_UPDATED_AT, Direction: policy.SortDirection_SORT_DIRECTION_DESC}, + }, + expectedField: "updated_at", + expectedDir: "DESC", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + field, dir := GetObligationsSortParams(tc.sort) + assert.Equal(t, tc.expectedField, field) + assert.Equal(t, tc.expectedDir, dir) + }) + } +} From e932c828dee82fbf85a2c9aa8e63b68e68ccff89 Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Mon, 13 Apr 2026 14:41:11 -0400 Subject: [PATCH 09/18] listObligations go gets GetSortParams wire sort params into the go DB function in /db/obligations.go --- service/policy/db/obligations.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/service/policy/db/obligations.go b/service/policy/db/obligations.go index b790027436..dcb20c9bfe 100644 --- a/service/policy/db/obligations.go +++ b/service/policy/db/obligations.go @@ -200,6 +200,8 @@ func (c PolicyDBClient) ListObligations(ctx context.Context, r *obligations.List parsedID := pgtypeUUID(namespaceID) idIsValid := parsedID.Valid + sortField, sortDirection := GetObligationsSortParams(r.GetSort()) + if useID && !idIsValid { return nil, nil, db.ErrUUIDInvalid } @@ -212,10 +214,12 @@ func (c PolicyDBClient) ListObligations(ctx context.Context, r *obligations.List } rows, err := c.queries.listObligations(ctx, listObligationsParams{ - NamespaceID: parsedID, - NamespaceFqn: pgtypeText(r.GetNamespaceFqn()), - Limit: limit, - Offset: offset, + NamespaceID: parsedID, + NamespaceFqn: pgtypeText(r.GetNamespaceFqn()), + Limit: limit, + Offset: offset, + SortField: sortField, + SortDirection: sortDirection, }) if err != nil { return nil, nil, db.WrapIfKnownInvalidQueryErr(err) From 8c30b96a695e35051d5e2f5fbabf6718563e3ec0 Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Mon, 13 Apr 2026 15:00:21 -0400 Subject: [PATCH 10/18] add integration tests full coverage (created_at, updated_at, name, fqn. two helpers for time based and name based sorting. uses assertIDsInOrder helper across each integration test --- service/integration/obligations_test.go | 200 ++++++++++++++++++++++++ 1 file changed, 200 insertions(+) diff --git a/service/integration/obligations_test.go b/service/integration/obligations_test.go index c6d450cd06..4d363570d7 100644 --- a/service/integration/obligations_test.go +++ b/service/integration/obligations_test.go @@ -1965,3 +1965,203 @@ func (s *ObligationsSuite) assertObligationValuesSpecificTriggers(obl *policy.Ob } } } + +// Sort test helpers + +// createSortTestObligations creates 3 obligations with 5ms gaps for distinct timestamps. +// Returns the obligation IDs in creation order. +func (s *ObligationsSuite) createSortTestObligations(label string) []string { + namespaceID, _, _ := s.getNamespaceData(nsExampleCom) + const count = 3 + ids := make([]string, count) + for i := range count { + if i > 0 { + time.Sleep(5 * time.Millisecond) + } + name := fmt.Sprintf("%s-%d-%d", label, i, time.Now().UnixNano()) + obl := s.createObligation(namespaceID, name, nil) + ids[i] = obl.GetId() + } + return ids +} + +// createNamedSortTestObligations creates obligations with specific name prefixes for name/FQN sort testing. +// Returns the obligation IDs in the same order as the prefixes. +func (s *ObligationsSuite) createNamedSortTestObligations(prefixes []string) []string { + namespaceID, _, _ := s.getNamespaceData(nsExampleCom) + suffix := time.Now().UnixNano() + ids := make([]string, len(prefixes)) + for i, prefix := range prefixes { + name := fmt.Sprintf("%s-%d", prefix, suffix) + obl := s.createObligation(namespaceID, name, nil) + ids[i] = obl.GetId() + } + return ids +} + +// Sort by Name + +func (s *ObligationsSuite) Test_ListObligations_SortByName_ASC() { + ids := s.createNamedSortTestObligations([]string{"aaa-sort", "bbb-sort", "ccc-sort"}) + + listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ + Sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_NAME, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + }) + s.Require().NoError(err) + s.NotNil(listRsp) + + // aaa < bbb < ccc in ASC order + assertIDsInOrder(s.T(), listRsp, func(o *policy.Obligation) string { return o.GetId() }, ids[0], ids[1], ids[2]) +} + +func (s *ObligationsSuite) Test_ListObligations_SortByName_DESC() { + ids := s.createNamedSortTestObligations([]string{"aaa-sortdesc", "bbb-sortdesc", "ccc-sortdesc"}) + + listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ + Sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_NAME, Direction: policy.SortDirection_SORT_DIRECTION_DESC}, + }, + }) + s.Require().NoError(err) + s.NotNil(listRsp) + + // ccc > bbb > aaa in DESC order + assertIDsInOrder(s.T(), listRsp, func(o *policy.Obligation) string { return o.GetId() }, ids[2], ids[1], ids[0]) +} + +// Sort by FQN + +func (s *ObligationsSuite) Test_ListObligations_SortByFqn_ASC() { + ids := s.createNamedSortTestObligations([]string{"aaa-fqnsort", "bbb-fqnsort", "ccc-fqnsort"}) + + listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ + Sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_FQN, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + }) + s.Require().NoError(err) + s.NotNil(listRsp) + + // FQN is namespace_fqn/obl/name, so aaa < bbb < ccc in ASC order + assertIDsInOrder(s.T(), listRsp, func(o *policy.Obligation) string { return o.GetId() }, ids[0], ids[1], ids[2]) +} + +func (s *ObligationsSuite) Test_ListObligations_SortByFqn_DESC() { + ids := s.createNamedSortTestObligations([]string{"aaa-fqnsortdesc", "bbb-fqnsortdesc", "ccc-fqnsortdesc"}) + + listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ + Sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_FQN, Direction: policy.SortDirection_SORT_DIRECTION_DESC}, + }, + }) + s.Require().NoError(err) + s.NotNil(listRsp) + + // ccc > bbb > aaa in DESC order + assertIDsInOrder(s.T(), listRsp, func(o *policy.Obligation) string { return o.GetId() }, ids[2], ids[1], ids[0]) +} + +// Sort by CreatedAt + +func (s *ObligationsSuite) Test_ListObligations_SortByCreatedAt_ASC() { + ids := s.createSortTestObligations("createdasc-obl") + + listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ + Sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_CREATED_AT, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + }) + s.Require().NoError(err) + s.NotNil(listRsp) + + // oldest first in ASC order + assertIDsInOrder(s.T(), listRsp, func(o *policy.Obligation) string { return o.GetId() }, ids[0], ids[1], ids[2]) +} + +func (s *ObligationsSuite) Test_ListObligations_SortByCreatedAt_DESC() { + ids := s.createSortTestObligations("createddesc-obl") + + listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ + Sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_CREATED_AT, Direction: policy.SortDirection_SORT_DIRECTION_DESC}, + }, + }) + s.Require().NoError(err) + s.NotNil(listRsp) + + // newest first in DESC order + assertIDsInOrder(s.T(), listRsp, func(o *policy.Obligation) string { return o.GetId() }, ids[2], ids[1], ids[0]) +} + +// Sort by UpdatedAt + +func (s *ObligationsSuite) Test_ListObligations_SortByUpdatedAt_DESC() { + ids := s.createSortTestObligations("upd-sort-obl") + + // Update the first obligation so its updated_at is the most recent + time.Sleep(5 * time.Millisecond) + _, err := s.db.PolicyClient.UpdateObligation(s.ctx, &obligations.UpdateObligationRequest{ + Id: ids[0], + Metadata: &common.MetadataMutable{ + Labels: map[string]string{"updated": "true"}, + }, + MetadataUpdateBehavior: common.MetadataUpdateEnum_METADATA_UPDATE_ENUM_REPLACE, + }) + s.Require().NoError(err) + + listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ + Sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_UPDATED_AT, Direction: policy.SortDirection_SORT_DIRECTION_DESC}, + }, + }) + s.Require().NoError(err) + s.NotNil(listRsp) + + // The updated obligation (ids[0]) should appear before the others + assertIDsInOrder(s.T(), listRsp, func(o *policy.Obligation) string { return o.GetId() }, ids[0], ids[2], ids[1]) +} + +func (s *ObligationsSuite) Test_ListObligations_SortByUpdatedAt_ASC() { + ids := s.createSortTestObligations("upd-sort-asc-obl") + + // Update the last obligation so its updated_at is the most recent + time.Sleep(5 * time.Millisecond) + _, err := s.db.PolicyClient.UpdateObligation(s.ctx, &obligations.UpdateObligationRequest{ + Id: ids[2], + Metadata: &common.MetadataMutable{ + Labels: map[string]string{"updated": "true"}, + }, + MetadataUpdateBehavior: common.MetadataUpdateEnum_METADATA_UPDATE_ENUM_REPLACE, + }) + s.Require().NoError(err) + + listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ + Sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_UPDATED_AT, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + }) + s.Require().NoError(err) + s.NotNil(listRsp) + + // The updated obligation (ids[2]) should appear last in ASC order + assertIDsInOrder(s.T(), listRsp, func(o *policy.Obligation) string { return o.GetId() }, ids[0], ids[1], ids[2]) +} + +// Sort by Unspecified (fallback to default) + +func (s *ObligationsSuite) Test_ListObligations_SortByUnspecifiedField_FallsBackToDefault() { + ids := s.createSortTestObligations("unspecified-sort-obl") + + listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ + Sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_UNSPECIFIED, Direction: policy.SortDirection_SORT_DIRECTION_ASC}, + }, + }) + s.Require().NoError(err) + s.NotNil(listRsp) + + // Falls back to default created_at DESC ordering + assertIDsInOrder(s.T(), listRsp, func(o *policy.Obligation) string { return o.GetId() }, ids[2], ids[1], ids[0]) +} From cb39c35b9d96c1da42ae22ec0943764e1cc7e973 Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Mon, 13 Apr 2026 15:03:59 -0400 Subject: [PATCH 11/18] fix const name inconsistency --- service/policy/db/utils.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/service/policy/db/utils.go b/service/policy/db/utils.go index 1f185070eb..52ba4cb55b 100644 --- a/service/policy/db/utils.go +++ b/service/policy/db/utils.go @@ -22,7 +22,7 @@ const ( sortFieldCreatedAt = "created_at" sortFieldUpdatedAt = "updated_at" sortFieldName = "name" - SortFieldFQN = "fqn" + sortFieldFQN = "fqn" ) // Gathers request pagination limit/offset or configured default @@ -117,7 +117,7 @@ func GetObligationsSortParams(sort []*obligations.ObligationsSort) (string, stri case obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_NAME: field = sortFieldName case obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_FQN: - field = SortFieldFQN + field = sortFieldFQN case obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_CREATED_AT: field = sortFieldCreatedAt case obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_UPDATED_AT: From 92edeeeb05b2508e82ade3257299291bea90845d Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Tue, 14 Apr 2026 09:26:45 -0400 Subject: [PATCH 12/18] move integration test helpers around linter was upset --- service/integration/obligations_test.go | 66 ++++++++++++------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/service/integration/obligations_test.go b/service/integration/obligations_test.go index 4d363570d7..d0e1acd656 100644 --- a/service/integration/obligations_test.go +++ b/service/integration/obligations_test.go @@ -1966,39 +1966,6 @@ func (s *ObligationsSuite) assertObligationValuesSpecificTriggers(obl *policy.Ob } } -// Sort test helpers - -// createSortTestObligations creates 3 obligations with 5ms gaps for distinct timestamps. -// Returns the obligation IDs in creation order. -func (s *ObligationsSuite) createSortTestObligations(label string) []string { - namespaceID, _, _ := s.getNamespaceData(nsExampleCom) - const count = 3 - ids := make([]string, count) - for i := range count { - if i > 0 { - time.Sleep(5 * time.Millisecond) - } - name := fmt.Sprintf("%s-%d-%d", label, i, time.Now().UnixNano()) - obl := s.createObligation(namespaceID, name, nil) - ids[i] = obl.GetId() - } - return ids -} - -// createNamedSortTestObligations creates obligations with specific name prefixes for name/FQN sort testing. -// Returns the obligation IDs in the same order as the prefixes. -func (s *ObligationsSuite) createNamedSortTestObligations(prefixes []string) []string { - namespaceID, _, _ := s.getNamespaceData(nsExampleCom) - suffix := time.Now().UnixNano() - ids := make([]string, len(prefixes)) - for i, prefix := range prefixes { - name := fmt.Sprintf("%s-%d", prefix, suffix) - obl := s.createObligation(namespaceID, name, nil) - ids[i] = obl.GetId() - } - return ids -} - // Sort by Name func (s *ObligationsSuite) Test_ListObligations_SortByName_ASC() { @@ -2165,3 +2132,36 @@ func (s *ObligationsSuite) Test_ListObligations_SortByUnspecifiedField_FallsBack // Falls back to default created_at DESC ordering assertIDsInOrder(s.T(), listRsp, func(o *policy.Obligation) string { return o.GetId() }, ids[2], ids[1], ids[0]) } + +// Sort test helpers + +// createSortTestObligations creates 3 obligations with 5ms gaps for distinct timestamps. +// Returns the obligation IDs in creation order. +func (s *ObligationsSuite) createSortTestObligations(label string) []string { + namespaceID, _, _ := s.getNamespaceData(nsExampleCom) + const count = 3 + ids := make([]string, count) + for i := range count { + if i > 0 { + time.Sleep(5 * time.Millisecond) + } + name := fmt.Sprintf("%s-%d-%d", label, i, time.Now().UnixNano()) + obl := s.createObligation(namespaceID, name, nil) + ids[i] = obl.GetId() + } + return ids +} + +// createNamedSortTestObligations creates obligations with specific name prefixes for name/FQN sort testing. +// Returns the obligation IDs in the same order as the prefixes. +func (s *ObligationsSuite) createNamedSortTestObligations(prefixes []string) []string { + namespaceID, _, _ := s.getNamespaceData(nsExampleCom) + suffix := time.Now().UnixNano() + ids := make([]string, len(prefixes)) + for i, prefix := range prefixes { + name := fmt.Sprintf("%s-%d", prefix, suffix) + obl := s.createObligation(namespaceID, name, nil) + ids[i] = obl.GetId() + } + return ids +} From acab6a6bd41b4a581eac8cfe1d22136095d51153 Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Tue, 14 Apr 2026 09:44:53 -0400 Subject: [PATCH 13/18] clean up obligation IDs per test added deleteObligations to run after each test returns so that stale ID data is not left in the DB after a run (integration tests) --- service/integration/obligations_test.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/service/integration/obligations_test.go b/service/integration/obligations_test.go index d0e1acd656..fc420b597f 100644 --- a/service/integration/obligations_test.go +++ b/service/integration/obligations_test.go @@ -1970,6 +1970,7 @@ func (s *ObligationsSuite) assertObligationValuesSpecificTriggers(obl *policy.Ob func (s *ObligationsSuite) Test_ListObligations_SortByName_ASC() { ids := s.createNamedSortTestObligations([]string{"aaa-sort", "bbb-sort", "ccc-sort"}) + defer s.deleteObligations(ids) listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ Sort: []*obligations.ObligationsSort{ @@ -1985,6 +1986,7 @@ func (s *ObligationsSuite) Test_ListObligations_SortByName_ASC() { func (s *ObligationsSuite) Test_ListObligations_SortByName_DESC() { ids := s.createNamedSortTestObligations([]string{"aaa-sortdesc", "bbb-sortdesc", "ccc-sortdesc"}) + defer s.deleteObligations(ids) listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ Sort: []*obligations.ObligationsSort{ @@ -2002,6 +2004,7 @@ func (s *ObligationsSuite) Test_ListObligations_SortByName_DESC() { func (s *ObligationsSuite) Test_ListObligations_SortByFqn_ASC() { ids := s.createNamedSortTestObligations([]string{"aaa-fqnsort", "bbb-fqnsort", "ccc-fqnsort"}) + defer s.deleteObligations(ids) listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ Sort: []*obligations.ObligationsSort{ @@ -2017,6 +2020,7 @@ func (s *ObligationsSuite) Test_ListObligations_SortByFqn_ASC() { func (s *ObligationsSuite) Test_ListObligations_SortByFqn_DESC() { ids := s.createNamedSortTestObligations([]string{"aaa-fqnsortdesc", "bbb-fqnsortdesc", "ccc-fqnsortdesc"}) + defer s.deleteObligations(ids) listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ Sort: []*obligations.ObligationsSort{ @@ -2034,6 +2038,7 @@ func (s *ObligationsSuite) Test_ListObligations_SortByFqn_DESC() { func (s *ObligationsSuite) Test_ListObligations_SortByCreatedAt_ASC() { ids := s.createSortTestObligations("createdasc-obl") + defer s.deleteObligations(ids) listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ Sort: []*obligations.ObligationsSort{ @@ -2049,6 +2054,7 @@ func (s *ObligationsSuite) Test_ListObligations_SortByCreatedAt_ASC() { func (s *ObligationsSuite) Test_ListObligations_SortByCreatedAt_DESC() { ids := s.createSortTestObligations("createddesc-obl") + defer s.deleteObligations(ids) listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ Sort: []*obligations.ObligationsSort{ @@ -2066,6 +2072,7 @@ func (s *ObligationsSuite) Test_ListObligations_SortByCreatedAt_DESC() { func (s *ObligationsSuite) Test_ListObligations_SortByUpdatedAt_DESC() { ids := s.createSortTestObligations("upd-sort-obl") + defer s.deleteObligations(ids) // Update the first obligation so its updated_at is the most recent time.Sleep(5 * time.Millisecond) @@ -2092,6 +2099,7 @@ func (s *ObligationsSuite) Test_ListObligations_SortByUpdatedAt_DESC() { func (s *ObligationsSuite) Test_ListObligations_SortByUpdatedAt_ASC() { ids := s.createSortTestObligations("upd-sort-asc-obl") + defer s.deleteObligations(ids) // Update the last obligation so its updated_at is the most recent time.Sleep(5 * time.Millisecond) @@ -2120,6 +2128,7 @@ func (s *ObligationsSuite) Test_ListObligations_SortByUpdatedAt_ASC() { func (s *ObligationsSuite) Test_ListObligations_SortByUnspecifiedField_FallsBackToDefault() { ids := s.createSortTestObligations("unspecified-sort-obl") + defer s.deleteObligations(ids) listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ Sort: []*obligations.ObligationsSort{ From 3cd4a6308bc3a31007f1454bb3e0e3122b8e0c43 Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Tue, 14 Apr 2026 12:32:27 -0400 Subject: [PATCH 14/18] improve fqn integration tests now FQNs are built using multiple namespaces (example.net vs example.com) AND different obl names. this proves two things: the sorting properly sorts full FQNs, not just obl names (as before), and second, obl name properly works as a tiebreaker within the same namespace. since this sorting case is fully deterministic there is no need for sql level tiebreaker however that is still needed in other sort cases like time based. --- service/integration/obligations_test.go | 32 ++++++++++++++++++------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/service/integration/obligations_test.go b/service/integration/obligations_test.go index fc420b597f..d2afecaee6 100644 --- a/service/integration/obligations_test.go +++ b/service/integration/obligations_test.go @@ -2003,8 +2003,18 @@ func (s *ObligationsSuite) Test_ListObligations_SortByName_DESC() { // Sort by FQN func (s *ObligationsSuite) Test_ListObligations_SortByFqn_ASC() { - ids := s.createNamedSortTestObligations([]string{"aaa-fqnsort", "bbb-fqnsort", "ccc-fqnsort"}) - defer s.deleteObligations(ids) + // Create obligations across two namespaces to prove FQN sort uses the full + // constructed FQN (namespace_fqn/obl/name), not just the name. + // "example.com" < "example.net" lexicographically, so even zzz in example.com + // sorts before aaa in example.net. Within example.com, name breaks the tie. + comID, _, _ := s.getNamespaceData(nsExampleCom) + netID, _, _ := s.getNamespaceData(nsExampleNet) + suffix := fmt.Sprintf("fqnasc-%d", time.Now().UnixNano()) + + oblComAAA := s.createObligation(comID, "aaa-"+suffix, nil) + oblComZZZ := s.createObligation(comID, "zzz-"+suffix, nil) + oblNetAAA := s.createObligation(netID, "aaa-"+suffix, nil) + defer s.deleteObligations([]string{oblComAAA.GetId(), oblComZZZ.GetId(), oblNetAAA.GetId()}) listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ Sort: []*obligations.ObligationsSort{ @@ -2014,13 +2024,19 @@ func (s *ObligationsSuite) Test_ListObligations_SortByFqn_ASC() { s.Require().NoError(err) s.NotNil(listRsp) - // FQN is namespace_fqn/obl/name, so aaa < bbb < ccc in ASC order - assertIDsInOrder(s.T(), listRsp, func(o *policy.Obligation) string { return o.GetId() }, ids[0], ids[1], ids[2]) + // example.com/obl/aaa < example.com/obl/zzz < example.net/obl/aaa + assertIDsInOrder(s.T(), listRsp, func(o *policy.Obligation) string { return o.GetId() }, oblComAAA.GetId(), oblComZZZ.GetId(), oblNetAAA.GetId()) } func (s *ObligationsSuite) Test_ListObligations_SortByFqn_DESC() { - ids := s.createNamedSortTestObligations([]string{"aaa-fqnsortdesc", "bbb-fqnsortdesc", "ccc-fqnsortdesc"}) - defer s.deleteObligations(ids) + comID, _, _ := s.getNamespaceData(nsExampleCom) + netID, _, _ := s.getNamespaceData(nsExampleNet) + suffix := fmt.Sprintf("fqndesc-%d", time.Now().UnixNano()) + + oblComAAA := s.createObligation(comID, "aaa-"+suffix, nil) + oblComZZZ := s.createObligation(comID, "zzz-"+suffix, nil) + oblNetAAA := s.createObligation(netID, "aaa-"+suffix, nil) + defer s.deleteObligations([]string{oblComAAA.GetId(), oblComZZZ.GetId(), oblNetAAA.GetId()}) listRsp, _, err := s.db.PolicyClient.ListObligations(s.ctx, &obligations.ListObligationsRequest{ Sort: []*obligations.ObligationsSort{ @@ -2030,8 +2046,8 @@ func (s *ObligationsSuite) Test_ListObligations_SortByFqn_DESC() { s.Require().NoError(err) s.NotNil(listRsp) - // ccc > bbb > aaa in DESC order - assertIDsInOrder(s.T(), listRsp, func(o *policy.Obligation) string { return o.GetId() }, ids[2], ids[1], ids[0]) + // example.net/obl/aaa > example.com/obl/zzz > example.com/obl/aaa + assertIDsInOrder(s.T(), listRsp, func(o *policy.Obligation) string { return o.GetId() }, oblNetAAA.GetId(), oblComZZZ.GetId(), oblComAAA.GetId()) } // Sort by CreatedAt From 29f62564030c0b367d4964655d4af8c68640b015 Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Tue, 14 Apr 2026 13:00:38 -0400 Subject: [PATCH 15/18] fix: restore closing braces dropped during merge conflict resolution Signed-off-by: Diego <74568547+dsm20@users.noreply.github.com> --- service/policy/db/utils_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/service/policy/db/utils_test.go b/service/policy/db/utils_test.go index de3a2c7429..7f25e6a5e6 100644 --- a/service/policy/db/utils_test.go +++ b/service/policy/db/utils_test.go @@ -706,6 +706,10 @@ func Test_GetObligationsSortParams(t *testing.T) { field, dir := GetObligationsSortParams(tc.sort) assert.Equal(t, tc.expectedField, field) assert.Equal(t, tc.expectedDir, dir) + }) + } +} + func Test_GetKeyAccessServersSortParams(t *testing.T) { tests := []struct { name string From 72352507892f28e2a67ab49654d8163c28112d55 Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Wed, 15 Apr 2026 10:44:29 -0400 Subject: [PATCH 16/18] add desc fqn test --- service/policy/db/utils_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/service/policy/db/utils_test.go b/service/policy/db/utils_test.go index 7f25e6a5e6..6d7c790d2f 100644 --- a/service/policy/db/utils_test.go +++ b/service/policy/db/utils_test.go @@ -659,6 +659,14 @@ func Test_GetObligationsSortParams(t *testing.T) { expectedField: "fqn", expectedDir: "ASC", }, + { + name: "FQN with DESC", + sort: []*obligations.ObligationsSort{ + {Field: obligations.SortObligationsType_SORT_OBLIGATIONS_TYPE_FQN, Direction: policy.SortDirection_SORT_DIRECTION_DESC}, + }, + expectedField: "fqn", + expectedDir: "DESC", + }, { name: "FQN with unspecified direction defaults to ASC", sort: []*obligations.ObligationsSort{ From f9cbf883e200ab7dda7f1b9bc2a5337001cd7e93 Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Wed, 15 Apr 2026 12:03:16 -0400 Subject: [PATCH 17/18] alter FQN building now FQN is simply namespace + obligation name, instead of adding in the arbitrary "/obl/". this is for futureproofing in the event we decide to rename the FQN to some other structure where /obl/ becomes antiquated --- service/policy/db/queries/obligations.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/service/policy/db/queries/obligations.sql b/service/policy/db/queries/obligations.sql index d0002e4a24..cab5731e68 100644 --- a/service/policy/db/queries/obligations.sql +++ b/service/policy/db/queries/obligations.sql @@ -190,8 +190,8 @@ GROUP BY od.id, n.id, fqns.fqn, counted.total ORDER BY CASE WHEN @sort_field::text = 'name' AND @sort_direction::text = 'ASC' THEN od.name END ASC, CASE WHEN @sort_field::text = 'name' AND @sort_direction::text = 'DESC' THEN od.name END DESC, - CASE WHEN @sort_field::text = 'fqn' AND @sort_direction::text = 'ASC' THEN fqns.fqn || '/obl/' || LOWER(od.name) END ASC, - CASE WHEN @sort_field::text = 'fqn' AND @sort_direction::text = 'DESC' THEN fqns.fqn || '/obl/' || LOWER(od.name) END DESC, + CASE WHEN @sort_field::text = 'fqn' AND @sort_direction::text = 'ASC' THEN fqns.fqn || LOWER(od.name) END ASC, + CASE WHEN @sort_field::text = 'fqn' AND @sort_direction::text = 'DESC' THEN fqns.fqn || LOWER(od.name) END DESC, CASE WHEN @sort_field::text = 'created_at' AND @sort_direction::text = 'ASC' THEN od.created_at END ASC, CASE WHEN @sort_field::text = 'created_at' AND @sort_direction::text = 'DESC' THEN od.created_at END DESC, CASE WHEN @sort_field::text = 'updated_at' AND @sort_direction::text = 'ASC' THEN od.updated_at END ASC, From 0812edce83cb485de2b6316e79f2d4daff184919 Mon Sep 17 00:00:00 2001 From: Diego <74568547+dsm20@users.noreply.github.com> Date: Wed, 15 Apr 2026 12:17:14 -0400 Subject: [PATCH 18/18] regeneraterated sequel --- service/policy/db/obligations.sql.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/service/policy/db/obligations.sql.go b/service/policy/db/obligations.sql.go index f5d6db6ac3..ee23b5f4da 100644 --- a/service/policy/db/obligations.sql.go +++ b/service/policy/db/obligations.sql.go @@ -1525,8 +1525,8 @@ GROUP BY od.id, n.id, fqns.fqn, counted.total ORDER BY CASE WHEN $3::text = 'name' AND $4::text = 'ASC' THEN od.name END ASC, CASE WHEN $3::text = 'name' AND $4::text = 'DESC' THEN od.name END DESC, - CASE WHEN $3::text = 'fqn' AND $4::text = 'ASC' THEN fqns.fqn || '/obl/' || LOWER(od.name) END ASC, - CASE WHEN $3::text = 'fqn' AND $4::text = 'DESC' THEN fqns.fqn || '/obl/' || LOWER(od.name) END DESC, + CASE WHEN $3::text = 'fqn' AND $4::text = 'ASC' THEN fqns.fqn || LOWER(od.name) END ASC, + CASE WHEN $3::text = 'fqn' AND $4::text = 'DESC' THEN fqns.fqn || LOWER(od.name) END DESC, CASE WHEN $3::text = 'created_at' AND $4::text = 'ASC' THEN od.created_at END ASC, CASE WHEN $3::text = 'created_at' AND $4::text = 'DESC' THEN od.created_at END DESC, CASE WHEN $3::text = 'updated_at' AND $4::text = 'ASC' THEN od.updated_at END ASC, @@ -1628,8 +1628,8 @@ type listObligationsRow struct { // ORDER BY // CASE WHEN $3::text = 'name' AND $4::text = 'ASC' THEN od.name END ASC, // CASE WHEN $3::text = 'name' AND $4::text = 'DESC' THEN od.name END DESC, -// CASE WHEN $3::text = 'fqn' AND $4::text = 'ASC' THEN fqns.fqn || '/obl/' || LOWER(od.name) END ASC, -// CASE WHEN $3::text = 'fqn' AND $4::text = 'DESC' THEN fqns.fqn || '/obl/' || LOWER(od.name) END DESC, +// CASE WHEN $3::text = 'fqn' AND $4::text = 'ASC' THEN fqns.fqn || LOWER(od.name) END ASC, +// CASE WHEN $3::text = 'fqn' AND $4::text = 'DESC' THEN fqns.fqn || LOWER(od.name) END DESC, // CASE WHEN $3::text = 'created_at' AND $4::text = 'ASC' THEN od.created_at END ASC, // CASE WHEN $3::text = 'created_at' AND $4::text = 'DESC' THEN od.created_at END DESC, // CASE WHEN $3::text = 'updated_at' AND $4::text = 'ASC' THEN od.updated_at END ASC,