diff --git a/api/policies/custom.go b/api/policies/custom.go new file mode 100644 index 0000000000..33565501bc --- /dev/null +++ b/api/policies/custom.go @@ -0,0 +1,201 @@ +package policies + +const ( + attributesField = "attributes" + deleteAfterField = "delete_after" + retainForField = "retain_for" + daysField = "days" + overridableField = "overridable" +) + +func WithStoragePolicyDeleteAfter(inDeleteAfter map[string]any) Option { + return func(o *options) { + raw, ok := o.postMap[attributesField] + if !ok { + raw = interface{}(map[string]interface{}{}) + } + val := raw.(map[string]interface{}) + val[deleteAfterField] = inDeleteAfter + o.postMap[attributesField] = val + } +} + +func DefaultStoragePolicyDeleteAfter() Option { + return func(o *options) { + raw, ok := o.postMap[attributesField] + if !ok { + raw = interface{}(map[string]interface{}{}) + } + val := raw.(map[string]interface{}) + val[deleteAfterField] = nil + o.postMap[attributesField] = val + } +} + +func WithStoragePolicyDeleteAfterDays(inDays int32) Option { + return func(o *options) { + raw, ok := o.postMap[attributesField] + if !ok { + raw = interface{}(map[string]any{}) + } + val := raw.(map[string]any) + rawDeleteAfter, ok := val[deleteAfterField] + if !ok { + rawDeleteAfter = interface{}(map[string]any{}) + } + deleteAfter := rawDeleteAfter.(map[string]any) + deleteAfter[daysField] = inDays + val[deleteAfterField] = deleteAfter + o.postMap[attributesField] = val + } +} + +func DefaultStoragePolicyDeleteAfterDays() Option { + return func(o *options) { + raw, ok := o.postMap[attributesField] + if !ok { + raw = interface{}(map[string]any{}) + } + val := raw.(map[string]any) + rawDeleteAfter, ok := val[deleteAfterField] + if !ok { + rawDeleteAfter = interface{}(map[string]any{}) + } + deleteAfter := rawDeleteAfter.(map[string]any) + deleteAfter[daysField] = 0 + val[deleteAfterField] = deleteAfter + o.postMap[attributesField] = val + } +} + +func WithStoragePolicyDeleteAfterOverridable(inOverridable bool) Option { + return func(o *options) { + raw, ok := o.postMap[attributesField] + if !ok { + raw = interface{}(map[string]any{}) + } + val := raw.(map[string]any) + rawDeleteAfter, ok := val[deleteAfterField] + if !ok { + rawDeleteAfter = interface{}(map[string]any{}) + } + deleteAfter := rawDeleteAfter.(map[string]any) + deleteAfter[overridableField] = inOverridable + val[deleteAfterField] = deleteAfter + o.postMap[attributesField] = val + } +} + +func DefaultStoragePolicyDeleteAfterOverridable() Option { + return func(o *options) { + raw, ok := o.postMap[attributesField] + if !ok { + raw = interface{}(map[string]any{}) + } + val := raw.(map[string]any) + rawDeleteAfter, ok := val[deleteAfterField] + if !ok { + rawDeleteAfter = interface{}(map[string]any{}) + } + deleteAfter := rawDeleteAfter.(map[string]any) + deleteAfter[overridableField] = false + val[deleteAfterField] = deleteAfter + o.postMap[attributesField] = val + } +} + +func WithStoragePolicyRetainFor(inDeleteAfter map[string]any) Option { + return func(o *options) { + raw, ok := o.postMap[attributesField] + if !ok { + raw = interface{}(map[string]interface{}{}) + } + val := raw.(map[string]interface{}) + val[retainForField] = inDeleteAfter + o.postMap[attributesField] = val + } +} + +func DefaultStoragePolicyRetainFor() Option { + return func(o *options) { + raw, ok := o.postMap[attributesField] + if !ok { + raw = interface{}(map[string]interface{}{}) + } + val := raw.(map[string]interface{}) + val[retainForField] = nil + o.postMap[attributesField] = val + } +} + +func WithStoragePolicyRetainForDays(inDays int32) Option { + return func(o *options) { + raw, ok := o.postMap[attributesField] + if !ok { + raw = interface{}(map[string]any{}) + } + val := raw.(map[string]any) + rawDeleteAfter, ok := val[retainForField] + if !ok { + rawDeleteAfter = interface{}(map[string]any{}) + } + deleteAfter := rawDeleteAfter.(map[string]any) + deleteAfter[daysField] = inDays + val[retainForField] = deleteAfter + o.postMap[attributesField] = val + } +} + +func DefaultStoragePolicyRetainForDays() Option { + return func(o *options) { + raw, ok := o.postMap[attributesField] + if !ok { + raw = interface{}(map[string]any{}) + } + val := raw.(map[string]any) + rawDeleteAfter, ok := val[retainForField] + if !ok { + rawDeleteAfter = interface{}(map[string]any{}) + } + deleteAfter := rawDeleteAfter.(map[string]any) + deleteAfter[daysField] = 0 + val[retainForField] = deleteAfter + o.postMap[attributesField] = val + } +} + +func WithStoragePolicyRetainForOverridable(inOverridable bool) Option { + return func(o *options) { + raw, ok := o.postMap[attributesField] + if !ok { + raw = interface{}(map[string]any{}) + } + val := raw.(map[string]any) + rawDeleteAfter, ok := val[retainForField] + if !ok { + rawDeleteAfter = interface{}(map[string]any{}) + } + deleteAfter := rawDeleteAfter.(map[string]any) + deleteAfter[overridableField] = inOverridable + val[retainForField] = deleteAfter + o.postMap[attributesField] = val + } +} + +func DefaultStoragePolicyRetainForOverridable() Option { + return func(o *options) { + raw, ok := o.postMap[attributesField] + if !ok { + raw = interface{}(map[string]any{}) + } + val := raw.(map[string]any) + rawDeleteAfter, ok := val[retainForField] + if !ok { + rawDeleteAfter = interface{}(map[string]any{}) + } + deleteAfter := rawDeleteAfter.(map[string]any) + deleteAfter[overridableField] = false + val[retainForField] = deleteAfter + o.postMap[attributesField] = val + } +} diff --git a/api/policies/option.gen.go b/api/policies/option.gen.go index 350af7e719..cf9e2e6351 100644 --- a/api/policies/option.gen.go +++ b/api/policies/option.gen.go @@ -115,30 +115,6 @@ func DefaultAttributes() Option { } } -func WithStoragePolicyDeleteAfter(inDeleteAfter map[string]any) Option { - return func(o *options) { - raw, ok := o.postMap["attributes"] - if !ok { - raw = interface{}(map[string]interface{}{}) - } - val := raw.(map[string]interface{}) - val["delete_after"] = inDeleteAfter - o.postMap["attributes"] = val - } -} - -func DefaultStoragePolicyDeleteAfter() Option { - return func(o *options) { - raw, ok := o.postMap["attributes"] - if !ok { - raw = interface{}(map[string]interface{}{}) - } - val := raw.(map[string]interface{}) - val["delete_after"] = nil - o.postMap["attributes"] = val - } -} - func WithDescription(inDescription string) Option { return func(o *options) { o.postMap["description"] = inDescription @@ -162,27 +138,3 @@ func DefaultName() Option { o.postMap["name"] = nil } } - -func WithStoragePolicyRetainFor(inRetainFor map[string]any) Option { - return func(o *options) { - raw, ok := o.postMap["attributes"] - if !ok { - raw = interface{}(map[string]interface{}{}) - } - val := raw.(map[string]interface{}) - val["retain_for"] = inRetainFor - o.postMap["attributes"] = val - } -} - -func DefaultStoragePolicyRetainFor() Option { - return func(o *options) { - raw, ok := o.postMap["attributes"] - if !ok { - raw = interface{}(map[string]interface{}{}) - } - val := raw.(map[string]interface{}) - val["retain_for"] = nil - o.postMap["attributes"] = val - } -} diff --git a/api/policies/storage_policy_attributes.gen.go b/api/policies/storage_policy_attributes.gen.go index d6dee8bfcc..5ab26aa70d 100644 --- a/api/policies/storage_policy_attributes.gen.go +++ b/api/policies/storage_policy_attributes.gen.go @@ -11,8 +11,8 @@ import ( ) type StoragePolicyAttributes struct { - RetainFor map[string]any `json:"retain_for,omitempty"` - DeleteAfter map[string]any `json:"delete_after,omitempty"` + RetainFor *StoragePolicyRetainFor `json:"retain_for,omitempty"` + DeleteAfter *StoragePolicyDeleteAfter `json:"delete_after,omitempty"` } func AttributesMapToStoragePolicyAttributes(in map[string]interface{}) (*StoragePolicyAttributes, error) { diff --git a/api/policies/storage_policy_delete_after.gen.go b/api/policies/storage_policy_delete_after.gen.go new file mode 100644 index 0000000000..b6e79dfac8 --- /dev/null +++ b/api/policies/storage_policy_delete_after.gen.go @@ -0,0 +1,10 @@ +// Code generated by "make api"; DO NOT EDIT. +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package policies + +type StoragePolicyDeleteAfter struct { + Days int32 `json:"days,omitempty"` + Overridable bool `json:"overridable,omitempty"` +} diff --git a/api/policies/storage_policy_retain_for.gen.go b/api/policies/storage_policy_retain_for.gen.go new file mode 100644 index 0000000000..805fe1f955 --- /dev/null +++ b/api/policies/storage_policy_retain_for.gen.go @@ -0,0 +1,10 @@ +// Code generated by "make api"; DO NOT EDIT. +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package policies + +type StoragePolicyRetainFor struct { + Days int32 `json:"days,omitempty"` + Overridable bool `json:"overridable,omitempty"` +} diff --git a/internal/api/genapi/input.go b/internal/api/genapi/input.go index 4ad71b87e3..fc8e8f3632 100644 --- a/internal/api/genapi/input.go +++ b/internal/api/genapi/input.go @@ -759,25 +759,21 @@ var inputStructs = []*structInfo{ }, // Policy-related resources. + { + inProto: &policies.StoragePolicyDeleteAfter{}, + outFile: "policies/storage_policy_delete_after.gen.go", + }, + { + inProto: &policies.StoragePolicyRetainFor{}, + outFile: "policies/storage_policy_retain_for.gen.go", + }, { inProto: &policies.StoragePolicyAttributes{}, outFile: "policies/storage_policy_attributes.gen.go", parentTypeName: "Policy", subtypeName: "StoragePolicy", subtype: "storage", - fieldOverrides: []fieldInfo{ - { - Name: "RetainFor", - ProtoName: "retain_for", - FieldType: "map[string]any", - }, - { - Name: "DeleteAfter", - ProtoName: "delete_after", - FieldType: "map[string]any", - }, - }, - templates: []*template.Template{mapstructureConversionTemplate}, + templates: []*template.Template{mapstructureConversionTemplate}, }, { inProto: &policies.Policy{}, diff --git a/internal/cmd/commands/policiescmd/storage_funcs.go b/internal/cmd/commands/policiescmd/storage_funcs.go index c6af732b12..d814901656 100644 --- a/internal/cmd/commands/policiescmd/storage_funcs.go +++ b/internal/cmd/commands/policiescmd/storage_funcs.go @@ -95,73 +95,54 @@ func extraStorageFlagsFuncImpl(c *StorageCommand, set *base.FlagSets, _ *base.Fl } func extraStorageFlagsHandlingFuncImpl(c *StorageCommand, _ *base.FlagSets, opts *[]policies.Option) bool { - rf := map[string]any{} - da := map[string]any{} - - var withRetainFor, withDeleteAfter bool switch c.flagRetainForDays { case "": case "null": - rf["days"] = nil - withRetainFor = true + *opts = append(*opts, policies.DefaultStoragePolicyRetainForDays()) default: - days, err := strconv.ParseInt(c.flagRetainForDays, 10, 64) + days, err := strconv.ParseInt(c.flagRetainForDays, 10, 32) if err != nil { c.UI.Error(fmt.Sprintf("Error parsing %q: %s", c.flagRetainForDays, err)) return false } - rf["days"] = days - withRetainFor = true + *opts = append(*opts, policies.WithStoragePolicyRetainForDays(int32(days))) } switch c.flagRetainForOverridable { case "": case "null": - rf["overridable"] = nil - withRetainFor = true + *opts = append(*opts, policies.DefaultStoragePolicyRetainForOverridable()) default: overridable, err := strconv.ParseBool(c.flagRetainForOverridable) if err != nil { c.UI.Error(fmt.Sprintf("Error parsing %q: %s", c.flagRetainForOverridable, err)) return false } - rf["overridable"] = overridable - withRetainFor = true + *opts = append(*opts, policies.WithStoragePolicyRetainForOverridable(overridable)) } switch c.flagDeleteAfterDays { case "": case "null": - da["days"] = nil - withDeleteAfter = true + *opts = append(*opts, policies.DefaultStoragePolicyDeleteAfterDays()) default: - days, err := strconv.ParseInt(c.flagDeleteAfterDays, 10, 64) + days, err := strconv.ParseInt(c.flagDeleteAfterDays, 10, 32) if err != nil { c.UI.Error(fmt.Sprintf("Error parsing %q: %s", c.flagDeleteAfterDays, err)) return false } - da["days"] = days - withDeleteAfter = true + *opts = append(*opts, policies.WithStoragePolicyDeleteAfterDays(int32(days))) } switch c.flagDeleteAfterOverridable { case "": case "null": - da["overridable"] = nil - withDeleteAfter = true + *opts = append(*opts, policies.DefaultStoragePolicyDeleteAfterOverridable()) default: overridable, err := strconv.ParseBool(c.flagDeleteAfterOverridable) if err != nil { c.UI.Error(fmt.Sprintf("Error parsing %q: %s", c.flagDeleteAfterOverridable, err)) return false } - da["overridable"] = overridable - withDeleteAfter = true - } - - if withRetainFor { - *opts = append(*opts, policies.WithStoragePolicyRetainFor(rf)) - } - if withDeleteAfter { - *opts = append(*opts, policies.WithStoragePolicyDeleteAfter(da)) + *opts = append(*opts, policies.WithStoragePolicyDeleteAfterOverridable(overridable)) } return true diff --git a/internal/proto/controller/api/resources/policies/v1/policy.proto b/internal/proto/controller/api/resources/policies/v1/policy.proto index 6d15561d57..0e108aaf71 100644 --- a/internal/proto/controller/api/resources/policies/v1/policy.proto +++ b/internal/proto/controller/api/resources/policies/v1/policy.proto @@ -75,14 +75,8 @@ message Policy { } message StoragePolicyAttributes { - StoragePolicyRetainFor retain_for = 10 [ - json_name = "retain_for", - (custom_options.v1.generate_sdk_option) = true - ]; - StoragePolicyDeleteAfter delete_after = 20 [ - json_name = "delete_after", - (custom_options.v1.generate_sdk_option) = true - ]; + StoragePolicyRetainFor retain_for = 10 [json_name = "retain_for"]; + StoragePolicyDeleteAfter delete_after = 20 [json_name = "delete_after"]; } message StoragePolicyRetainFor { diff --git a/sdk/pbs/controller/api/resources/policies/policy.pb.go b/sdk/pbs/controller/api/resources/policies/policy.pb.go index 35200f84bf..c18add4948 100644 --- a/sdk/pbs/controller/api/resources/policies/policy.pb.go +++ b/sdk/pbs/controller/api/resources/policies/policy.pb.go @@ -447,56 +447,56 @@ var file_controller_api_resources_policies_v1_policy_proto_rawDesc = []byte{ 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x12, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xac, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x22, 0xe7, 0x01, 0x0a, + 0x6f, 0x6e, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x74, 0x74, 0x72, 0x73, 0x22, 0xdb, 0x01, 0x0a, 0x17, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x41, 0x74, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x62, 0x0a, 0x0a, 0x72, 0x65, 0x74, 0x61, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x5c, 0x0a, 0x0a, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x46, 0x6f, 0x72, 0x42, 0x04, 0xa0, 0xda, 0x29, 0x01, - 0x52, 0x0a, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x12, 0x68, 0x0a, 0x0c, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x14, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x66, 0x74, - 0x65, 0x72, 0x42, 0x04, 0xa0, 0xda, 0x29, 0x01, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0xde, 0x01, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x46, 0x6f, - 0x72, 0x12, 0x43, 0x0a, 0x04, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x42, - 0x2f, 0xc2, 0xdd, 0x29, 0x2b, 0x0a, 0x1a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, - 0x73, 0x2e, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x2e, 0x64, 0x61, 0x79, - 0x73, 0x12, 0x0d, 0x52, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x46, 0x6f, 0x72, 0x44, 0x61, 0x79, 0x73, - 0x52, 0x04, 0x64, 0x61, 0x79, 0x73, 0x12, 0x7f, 0x0a, 0x0b, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, - 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, - 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x41, 0xc2, 0xdd, 0x29, 0x3d, 0x0a, 0x21, 0x61, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, - 0x5f, 0x66, 0x6f, 0x72, 0x2e, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x18, 0x52, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x46, 0x6f, 0x72, 0x44, 0x61, 0x79, 0x73, 0x4f, + 0x79, 0x52, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x46, 0x6f, 0x72, 0x52, 0x0a, 0x72, 0x65, 0x74, 0x61, + 0x69, 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x12, 0x62, 0x0a, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x52, 0x0c, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0xde, 0x01, 0x0a, 0x16, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x65, 0x74, 0x61, + 0x69, 0x6e, 0x46, 0x6f, 0x72, 0x12, 0x43, 0x0a, 0x04, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x05, 0x42, 0x2f, 0xc2, 0xdd, 0x29, 0x2b, 0x0a, 0x1a, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x72, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x6f, 0x72, + 0x2e, 0x64, 0x61, 0x79, 0x73, 0x12, 0x0d, 0x52, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x46, 0x6f, 0x72, + 0x44, 0x61, 0x79, 0x73, 0x52, 0x04, 0x64, 0x61, 0x79, 0x73, 0x12, 0x7f, 0x0a, 0x0b, 0x6f, 0x76, + 0x65, 0x72, 0x72, 0x69, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x41, 0xc2, 0xdd, 0x29, + 0x3d, 0x0a, 0x21, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x72, 0x65, + 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x2e, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x52, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x46, 0x6f, 0x72, 0x44, + 0x61, 0x79, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x0b, + 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x22, 0xe9, 0x01, 0x0a, 0x18, + 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x04, 0x64, 0x61, 0x79, 0x73, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x42, 0x33, 0xc2, 0xdd, 0x29, 0x2f, 0x0a, 0x1c, 0x61, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, + 0x61, 0x66, 0x74, 0x65, 0x72, 0x2e, 0x64, 0x61, 0x79, 0x73, 0x12, 0x0f, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x44, 0x61, 0x79, 0x73, 0x52, 0x04, 0x64, 0x61, 0x79, + 0x73, 0x12, 0x83, 0x01, 0x0a, 0x0b, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x42, 0x45, 0xc2, 0xdd, 0x29, 0x41, 0x0a, 0x23, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x61, 0x66, 0x74, + 0x65, 0x72, 0x2e, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x44, 0x61, 0x79, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x0b, 0x6f, 0x76, 0x65, 0x72, - 0x72, 0x69, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x22, 0xe9, 0x01, 0x0a, 0x18, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, - 0x66, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x04, 0x64, 0x61, 0x79, 0x73, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x05, 0x42, 0x33, 0xc2, 0xdd, 0x29, 0x2f, 0x0a, 0x1c, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x73, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, - 0x72, 0x2e, 0x64, 0x61, 0x79, 0x73, 0x12, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x66, - 0x74, 0x65, 0x72, 0x44, 0x61, 0x79, 0x73, 0x52, 0x04, 0x64, 0x61, 0x79, 0x73, 0x12, 0x83, 0x01, - 0x0a, 0x0b, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x14, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, - 0x45, 0xc2, 0xdd, 0x29, 0x41, 0x0a, 0x23, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, - 0x73, 0x2e, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x2e, 0x6f, - 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x44, 0x61, 0x79, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x72, - 0x69, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x0b, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x61, - 0x62, 0x6c, 0x65, 0x42, 0x52, 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x61, 0x72, 0x79, 0x2f, 0x73, 0x64, 0x6b, 0x2f, 0x70, 0x62, 0x73, 0x2f, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x3b, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x69, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x52, 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x2f, 0x73, 0x64, 0x6b, 0x2f, 0x70, 0x62, 0x73, + 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, + 0x65, 0x73, 0x3b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var (