From 4bd0aed0a770d3ea8f5f73923a07f38b827fb1df Mon Sep 17 00:00:00 2001 From: "Terry L. Blessing" <3756245+tlblessing@users.noreply.github.com> Date: Wed, 17 Apr 2024 12:14:29 -0500 Subject: [PATCH 001/161] Update index.mdx Minor style edits to Managing Plugins overview --- website/docs/cli/plugins/index.mdx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/website/docs/cli/plugins/index.mdx b/website/docs/cli/plugins/index.mdx index 97f6182422..4ba8c20f41 100644 --- a/website/docs/cli/plugins/index.mdx +++ b/website/docs/cli/plugins/index.mdx @@ -7,24 +7,24 @@ description: >- # Managing Plugins -Terraform relies on plugins called "providers" in order to manage various types -of resources. (For more information about providers, see +Terraform relies on plugins called providers to manage various types +of resources. For more information about providers, see [Providers](/terraform/language/providers) in the Terraform -language docs.) +language docs. -> **Note:** Providers are the only plugin type most Terraform users interact with. Terraform also supports third-party provisioner plugins, but we discourage their use. -Terraform downloads and/or installs any providers +Terraform downloads or installs any providers [required](/terraform/language/providers/requirements) by a configuration when [initializing](/terraform/cli/init) a working directory. By default, this works without any additional interaction but requires network access to download providers from their source registry. You can configure Terraform's provider installation behavior to limit or skip -network access, and to enable use of providers that aren't available via a +network access, and to enable use of providers that aren't available through a networked source. Terraform also includes some commands to show information -about providers and to reduce the effort of installing providers in airgapped +about providers and to reduce the effort of installing providers in air-gapped environments. ## Configuring Plugin Installation @@ -50,9 +50,9 @@ offered by each provider. Use the [`terraform providers mirror`](/terraform/cli/commands/providers/mirror) command to download local copies of every provider required by the current working -directory's configuration. This directory will use the nested directory layout +directory's configuration. The directory uses the nested directory layout that Terraform expects when installing plugins from a local source, so you can -transfer it directly to an airgapped system that runs Terraform. +transfer it directly to an air-gapped system that runs Terraform. Use the [`terraform providers lock`](/terraform/cli/commands/providers/lock) command to update the lock file that Terraform uses to ensure predictable runs when From 5a7f0a1ab69822a918b677fc7a4e458ffc41a124 Mon Sep 17 00:00:00 2001 From: "Terry L. Blessing" <3756245+tlblessing@users.noreply.github.com> Date: Thu, 25 Apr 2024 10:05:03 -0500 Subject: [PATCH 002/161] Update website/docs/cli/plugins/index.mdx Co-authored-by: Rose M Koron <32436232+rkoron007@users.noreply.github.com> --- website/docs/cli/plugins/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/cli/plugins/index.mdx b/website/docs/cli/plugins/index.mdx index 4ba8c20f41..f125655827 100644 --- a/website/docs/cli/plugins/index.mdx +++ b/website/docs/cli/plugins/index.mdx @@ -8,7 +8,7 @@ description: >- # Managing Plugins Terraform relies on plugins called providers to manage various types -of resources. For more information about providers, see +of resources. For more information about providers, refer to [Providers](/terraform/language/providers) in the Terraform language docs. From 1b4ef650ec366fffda94b74d83b9c5be73f4bac6 Mon Sep 17 00:00:00 2001 From: "Terry L. Blessing" <3756245+tlblessing@users.noreply.github.com> Date: Thu, 25 Apr 2024 10:19:38 -0500 Subject: [PATCH 003/161] Update index.mdx Reviewer feedback inc. --- website/docs/cli/plugins/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/cli/plugins/index.mdx b/website/docs/cli/plugins/index.mdx index f125655827..67f6db2fb4 100644 --- a/website/docs/cli/plugins/index.mdx +++ b/website/docs/cli/plugins/index.mdx @@ -15,7 +15,7 @@ language docs. -> **Note:** Providers are the only plugin type most Terraform users interact with. Terraform also supports third-party provisioner plugins, but we discourage their use. -Terraform downloads or installs any providers +Terraform installs any providers [required](/terraform/language/providers/requirements) by a configuration when [initializing](/terraform/cli/init) a working directory. By default, this works without any additional interaction but requires network access to From 660ff86c4cccf5528f23adcd9e2a1936ea4af67a Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Fri, 19 Apr 2024 10:36:36 -0700 Subject: [PATCH 004/161] backendbase: Preserve unset arguments as null when not set by env Previously we tried a simplification where any attribute with an "SDK-like default" was guaranteed to never be null, because that seemed like a plausible mimic of the legacy SDK's general aversion to nulls. However, the SDK does still respect the absense of an argument as different to its zero value in one narrow case: when the argument isn't set in the configuration, also isn't set by any environment variables, and has no static fallback default. In that case, the SDK's built-in validation rules such as "ConflictsWith" _do_ treat absent as different from zero-value. To allow backends to continue making such distinctions themselves where that's useful, SDKLikeDefaults now leaves an attribute set to null if it wasn't present in the configuration and none of the environment variables or fallback value cause it to end up being a non-empty string. The backend can then choose to bypass the SDKLikeData API and check the cty.Value directly if it wants to distinguish set from zero even though SDKLikeData is designed to avoid the need to do that. This also updates the gcs backend to make use of the new facility, since it wants to raise an error if two arguments are both set even if they are both set to the empty string. Restoring that original error case is the main motivation for this change. --- internal/backend/backendbase/base.go | 8 +-- internal/backend/backendbase/sdklike.go | 12 +++++ internal/backend/backendbase/sdklike_test.go | 2 +- internal/backend/remote-state/gcs/backend.go | 13 +++++ .../backend/remote-state/gcs/backend_test.go | 51 +++++++++++++++++++ 5 files changed, 82 insertions(+), 4 deletions(-) diff --git a/internal/backend/backendbase/base.go b/internal/backend/backendbase/base.go index 54d15d8b19..98890d2a17 100644 --- a/internal/backend/backendbase/base.go +++ b/internal/backend/backendbase/base.go @@ -38,9 +38,11 @@ type Base struct { // primitive-typed toplevel attribute in Schema, and PrepareConfig will // arrange for the default values to be inserted before it returns. // - // In particular, note that any attribute with an entry in this definition - // is guaranteed to never be null, since PrepareConfig will replace any - // nulls with an SDK-like "zero value". + // As a special case, if the value in the configuration is unset (null), + // none of the environment variables are non-empty, and the fallback + // value is empty, then the attribute value will be left as null in the + // object returned by PrepareConfig. In all other situations an attribute + // specified here is definitely not null. SDKLikeDefaults SDKLikeDefaults } diff --git a/internal/backend/backendbase/sdklike.go b/internal/backend/backendbase/sdklike.go index 74c8afef61..9d53cbf6b5 100644 --- a/internal/backend/backendbase/sdklike.go +++ b/internal/backend/backendbase/sdklike.go @@ -227,6 +227,18 @@ func (d SDKLikeDefaults) ApplyTo(base cty.Value) (cty.Value, error) { return cty.NilVal, fmt.Errorf("argument %q is required", attrName) } + // As a special case, if we still have an empty string and the original + // value was null then we'll preserve the null. This is a compromise, + // assuming that SDKLikeData knows how to treat a null value as a + // zero value anyway and if we preserve the null then the recipient + // of this result can still use the cty.Value result directly to + // distinguish between the value being set explicitly to empty in + // the config vs. being entirely unset. + if rawStr == "" && givenVal.IsNull() { + retAttrs[attrName] = givenVal + continue + } + // By the time we get here, rawStr should be empty only if the original // value was unset and all of the fallback environment variables were // also unset. Otherwise, rawStr contains a string representation of diff --git a/internal/backend/backendbase/sdklike_test.go b/internal/backend/backendbase/sdklike_test.go index 618a69ce2a..bca3b8a4eb 100644 --- a/internal/backend/backendbase/sdklike_test.go +++ b/internal/backend/backendbase/sdklike_test.go @@ -269,7 +269,7 @@ func TestSDKLikeApplyEnvDefaults(t *testing.T) { "string_env_empty": cty.StringVal("beep from environment"), "string_env_unsetfirst": cty.StringVal("beep from environment"), "string_env_unsetsecond": cty.StringVal("beep from environment"), - "string_nothing_null": cty.StringVal(""), + "string_nothing_null": cty.NullVal(cty.String), "string_nothing_empty": cty.StringVal(""), "passthru": cty.EmptyObjectVal, }) diff --git a/internal/backend/remote-state/gcs/backend.go b/internal/backend/remote-state/gcs/backend.go index f22b80805f..fb2c24a90d 100644 --- a/internal/backend/remote-state/gcs/backend.go +++ b/internal/backend/remote-state/gcs/backend.go @@ -148,6 +148,19 @@ func (b *Backend) Configure(configVal cty.Value) tfdiags.Diagnostics { fmt.Errorf("can't set both encryption_key and kms_encryption_key"), ) } + // The above catches the main case where both of the arguments are set to + // a non-empty value, but we also want to reject the situation where + // both are present in the configuration regardless of what values were + // assigned to them. (This check doesn't take the environment variables + // into account, so must allow neither to be set in the main configuration.) + if !(configVal.GetAttr("encryption_key").IsNull() || configVal.GetAttr("kms_encryption_key").IsNull()) { + // This rejects a configuration like: + // encryption_key = "" + // kms_encryption_key = "" + return backendbase.ErrorAsDiagnostics( + fmt.Errorf("can't set both encryption_key and kms_encryption_key"), + ) + } b.bucketName = data.String("bucket") b.prefix = strings.TrimLeft(data.String("prefix"), "/") diff --git a/internal/backend/remote-state/gcs/backend_test.go b/internal/backend/remote-state/gcs/backend_test.go index bcf2c0f591..cb240e5848 100644 --- a/internal/backend/remote-state/gcs/backend_test.go +++ b/internal/backend/remote-state/gcs/backend_test.go @@ -18,6 +18,7 @@ import ( "github.com/hashicorp/terraform/internal/backend" "github.com/hashicorp/terraform/internal/httpclient" "github.com/hashicorp/terraform/internal/states/remote" + "github.com/zclconf/go-cty/cty" "google.golang.org/api/option" kmspb "google.golang.org/genproto/googleapis/cloud/kms/v1" ) @@ -211,6 +212,56 @@ func TestBackendWithCustomerManagedKMSEncryption(t *testing.T) { backend.TestBackendStateLocks(t, be0, be1) } +func TestBackendEncryptionKeyEmptyConflict(t *testing.T) { + // This test is for the edge case where encryption_key and + // kms_encryption_key are both set in the configuration but set to empty + // strings. The "SDK-like" helpers treat unset as empty string, so + // we need an extra rule to catch them both being set to empty string + // directly inside the configuration, and this test covers that + // special case. + // + // The following assumes that the validation check we're testing will, if + // failing, always block attempts to reach any real GCP services, and so + // this test should be fine to run without an acceptance testing opt-in. + + // This test is for situations where these environment variables are not set. + t.Setenv("GOOGLE_ENCRYPTION_KEY", "") + t.Setenv("GOOGLE_KMS_ENCRYPTION_KEY", "") + + backend := New() + schema := backend.ConfigSchema() + rawVal := cty.ObjectVal(map[string]cty.Value{ + "bucket": cty.StringVal("fake-placeholder"), + + // These are both empty strings but should still be considered as + // set when we enforce teh rule that they can't both be set at once. + "encryption_key": cty.StringVal(""), + "kms_encryption_key": cty.StringVal(""), + }) + // The following mimicks how the terraform_remote_state data source + // treats its "config" argument, which is a realistic situation where + // we take an arbitrary object and try to force it to conform to the + // backend's schema. + configVal, err := schema.CoerceValue(rawVal) + if err != nil { + t.Fatalf("unexpected coersion error: %s", err) + } + configVal, diags := backend.PrepareConfig(configVal) + if diags.HasErrors() { + t.Fatalf("unexpected PrepareConfig error: %s", diags.Err().Error()) + } + + configDiags := backend.Configure(configVal) + if !configDiags.HasErrors() { + t.Fatalf("unexpected success; want error") + } + gotErr := configDiags.Err().Error() + wantErr := `can't set both encryption_key and kms_encryption_key` + if !strings.Contains(gotErr, wantErr) { + t.Errorf("wrong error\ngot: %s\nwant substring: %s", gotErr, wantErr) + } +} + // setupBackend returns a new GCS backend. func setupBackend(t *testing.T, bucket, prefix, key, kmsName string) backend.Backend { t.Helper() From ce721b8e9cbd03e09f00e5d2b69fdfe53ec3af77 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Mon, 15 Apr 2024 15:17:00 +0200 Subject: [PATCH 005/161] stacks: add deferred to grpc calls --- internal/plugin/grpc_provider.go | 4 ++++ internal/plugin6/grpc_provider.go | 4 ++++ internal/providers/provider.go | 7 +++++++ 3 files changed, 15 insertions(+) diff --git a/internal/plugin/grpc_provider.go b/internal/plugin/grpc_provider.go index fccd44288a..b3b15a0b53 100644 --- a/internal/plugin/grpc_provider.go +++ b/internal/plugin/grpc_provider.go @@ -622,6 +622,9 @@ func (p *GRPCProvider) ImportResourceState(r providers.ImportResourceStateReques protoReq := &proto.ImportResourceState_Request{ TypeName: r.TypeName, Id: r.ID, + ClientCapabilities: &proto.ClientCapabilities{ + DeferralAllowed: r.ClientCapabilities.DeferralAllowed, + }, } protoResp, err := p.client.ImportResourceState(p.ctx, protoReq) @@ -630,6 +633,7 @@ func (p *GRPCProvider) ImportResourceState(r providers.ImportResourceStateReques return resp } resp.Diagnostics = resp.Diagnostics.Append(convert.ProtoToDiagnostics(protoResp.Diagnostics)) + resp.Deferred = convert.ProtoToDeferred(protoResp.Deferred) for _, imported := range protoResp.ImportedResources { resource := providers.ImportedResource{ diff --git a/internal/plugin6/grpc_provider.go b/internal/plugin6/grpc_provider.go index b7db286da8..52b620f8b4 100644 --- a/internal/plugin6/grpc_provider.go +++ b/internal/plugin6/grpc_provider.go @@ -611,6 +611,9 @@ func (p *GRPCProvider) ImportResourceState(r providers.ImportResourceStateReques protoReq := &proto6.ImportResourceState_Request{ TypeName: r.TypeName, Id: r.ID, + ClientCapabilities: &proto6.ClientCapabilities{ + DeferralAllowed: r.ClientCapabilities.DeferralAllowed, + }, } protoResp, err := p.client.ImportResourceState(p.ctx, protoReq) @@ -619,6 +622,7 @@ func (p *GRPCProvider) ImportResourceState(r providers.ImportResourceStateReques return resp } resp.Diagnostics = resp.Diagnostics.Append(convert.ProtoToDiagnostics(protoResp.Diagnostics)) + resp.Deferred = convert.ProtoToDeferred(protoResp.Deferred) for _, imported := range protoResp.ImportedResources { resource := providers.ImportedResource{ diff --git a/internal/providers/provider.go b/internal/providers/provider.go index 5efdfb1439..b40847948c 100644 --- a/internal/providers/provider.go +++ b/internal/providers/provider.go @@ -425,6 +425,9 @@ type ImportResourceStateRequest struct { // ID is a string with which the provider can identify the resource to be // imported. ID string + + // ClientCapabilities contains information about the client's capabilities. + ClientCapabilities ClientCapabilities } type ImportResourceStateResponse struct { @@ -436,6 +439,10 @@ type ImportResourceStateResponse struct { // Diagnostics contains any warnings or errors from the method call. Diagnostics tfdiags.Diagnostics + + // Deferred if present signals that the provider was not able to fully + // complete this operation and a susequent run is required. + Deferred *Deferred } // ImportedResource represents an object being imported into Terraform with the From efdcc7a71154f26d86a552e19fca8fcc8d87647f Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Mon, 15 Apr 2024 15:32:48 +0200 Subject: [PATCH 006/161] stacks: return diags on deferred cli import --- internal/terraform/context_import_test.go | 55 ++++++++++++++++++++++ internal/terraform/node_resource_import.go | 20 +++++++- 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/internal/terraform/context_import_test.go b/internal/terraform/context_import_test.go index 82d48d00df..04178aaf3e 100644 --- a/internal/terraform/context_import_test.go +++ b/internal/terraform/context_import_test.go @@ -1031,6 +1031,61 @@ func TestContextImport_33572(t *testing.T) { } } +func TestContextImport_deferred(t *testing.T) { + p := testProvider("aws") + m := testModule(t, "import-provider") + ctx := testContext2(t, &ContextOpts{ + Providers: map[addrs.Provider]providers.Factory{ + addrs.NewDefaultProvider("aws"): testProviderFuncFixed(p), + }, + }) + + p.ImportResourceStateResponse = &providers.ImportResourceStateResponse{ + Deferred: &providers.Deferred{ + Reason: providers.DeferredReasonAbsentPrereq, + }, + ImportedResources: []providers.ImportedResource{ + { + TypeName: "aws_instance", + State: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("foo"), + }), + }, + }, + } + + state, diags := ctx.Import(m, states.NewState(), &ImportOpts{ + Targets: []*ImportTarget{ + { + LegacyAddr: addrs.RootModuleInstance.ResourceInstance( + addrs.ManagedResourceMode, "aws_instance", "foo", addrs.NoKey, + ), + IDString: "bar", + }, + }, + }) + if !diags.HasErrors() { + t.Fatalf("expected errors, got none.") + } + if len(diags) != 1 { + t.Fatalf("expected 1 error, got %d", len(diags)) + } + + expectedDiagSummary := "Cannot import deferred remote object" + if !strings.Contains(diags[0].Description().Summary, expectedDiagSummary) { + t.Fatalf("expected error to contain %q, got %q", expectedDiagSummary, diags[0].Description().Summary) + } + + expectedDiagDetail := `While attempting to import an existing object to "aws_instance.foo", the provider deferred importing the resource` + if !strings.Contains(diags[0].Description().Detail, expectedDiagDetail) { + t.Fatalf("expected error to contain %q, got %q", expectedDiagDetail, diags[0].Description().Detail) + } + + if !state.Empty() { + t.Fatalf("expected empty state, got %s", state) + } +} + const testImportStr = ` aws_instance.foo: ID = foo diff --git a/internal/terraform/node_resource_import.go b/internal/terraform/node_resource_import.go index 61b0359a74..d7c6c5b6a6 100644 --- a/internal/terraform/node_resource_import.go +++ b/internal/terraform/node_resource_import.go @@ -95,10 +95,26 @@ func (n *graphNodeImportState) Execute(ctx EvalContext, op walkOperation) (diags } resp := provider.ImportResourceState(providers.ImportResourceStateRequest{ - TypeName: n.Addr.Resource.Resource.Type, - ID: n.ID, + TypeName: n.Addr.Resource.Resource.Type, + ID: n.ID, + DeferralAllowed: ctx.Deferrals().DeferralAllowed(), }) diags = diags.Append(resp.Diagnostics) + if resp.Deferred != nil { + diags = diags.Append(tfdiags.Sourceless( + tfdiags.Error, + "Cannot import deferred remote object", + fmt.Sprintf( + "While attempting to import an existing object to %q, "+ + "the provider deferred importing the resource. "+ + "Please either use an import block for importing this resource "+ + "or remove the to be imported resource from your configuration, "+ + "apply the configuration using \"terraform apply\", "+ + "add the to be imported resource again, and retry the import operation.", + n.Addr, + ), + )) + } if diags.HasErrors() { return diags } From 928657b0aba9706758e50e3ff5bb2ee91da598c7 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Mon, 15 Apr 2024 17:23:52 +0200 Subject: [PATCH 007/161] stacks: handle deferred import on import blocks --- .../terraform/context_apply_deferred_test.go | 67 ++++++++++++++++++- .../terraform/node_resource_plan_instance.go | 30 +++++++-- 2 files changed, 91 insertions(+), 6 deletions(-) diff --git a/internal/terraform/context_apply_deferred_test.go b/internal/terraform/context_apply_deferred_test.go index bc88bb8561..c947541052 100644 --- a/internal/terraform/context_apply_deferred_test.go +++ b/internal/terraform/context_apply_deferred_test.go @@ -2025,6 +2025,63 @@ output "a" { }, }, } + + importDeferredTest = deferredActionsTest{ + configs: map[string]string{ + "main.tf": ` +variable "import_id" { + type = string +} + +resource "test" "a" { + name = "a" +} + +import { + id = var.import_id + to = test.a +} +`, + }, + stages: []deferredActionsTestStage{ + { + inputs: map[string]cty.Value{ + "import_id": cty.StringVal("deferred"), // Telling the test case to defer the import + }, + wantPlanned: map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "name": cty.StringVal("a"), + "upstream_names": cty.NullVal(cty.Set(cty.String)), + "output": cty.UnknownVal(cty.String), + }), + }, + wantActions: make(map[string]plans.Action), + wantDeferred: map[string]ExpectedDeferred{ + "test.a": {Reason: providers.DeferredReasonAbsentPrereq, Action: plans.NoOp}, + }, + wantApplied: make(map[string]cty.Value), + wantOutputs: make(map[string]cty.Value), + complete: false, + }, + { + inputs: map[string]cty.Value{ + "import_id": cty.StringVal("can_be_imported"), + }, + wantPlanned: map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "name": cty.StringVal("a"), + "upstream_names": cty.NullVal(cty.Set(cty.String)), + "output": cty.StringVal("can_be_imported"), + }), + }, + wantActions: map[string]plans.Action{ + "test.a": plans.Update, + }, + wantDeferred: map[string]ExpectedDeferred{}, + complete: true, + }, + }, + } ) func TestContextApply_deferredActions(t *testing.T) { @@ -2050,6 +2107,7 @@ func TestContextApply_deferredActions(t *testing.T) { "plan_force_replace_resource_change": planForceReplaceResourceChange, "plan_delete_resource_change": planDeleteResourceChange, "plan_destroy_resource_change": planDestroyResourceChange, + "import_deferred": importDeferredTest, } for name, test := range tests { @@ -2345,7 +2403,7 @@ func (provider *deferredActionsProvider) Provider() providers.Interface { } }, ImportResourceStateFn: func(request providers.ImportResourceStateRequest) providers.ImportResourceStateResponse { - return providers.ImportResourceStateResponse{ + resp := providers.ImportResourceStateResponse{ ImportedResources: []providers.ImportedResource{ { TypeName: request.TypeName, @@ -2357,6 +2415,13 @@ func (provider *deferredActionsProvider) Provider() providers.Interface { }, }, } + if request.ID == "deferred" { + resp.Deferred = &providers.Deferred{ + Reason: providers.DeferredReasonAbsentPrereq, + } + } + + return resp }, } } diff --git a/internal/terraform/node_resource_plan_instance.go b/internal/terraform/node_resource_plan_instance.go index 9a7b7c12fd..3a99f7e004 100644 --- a/internal/terraform/node_resource_plan_instance.go +++ b/internal/terraform/node_resource_plan_instance.go @@ -534,6 +534,9 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. resp = provider.ImportResourceState(providers.ImportResourceStateRequest{ TypeName: addr.Resource.Resource.Type, ID: importId, + ClientCapabilities: providers.ClientCapabilities{ + DeferralAllowed: ctx.Deferrals().DeferralAllowed(), + }, }) } diags = diags.Append(resp.Diagnostics) @@ -543,7 +546,7 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. imported := resp.ImportedResources - if len(imported) == 0 { + if len(imported) == 0 && resp.Deferred == nil { diags = diags.Append(tfdiags.Sourceless( tfdiags.Error, "Import returned no resources", @@ -570,6 +573,22 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. return nil, diags } + // If the import was deferred we can't do more here + if resp.Deferred != nil { + ctx.Deferrals().ReportResourceInstanceDeferred(n.Addr, resp.Deferred.Reason, &plans.ResourceInstanceChange{ + Addr: n.Addr, + Change: plans.Change{ + Action: plans.NoOp, + Before: cty.UnknownVal(cty.DynamicPseudoType), + After: cty.UnknownVal(cty.DynamicPseudoType), + Importing: &plans.Importing{ + ID: importId, + }, + }, + }) + return nil, diags + } + // call post-import hook diags = diags.Append(ctx.Hook(func(h Hook) (HookAction, error) { return h.PostPlanImport(hookResourceID, imported) @@ -601,14 +620,15 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. }, override: n.override, } - instanceRefreshState, deferred, refreshDiags := riNode.refresh(ctx, states.NotDeposed, importedState) + instanceRefreshState, refreshDeferred, refreshDiags := riNode.refresh(ctx, states.NotDeposed, importedState) diags = diags.Append(refreshDiags) if diags.HasErrors() { return instanceRefreshState, diags } - if deferred != nil { - ctx.Deferrals().ReportResourceInstanceDeferred(n.Addr, deferred.Reason, &plans.ResourceInstanceChange{ + // report the refresh was deferred, we don't need to error since the import step succeeded + if refreshDeferred != nil { + ctx.Deferrals().ReportResourceInstanceDeferred(n.Addr, refreshDeferred.Reason, &plans.ResourceInstanceChange{ Addr: n.Addr, Change: plans.Change{ Action: plans.Read, @@ -618,7 +638,7 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. } // verify the existence of the imported resource - if instanceRefreshState.Value.IsNull() && deferred == nil { + if instanceRefreshState.Value.IsNull() && refreshDeferred == nil { var diags tfdiags.Diagnostics diags = diags.Append(tfdiags.Sourceless( tfdiags.Error, From b236d28bcf22b53379300e7936e5ed664681f4b7 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Tue, 16 Apr 2024 15:59:05 +0200 Subject: [PATCH 008/161] stacks: forbid deferral in cases where we return diagnostics on deferral --- internal/terraform/context_import_test.go | 55 ------------------- .../node_resource_abstract_instance.go | 2 +- .../node_resource_abstract_instance_test.go | 2 +- .../node_resource_destroy_deposed.go | 2 +- internal/terraform/node_resource_import.go | 25 ++------- .../terraform/node_resource_plan_instance.go | 4 +- .../terraform/node_resource_plan_orphan.go | 2 +- 7 files changed, 12 insertions(+), 80 deletions(-) diff --git a/internal/terraform/context_import_test.go b/internal/terraform/context_import_test.go index 04178aaf3e..82d48d00df 100644 --- a/internal/terraform/context_import_test.go +++ b/internal/terraform/context_import_test.go @@ -1031,61 +1031,6 @@ func TestContextImport_33572(t *testing.T) { } } -func TestContextImport_deferred(t *testing.T) { - p := testProvider("aws") - m := testModule(t, "import-provider") - ctx := testContext2(t, &ContextOpts{ - Providers: map[addrs.Provider]providers.Factory{ - addrs.NewDefaultProvider("aws"): testProviderFuncFixed(p), - }, - }) - - p.ImportResourceStateResponse = &providers.ImportResourceStateResponse{ - Deferred: &providers.Deferred{ - Reason: providers.DeferredReasonAbsentPrereq, - }, - ImportedResources: []providers.ImportedResource{ - { - TypeName: "aws_instance", - State: cty.ObjectVal(map[string]cty.Value{ - "id": cty.StringVal("foo"), - }), - }, - }, - } - - state, diags := ctx.Import(m, states.NewState(), &ImportOpts{ - Targets: []*ImportTarget{ - { - LegacyAddr: addrs.RootModuleInstance.ResourceInstance( - addrs.ManagedResourceMode, "aws_instance", "foo", addrs.NoKey, - ), - IDString: "bar", - }, - }, - }) - if !diags.HasErrors() { - t.Fatalf("expected errors, got none.") - } - if len(diags) != 1 { - t.Fatalf("expected 1 error, got %d", len(diags)) - } - - expectedDiagSummary := "Cannot import deferred remote object" - if !strings.Contains(diags[0].Description().Summary, expectedDiagSummary) { - t.Fatalf("expected error to contain %q, got %q", expectedDiagSummary, diags[0].Description().Summary) - } - - expectedDiagDetail := `While attempting to import an existing object to "aws_instance.foo", the provider deferred importing the resource` - if !strings.Contains(diags[0].Description().Detail, expectedDiagDetail) { - t.Fatalf("expected error to contain %q, got %q", expectedDiagDetail, diags[0].Description().Detail) - } - - if !state.Empty() { - t.Fatalf("expected empty state, got %s", state) - } -} - const testImportStr = ` aws_instance.foo: ID = foo diff --git a/internal/terraform/node_resource_abstract_instance.go b/internal/terraform/node_resource_abstract_instance.go index 055990ed72..18ce196b9f 100644 --- a/internal/terraform/node_resource_abstract_instance.go +++ b/internal/terraform/node_resource_abstract_instance.go @@ -592,7 +592,7 @@ func (n *NodeAbstractResourceInstance) writeChange(ctx EvalContext, change *plan // refresh does a refresh for a resource // if the second return value is non-nil, the refresh is deferred -func (n *NodeAbstractResourceInstance) refresh(ctx EvalContext, deposedKey states.DeposedKey, state *states.ResourceInstanceObject) (*states.ResourceInstanceObject, *providers.Deferred, tfdiags.Diagnostics) { +func (n *NodeAbstractResourceInstance) refresh(ctx EvalContext, deposedKey states.DeposedKey, state *states.ResourceInstanceObject, deferralAllowed bool) (*states.ResourceInstanceObject, *providers.Deferred, tfdiags.Diagnostics) { var diags tfdiags.Diagnostics var deferred *providers.Deferred absAddr := n.Addr diff --git a/internal/terraform/node_resource_abstract_instance_test.go b/internal/terraform/node_resource_abstract_instance_test.go index 36a0e1d1a5..3002cb4c84 100644 --- a/internal/terraform/node_resource_abstract_instance_test.go +++ b/internal/terraform/node_resource_abstract_instance_test.go @@ -232,7 +232,7 @@ func TestNodeAbstractResourceInstance_refresh_with_deferred_read(t *testing.T) { resourceGraph := addrs.NewDirectedGraph[addrs.ConfigResource]() evalCtx.DeferralsState = deferring.NewDeferred(resourceGraph, true) - rio, deferred, diags := node.refresh(evalCtx, states.NotDeposed, obj) + rio, deferred, diags := node.refresh(evalCtx, states.NotDeposed, obj, true) if diags.HasErrors() { t.Fatal(diags.Err()) } diff --git a/internal/terraform/node_resource_destroy_deposed.go b/internal/terraform/node_resource_destroy_deposed.go index 07b9bb5cb2..be65177a12 100644 --- a/internal/terraform/node_resource_destroy_deposed.go +++ b/internal/terraform/node_resource_destroy_deposed.go @@ -121,7 +121,7 @@ func (n *NodePlanDeposedResourceInstanceObject) Execute(ctx EvalContext, op walk // resource during Delete correctly. If this is a simple refresh, // Terraform is expected to remove the missing resource from the state // entirely - refreshedState, deferred, refreshDiags := n.refresh(ctx, n.DeposedKey, state) + refreshedState, deferred, refreshDiags := n.refresh(ctx, n.DeposedKey, state, ctx.Deferrals().DeferralAllowed()) diags = diags.Append(refreshDiags) if diags.HasErrors() { return diags diff --git a/internal/terraform/node_resource_import.go b/internal/terraform/node_resource_import.go index d7c6c5b6a6..13c731817d 100644 --- a/internal/terraform/node_resource_import.go +++ b/internal/terraform/node_resource_import.go @@ -95,26 +95,13 @@ func (n *graphNodeImportState) Execute(ctx EvalContext, op walkOperation) (diags } resp := provider.ImportResourceState(providers.ImportResourceStateRequest{ - TypeName: n.Addr.Resource.Resource.Type, - ID: n.ID, - DeferralAllowed: ctx.Deferrals().DeferralAllowed(), + TypeName: n.Addr.Resource.Resource.Type, + ID: n.ID, + ClientCapabilities: providers.ClientCapabilities{ + DeferralAllowed: false, + }, }) diags = diags.Append(resp.Diagnostics) - if resp.Deferred != nil { - diags = diags.Append(tfdiags.Sourceless( - tfdiags.Error, - "Cannot import deferred remote object", - fmt.Sprintf( - "While attempting to import an existing object to %q, "+ - "the provider deferred importing the resource. "+ - "Please either use an import block for importing this resource "+ - "or remove the to be imported resource from your configuration, "+ - "apply the configuration using \"terraform apply\", "+ - "add the to be imported resource again, and retry the import operation.", - n.Addr, - ), - )) - } if diags.HasErrors() { return diags } @@ -244,7 +231,7 @@ func (n *graphNodeImportStateSub) Execute(ctx EvalContext, op walkOperation) (di ResolvedProvider: n.ResolvedProvider, }, } - state, deferred, refreshDiags := riNode.refresh(ctx, states.NotDeposed, state) + state, deferred, refreshDiags := riNode.refresh(ctx, states.NotDeposed, state, false) diags = diags.Append(refreshDiags) if diags.HasErrors() { return diags diff --git a/internal/terraform/node_resource_plan_instance.go b/internal/terraform/node_resource_plan_instance.go index 3a99f7e004..1cfa74f36d 100644 --- a/internal/terraform/node_resource_plan_instance.go +++ b/internal/terraform/node_resource_plan_instance.go @@ -205,7 +205,7 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext) // Refresh, maybe // The import process handles its own refresh if !n.skipRefresh && !importing { - s, deferred, refreshDiags := n.refresh(ctx, states.NotDeposed, instanceRefreshState) + s, deferred, refreshDiags := n.refresh(ctx, states.NotDeposed, instanceRefreshState, ctx.Deferrals().DeferralAllowed()) diags = diags.Append(refreshDiags) if diags.HasErrors() { return diags @@ -620,7 +620,7 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. }, override: n.override, } - instanceRefreshState, refreshDeferred, refreshDiags := riNode.refresh(ctx, states.NotDeposed, importedState) + instanceRefreshState, refreshDeferred, refreshDiags := riNode.refresh(ctx, states.NotDeposed, importedState, ctx.Deferrals().DeferralAllowed()) diags = diags.Append(refreshDiags) if diags.HasErrors() { return instanceRefreshState, diags diff --git a/internal/terraform/node_resource_plan_orphan.go b/internal/terraform/node_resource_plan_orphan.go index fad7b07961..57d335dc94 100644 --- a/internal/terraform/node_resource_plan_orphan.go +++ b/internal/terraform/node_resource_plan_orphan.go @@ -117,7 +117,7 @@ func (n *NodePlannableResourceInstanceOrphan) managedResourceExecute(ctx EvalCon // plan before apply, and may not handle a missing resource during // Delete correctly. If this is a simple refresh, Terraform is // expected to remove the missing resource from the state entirely - refreshedState, deferred, refreshDiags := n.refresh(ctx, states.NotDeposed, oldState) + refreshedState, deferred, refreshDiags := n.refresh(ctx, states.NotDeposed, oldState, ctx.Deferrals().DeferralAllowed()) diags = diags.Append(refreshDiags) if diags.HasErrors() { return diags From fd81a7111a80f8729b90b05e7fd301bcd26fa6c6 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Wed, 17 Apr 2024 09:16:22 +0200 Subject: [PATCH 009/161] stacks: continue read and update if import is deferred --- .../terraform/node_resource_plan_instance.go | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/internal/terraform/node_resource_plan_instance.go b/internal/terraform/node_resource_plan_instance.go index 1cfa74f36d..c4379f2c98 100644 --- a/internal/terraform/node_resource_plan_instance.go +++ b/internal/terraform/node_resource_plan_instance.go @@ -546,7 +546,7 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. imported := resp.ImportedResources - if len(imported) == 0 && resp.Deferred == nil { + if len(imported) == 0 { diags = diags.Append(tfdiags.Sourceless( tfdiags.Error, "Import returned no resources", @@ -589,27 +589,33 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. return nil, diags } - // call post-import hook - diags = diags.Append(ctx.Hook(func(h Hook) (HookAction, error) { - return h.PostPlanImport(hookResourceID, imported) - })) - - if imported[0].TypeName == "" { - diags = diags.Append(fmt.Errorf("import of %s didn't set type", n.Addr.String())) - return nil, diags - } - + // We expect the import to return a single instance object, + // even when deferring the import. importedState := imported[0].AsInstanceObject() - if importedState.Value.IsNull() { - diags = diags.Append(tfdiags.Sourceless( - tfdiags.Error, - "Import returned null resource", - fmt.Sprintf("While attempting to import with ID %s, the provider"+ - "returned an instance with no state.", - n.importTarget.IDString, - ), - )) + // We can only call the hooks and validate the imported state if we have + // actually done the import. + if resp.Deferred == nil { + // call post-import hook + diags = diags.Append(ctx.Hook(func(h Hook) (HookAction, error) { + return h.PostPlanImport(hookResourceID, imported) + })) + + if imported[0].TypeName == "" { + diags = diags.Append(fmt.Errorf("import of %s didn't set type", n.Addr.String())) + return nil, diags + } + + if importedState.Value.IsNull() { + diags = diags.Append(tfdiags.Sourceless( + tfdiags.Error, + "Import returned null resource", + fmt.Sprintf("While attempting to import with ID %s, the provider"+ + "returned an instance with no state.", + n.importTarget.IDString, + ), + )) + } } // refresh From 4338787f5b1d02efe40c32a9de9959e1a1eba18a Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Thu, 18 Apr 2024 14:13:32 +0200 Subject: [PATCH 010/161] stacks: allow provider to return empty list of imported resources --- .../terraform/context_apply_deferred_test.go | 18 +++++----- .../terraform/node_resource_plan_instance.go | 33 +++++++++++-------- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/internal/terraform/context_apply_deferred_test.go b/internal/terraform/context_apply_deferred_test.go index c947541052..032ab29362 100644 --- a/internal/terraform/context_apply_deferred_test.go +++ b/internal/terraform/context_apply_deferred_test.go @@ -2403,7 +2403,16 @@ func (provider *deferredActionsProvider) Provider() providers.Interface { } }, ImportResourceStateFn: func(request providers.ImportResourceStateRequest) providers.ImportResourceStateResponse { - resp := providers.ImportResourceStateResponse{ + if request.ID == "deferred" { + return providers.ImportResourceStateResponse{ + ImportedResources: []providers.ImportedResource{}, + Deferred: &providers.Deferred{ + Reason: providers.DeferredReasonProviderConfigUnknown, + }, + } + } + + return providers.ImportResourceStateResponse{ ImportedResources: []providers.ImportedResource{ { TypeName: request.TypeName, @@ -2415,13 +2424,6 @@ func (provider *deferredActionsProvider) Provider() providers.Interface { }, }, } - if request.ID == "deferred" { - resp.Deferred = &providers.Deferred{ - Reason: providers.DeferredReasonAbsentPrereq, - } - } - - return resp }, } } diff --git a/internal/terraform/node_resource_plan_instance.go b/internal/terraform/node_resource_plan_instance.go index c4379f2c98..c0f2485075 100644 --- a/internal/terraform/node_resource_plan_instance.go +++ b/internal/terraform/node_resource_plan_instance.go @@ -545,21 +545,31 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. } imported := resp.ImportedResources + var importedState *states.ResourceInstanceObject if len(imported) == 0 { - diags = diags.Append(tfdiags.Sourceless( - tfdiags.Error, - "Import returned no resources", - fmt.Sprintf("While attempting to import with ID %s, the provider"+ - "returned no instance states.", - importId, - ), - )) - return nil, diags + if resp.Deferred == nil { + diags = diags.Append(tfdiags.Sourceless( + tfdiags.Error, + "Import returned no resources", + fmt.Sprintf("While attempting to import with ID %s, the provider"+ + "returned no instance states.", + importId, + ), + )) + return nil, diags + } else { + importedState = &states.ResourceInstanceObject{ + Value: cty.NullVal(schema.ImpliedType()), + } + } + } else { + importedState = imported[0].AsInstanceObject() } for _, obj := range imported { log.Printf("[TRACE] graphNodeImportState: import %s %q produced instance object of type %s", absAddr.String(), importId, obj.TypeName) } + if len(imported) > 1 { diags = diags.Append(tfdiags.Sourceless( tfdiags.Error, @@ -570,7 +580,6 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. importId, ), )) - return nil, diags } // If the import was deferred we can't do more here @@ -589,10 +598,6 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. return nil, diags } - // We expect the import to return a single instance object, - // even when deferring the import. - importedState := imported[0].AsInstanceObject() - // We can only call the hooks and validate the imported state if we have // actually done the import. if resp.Deferred == nil { From aed6f7586ce5fa811b9406b4ba2c02de6e64c4b2 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Wed, 24 Apr 2024 15:16:47 +0200 Subject: [PATCH 011/161] stacks: use deferral allowed flag --- internal/terraform/node_resource_abstract_instance.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/terraform/node_resource_abstract_instance.go b/internal/terraform/node_resource_abstract_instance.go index 18ce196b9f..8dc3678544 100644 --- a/internal/terraform/node_resource_abstract_instance.go +++ b/internal/terraform/node_resource_abstract_instance.go @@ -653,7 +653,7 @@ func (n *NodeAbstractResourceInstance) refresh(ctx EvalContext, deposedKey state Private: state.Private, ProviderMeta: metaConfigVal, ClientCapabilities: providers.ClientCapabilities{ - DeferralAllowed: ctx.Deferrals().DeferralAllowed(), + DeferralAllowed: deferralAllowed, }, }) From b3d653afb6e3cae3edbdf52da2ff7b62aed11344 Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Fri, 19 Apr 2024 15:48:41 +0200 Subject: [PATCH 012/161] stacks: track deferrals on top-level graph methods This makes it easier to identify when deferals happen in the workflow. --- .../terraform/context_apply_deferred_test.go | 4 +- .../node_resource_abstract_instance.go | 48 ++-- .../terraform/node_resource_apply_instance.go | 13 +- internal/terraform/node_resource_import.go | 1 + .../terraform/node_resource_plan_instance.go | 244 ++++++++++-------- 5 files changed, 168 insertions(+), 142 deletions(-) diff --git a/internal/terraform/context_apply_deferred_test.go b/internal/terraform/context_apply_deferred_test.go index 032ab29362..04e1f67949 100644 --- a/internal/terraform/context_apply_deferred_test.go +++ b/internal/terraform/context_apply_deferred_test.go @@ -1581,7 +1581,7 @@ output "a" { }), }, wantDeferred: map[string]ExpectedDeferred{ - "test.a": {Reason: providers.DeferredReasonProviderConfigUnknown, Action: plans.Read}, + "test.a": {Reason: providers.DeferredReasonProviderConfigUnknown, Action: plans.Update}, }, complete: false, }, @@ -2057,7 +2057,7 @@ import { }, wantActions: make(map[string]plans.Action), wantDeferred: map[string]ExpectedDeferred{ - "test.a": {Reason: providers.DeferredReasonAbsentPrereq, Action: plans.NoOp}, + "test.a": {Reason: providers.DeferredReasonProviderConfigUnknown, Action: plans.Create}, }, wantApplied: make(map[string]cty.Value), wantOutputs: make(map[string]cty.Value), diff --git a/internal/terraform/node_resource_abstract_instance.go b/internal/terraform/node_resource_abstract_instance.go index 8dc3678544..e18686464a 100644 --- a/internal/terraform/node_resource_abstract_instance.go +++ b/internal/terraform/node_resource_abstract_instance.go @@ -756,7 +756,7 @@ func (n *NodeAbstractResourceInstance) plan( currentState *states.ResourceInstanceObject, createBeforeDestroy bool, forceReplace []addrs.AbsResourceInstance, -) (*plans.ResourceInstanceChange, *states.ResourceInstanceObject, instances.RepetitionData, tfdiags.Diagnostics) { +) (*plans.ResourceInstanceChange, *states.ResourceInstanceObject, *providers.Deferred, instances.RepetitionData, tfdiags.Diagnostics) { var diags tfdiags.Diagnostics var keyData instances.RepetitionData var deferred *providers.Deferred @@ -764,14 +764,14 @@ func (n *NodeAbstractResourceInstance) plan( resource := n.Addr.Resource.Resource provider, providerSchema, err := getProvider(ctx, n.ResolvedProvider) if err != nil { - return nil, nil, keyData, diags.Append(err) + return nil, nil, deferred, keyData, diags.Append(err) } schema, _ := providerSchema.SchemaForResourceAddr(resource) if schema == nil { // Should be caught during validation, so we don't bother with a pretty error here diags = diags.Append(fmt.Errorf("provider does not support resource type %q", resource.Type)) - return nil, nil, keyData, diags + return nil, nil, deferred, keyData, diags } // If we're importing and generating config, generate it now. @@ -785,7 +785,7 @@ func (n *NodeAbstractResourceInstance) plan( tfdiags.Error, "Resource has no configuration", fmt.Sprintf("Terraform attempted to process a resource at %s that has no configuration. This is a bug in Terraform; please report it!", n.Addr.String()))) - return nil, nil, keyData, diags + return nil, nil, deferred, keyData, diags } config := *n.Config @@ -813,26 +813,26 @@ func (n *NodeAbstractResourceInstance) plan( ) diags = diags.Append(checkDiags) if diags.HasErrors() { - return nil, nil, keyData, diags // failed preconditions prevent further evaluation + return nil, nil, deferred, keyData, diags // failed preconditions prevent further evaluation } // If we have a previous plan and the action was a noop, then the only // reason we're in this method was to evaluate the preconditions. There's // no need to re-plan this resource. if plannedChange != nil && plannedChange.Action == plans.NoOp { - return plannedChange, currentState.DeepCopy(), keyData, diags + return plannedChange, currentState.DeepCopy(), deferred, keyData, diags } origConfigVal, _, configDiags := ctx.EvaluateBlock(config.Config, schema, nil, keyData) diags = diags.Append(configDiags) if configDiags.HasErrors() { - return nil, nil, keyData, diags + return nil, nil, deferred, keyData, diags } metaConfigVal, metaDiags := n.providerMetas(ctx) diags = diags.Append(metaDiags) if diags.HasErrors() { - return nil, nil, keyData, diags + return nil, nil, deferred, keyData, diags } var priorVal cty.Value @@ -875,7 +875,7 @@ func (n *NodeAbstractResourceInstance) plan( ) diags = diags.Append(validateResp.Diagnostics.InConfigBody(config.Config, n.Addr.String())) if diags.HasErrors() { - return nil, nil, keyData, diags + return nil, nil, deferred, keyData, diags } // ignore_changes is meant to only apply to the configuration, so it must @@ -888,7 +888,7 @@ func (n *NodeAbstractResourceInstance) plan( configValIgnored, ignoreChangeDiags := n.processIgnoreChanges(priorVal, origConfigVal, schema) diags = diags.Append(ignoreChangeDiags) if ignoreChangeDiags.HasErrors() { - return nil, nil, keyData, diags + return nil, nil, deferred, keyData, diags } // Create an unmarked version of our config val and our prior val. @@ -904,7 +904,7 @@ func (n *NodeAbstractResourceInstance) plan( return h.PreDiff(n.HookResourceIdentity(), addrs.NotDeposed, priorVal, proposedNewVal) })) if diags.HasErrors() { - return nil, nil, keyData, diags + return nil, nil, deferred, keyData, diags } var resp providers.PlanResourceChangeResponse @@ -942,7 +942,7 @@ func (n *NodeAbstractResourceInstance) plan( } diags = diags.Append(resp.Diagnostics.InConfigBody(config.Config, n.Addr.String())) if diags.HasErrors() { - return nil, nil, keyData, diags + return nil, nil, deferred, keyData, diags } // We mark this node as deferred at a later point when we know the complete change @@ -979,7 +979,7 @@ func (n *NodeAbstractResourceInstance) plan( } if diags.HasErrors() { - return nil, nil, keyData, diags + return nil, nil, deferred, keyData, diags } if errs := objchange.AssertPlanValid(schema, unmarkedPriorVal, unmarkedConfigVal, plannedNewVal); len(errs) > 0 { @@ -1009,7 +1009,7 @@ func (n *NodeAbstractResourceInstance) plan( ), )) } - return nil, nil, keyData, diags + return nil, nil, deferred, keyData, diags } } } @@ -1030,7 +1030,7 @@ func (n *NodeAbstractResourceInstance) plan( plannedNewVal, ignoreChangeDiags = n.processIgnoreChanges(unmarkedPriorVal, plannedNewVal, nil) diags = diags.Append(ignoreChangeDiags) if ignoreChangeDiags.HasErrors() { - return nil, nil, keyData, diags + return nil, nil, deferred, keyData, diags } } @@ -1047,7 +1047,7 @@ func (n *NodeAbstractResourceInstance) plan( reqRep, reqRepDiags := getRequiredReplaces(priorVal, plannedNewVal, resp.RequiresReplace, n.ResolvedProvider.Provider, n.Addr) diags = diags.Append(reqRepDiags) if diags.HasErrors() { - return nil, nil, keyData, diags + return nil, nil, deferred, keyData, diags } action, actionReason := getAction(n.Addr, unmarkedPriorVal, unmarkedPlannedNewVal, createBeforeDestroy, forceReplace, reqRep) @@ -1104,10 +1104,10 @@ func (n *NodeAbstractResourceInstance) plan( // append these new diagnostics if there's at least one error inside. if resp.Diagnostics.HasErrors() { diags = diags.Append(resp.Diagnostics.InConfigBody(config.Config, n.Addr.String())) - return nil, nil, keyData, diags + return nil, nil, deferred, keyData, diags } - if resp.Deferred != nil { + if deferred == nil && resp.Deferred != nil { deferred = resp.Deferred } @@ -1129,7 +1129,7 @@ func (n *NodeAbstractResourceInstance) plan( )) } if diags.HasErrors() { - return nil, nil, keyData, diags + return nil, nil, deferred, keyData, diags } } @@ -1178,7 +1178,7 @@ func (n *NodeAbstractResourceInstance) plan( return h.PostDiff(n.HookResourceIdentity(), addrs.NotDeposed, action, priorVal, plannedNewVal) })) if diags.HasErrors() { - return nil, nil, keyData, diags + return nil, nil, deferred, keyData, diags } // Update our return plan @@ -1200,12 +1200,6 @@ func (n *NodeAbstractResourceInstance) plan( RequiredReplace: reqRep, } - // If we defer the change we need to report it and return early - if deferred != nil { - ctx.Deferrals().ReportResourceInstanceDeferred(n.Addr, deferred.Reason, plan) - return nil, nil, keyData, diags - } - // Update our return state state := &states.ResourceInstanceObject{ // We use the special "planned" status here to note that this @@ -1219,7 +1213,7 @@ func (n *NodeAbstractResourceInstance) plan( Private: plannedPrivate, } - return plan, state, keyData, diags + return plan, state, deferred, keyData, diags } func (n *NodeAbstractResource) processIgnoreChanges(prior, config cty.Value, schema *configschema.Block) (cty.Value, tfdiags.Diagnostics) { diff --git a/internal/terraform/node_resource_apply_instance.go b/internal/terraform/node_resource_apply_instance.go index 98c6376254..c1421148a4 100644 --- a/internal/terraform/node_resource_apply_instance.go +++ b/internal/terraform/node_resource_apply_instance.go @@ -275,12 +275,23 @@ func (n *NodeApplyableResourceInstance) managedResourceExecute(ctx EvalContext) // Make a new diff, in case we've learned new values in the state // during apply which we can now incorporate. - diffApply, _, repeatData, planDiags := n.plan(ctx, diff, state, false, n.forceReplace) + diffApply, _, deferred, repeatData, planDiags := n.plan(ctx, diff, state, false, n.forceReplace) diags = diags.Append(planDiags) if diags.HasErrors() { return diags } + if deferred != nil { + diags = diags.Append(tfdiags.Sourceless( + tfdiags.Error, + "Resource deferred during apply, but not during plan", + fmt.Sprintf( + "Terraform has encountered a bug where a provider would mark the resource %q as deferred during apply, but not during plan. This is most likely a bug in the provider. Please file an issue with the provider.", n.Addr, + ), + )) + return diags + } + // Compare the diffs diags = diags.Append(n.checkPlannedChange(ctx, diff, diffApply, providerSchema)) if diags.HasErrors() { diff --git a/internal/terraform/node_resource_import.go b/internal/terraform/node_resource_import.go index 13c731817d..edc7cb9949 100644 --- a/internal/terraform/node_resource_import.go +++ b/internal/terraform/node_resource_import.go @@ -245,6 +245,7 @@ func (n *graphNodeImportStateSub) Execute(ctx EvalContext, op walkOperation) (di fmt.Sprintf( "While attempting to import an existing object to %q, "+ "the provider deferred reading the resource. "+ + "This is a bug in the provider since deferrals are not supported when importing through the CLI, please file an issue."+ "Please either use an import block for importing this resource "+ "or remove the to be imported resource from your configuration, "+ "apply the configuration using \"terraform apply\", "+ diff --git a/internal/terraform/node_resource_plan_instance.go b/internal/terraform/node_resource_plan_instance.go index c0f2485075..761559960c 100644 --- a/internal/terraform/node_resource_plan_instance.go +++ b/internal/terraform/node_resource_plan_instance.go @@ -163,10 +163,12 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext) importing := n.importTarget.IDString != "" importId := n.importTarget.IDString + var deferred *providers.Deferred + // If the resource is to be imported, we now ask the provider for an Import // and a Refresh, and save the resulting state to instanceRefreshState. if importing { - instanceRefreshState, diags = n.importState(ctx, addr, importId, provider, providerSchema) + instanceRefreshState, deferred, diags = n.importState(ctx, addr, importId, provider, providerSchema) } else { var readDiags tfdiags.Diagnostics instanceRefreshState, readDiags = n.readResourceInstanceState(ctx, addr) @@ -176,20 +178,22 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext) } } - // We'll save a snapshot of what we just read from the state into the - // prevRunState before we do anything else, since this will capture the - // result of any schema upgrading that readResourceInstanceState just did, - // but not include any out-of-band changes we might detect in in the - // refresh step below. - diags = diags.Append(n.writeResourceInstanceState(ctx, instanceRefreshState, prevRunState)) - if diags.HasErrors() { - return diags - } - // Also the refreshState, because that should still reflect schema upgrades - // even if it doesn't reflect upstream changes. - diags = diags.Append(n.writeResourceInstanceState(ctx, instanceRefreshState, refreshState)) - if diags.HasErrors() { - return diags + if deferred == nil { + // We'll save a snapshot of what we just read from the state into the + // prevRunState before we do anything else, since this will capture the + // result of any schema upgrading that readResourceInstanceState just did, + // but not include any out-of-band changes we might detect in in the + // refresh step below. + diags = diags.Append(n.writeResourceInstanceState(ctx, instanceRefreshState, prevRunState)) + if diags.HasErrors() { + return diags + } + // Also the refreshState, because that should still reflect schema upgrades + // even if it doesn't reflect upstream changes. + diags = diags.Append(n.writeResourceInstanceState(ctx, instanceRefreshState, refreshState)) + if diags.HasErrors() { + return diags + } } // In 0.13 we could be refreshing a resource with no config. @@ -202,28 +206,21 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext) } } + var refreshDeferred *providers.Deferred + // This is the state of the resource before we refresh the value, we need to keep track + // of this to report this as the before value if the refresh is deferred. + priorInstanceRefreshState := instanceRefreshState + // Refresh, maybe // The import process handles its own refresh if !n.skipRefresh && !importing { - s, deferred, refreshDiags := n.refresh(ctx, states.NotDeposed, instanceRefreshState, ctx.Deferrals().DeferralAllowed()) + var refreshDiags tfdiags.Diagnostics + instanceRefreshState, refreshDeferred, refreshDiags = n.refresh(ctx, states.NotDeposed, instanceRefreshState, ctx.Deferrals().DeferralAllowed()) diags = diags.Append(refreshDiags) if diags.HasErrors() { return diags } - if deferred == nil { - instanceRefreshState = s - } else { - ctx.Deferrals().ReportResourceInstanceDeferred(n.Addr, deferred.Reason, &plans.ResourceInstanceChange{ - Addr: n.Addr, - Change: plans.Change{ - Action: plans.Read, - Before: s.Value, - After: cty.DynamicVal, - }, - }) - } - if instanceRefreshState != nil { // When refreshing we start by merging the stored dependencies and // the configured dependencies. The configured dependencies will be @@ -233,7 +230,13 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext) instanceRefreshState.Dependencies = mergeDeps(n.Dependencies, instanceRefreshState.Dependencies) } - diags = diags.Append(n.writeResourceInstanceState(ctx, instanceRefreshState, refreshState)) + if deferred == nil && refreshDeferred != nil { + deferred = refreshDeferred + } + + if deferred == nil { + diags = diags.Append(n.writeResourceInstanceState(ctx, instanceRefreshState, refreshState)) + } if diags.HasErrors() { return diags } @@ -258,7 +261,7 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext) return diags } - change, instancePlanState, repeatData, planDiags := n.plan( + change, instancePlanState, planDeferred, repeatData, planDiags := n.plan( ctx, nil, instanceRefreshState, n.ForceCreateBeforeDestroy, n.forceReplace, ) diags = diags.Append(planDiags) @@ -266,7 +269,7 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext) // If we are importing and generating a configuration, we need to // ensure the change is written out so the configuration can be // captured. - if len(n.generateConfigPath) > 0 { + if planDeferred == nil && len(n.generateConfigPath) > 0 { // Update our return plan change := &plans.ResourceInstanceChange{ Addr: n.Addr, @@ -286,6 +289,10 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext) return diags } + if deferred == nil && planDeferred != nil { + deferred = planDeferred + } + if importing { change.Importing = &plans.Importing{ID: importId} } @@ -298,10 +305,11 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext) } deferrals := ctx.Deferrals() - - if deferrals.IsResourceInstanceDeferred(n.Addr) { - // This resource instance is already deferred, probably because it - // was deferred during the refresh or import step. + if deferred != nil { + // Then this resource has been deferred either during the import, + // refresh or planning stage. We'll report the deferral and + // store what we could produce in the deferral tracker. + deferrals.ReportResourceInstanceDeferred(addr, deferred.Reason, change) } else if !deferrals.ShouldDeferResourceInstanceChanges(n.Addr) { // We intentionally write the change before the subsequent checks, because // all of the checks below this point are for problems caused by the @@ -417,6 +425,19 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext) checkRuleSeverity, ) diags = diags.Append(checkDiags) + + // In this case we skipped planning changes and therefore need to report the deferral + // here, if there was one. + if refreshDeferred != nil { + ctx.Deferrals().ReportResourceInstanceDeferred(addr, deferred.Reason, &plans.ResourceInstanceChange{ + Addr: n.Addr, + Change: plans.Change{ + Action: plans.Read, + Before: priorInstanceRefreshState.Value, + After: instanceRefreshState.Value, + }, + }) + } } return diags @@ -455,7 +476,7 @@ func (n *NodePlannableResourceInstance) replaceTriggered(ctx EvalContext, repDat return diags } -func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs.AbsResourceInstance, importId string, provider providers.Interface, providerSchema providers.ProviderSchema) (*states.ResourceInstanceObject, tfdiags.Diagnostics) { +func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs.AbsResourceInstance, importId string, provider providers.Interface, providerSchema providers.ProviderSchema) (*states.ResourceInstanceObject, *providers.Deferred, tfdiags.Diagnostics) { var diags tfdiags.Diagnostics absAddr := addr.Resource.Absolute(ctx.Path()) hookResourceID := HookResourceIdentity{ @@ -463,18 +484,20 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. ProviderAddr: n.ResolvedProvider.Provider, } + var deferred *providers.Deferred + diags = diags.Append(ctx.Hook(func(h Hook) (HookAction, error) { return h.PrePlanImport(hookResourceID, importId) })) if diags.HasErrors() { - return nil, diags + return nil, deferred, diags } schema, _ := providerSchema.SchemaForResourceAddr(n.Addr.Resource.Resource) if schema == nil { // Should be caught during validation, so we don't bother with a pretty error here diags = diags.Append(fmt.Errorf("provider does not support resource type for %q", n.Addr)) - return nil, diags + return nil, deferred, diags } var resp providers.ImportResourceStateResponse @@ -493,7 +516,7 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. // document the expectation somewhere. This shouldn't happen in // production, so we don't bother with a pretty error. diags = diags.Append(fmt.Errorf("override blocks do not support config generation")) - return nil, diags + return nil, deferred, diags } forEach, _, _ := evaluateForEachExpression(n.Config.ForEach, ctx, false) @@ -511,7 +534,7 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. // later), so only add the configDiags into the main diags if we // found actual errors. diags = diags.Append(configDiags) - return nil, diags + return nil, deferred, diags } configVal, _ = configVal.UnmarkDeep() @@ -540,35 +563,12 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. }) } diags = diags.Append(resp.Diagnostics) + deferred = resp.Deferred if diags.HasErrors() { - return nil, diags + return nil, deferred, diags } imported := resp.ImportedResources - var importedState *states.ResourceInstanceObject - - if len(imported) == 0 { - if resp.Deferred == nil { - diags = diags.Append(tfdiags.Sourceless( - tfdiags.Error, - "Import returned no resources", - fmt.Sprintf("While attempting to import with ID %s, the provider"+ - "returned no instance states.", - importId, - ), - )) - return nil, diags - } else { - importedState = &states.ResourceInstanceObject{ - Value: cty.NullVal(schema.ImpliedType()), - } - } - } else { - importedState = imported[0].AsInstanceObject() - } - for _, obj := range imported { - log.Printf("[TRACE] graphNodeImportState: import %s %q produced instance object of type %s", absAddr.String(), importId, obj.TypeName) - } if len(imported) > 1 { diags = diags.Append(tfdiags.Sourceless( @@ -582,22 +582,39 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. )) } - // If the import was deferred we can't do more here - if resp.Deferred != nil { - ctx.Deferrals().ReportResourceInstanceDeferred(n.Addr, resp.Deferred.Reason, &plans.ResourceInstanceChange{ - Addr: n.Addr, - Change: plans.Change{ - Action: plans.NoOp, - Before: cty.UnknownVal(cty.DynamicPseudoType), - After: cty.UnknownVal(cty.DynamicPseudoType), - Importing: &plans.Importing{ - ID: importId, - }, - }, - }) - return nil, diags + if len(imported) == 0 { + + // Sanity check against the providers. If the provider defers the response, it may not have been able to return a state, so we'll only error if no deferral was returned. + if deferred == nil { + diags = diags.Append(tfdiags.Sourceless( + tfdiags.Error, + "Import returned no resources", + fmt.Sprintf("While attempting to import with ID %s, the provider"+ + "returned no instance states.", + importId, + ), + )) + return nil, deferred, diags + } + + // If we were deferred, then let's make up a resource to represent the + // state we're going to import. + state := providers.ImportedResource{ + TypeName: addr.Resource.Resource.Type, + State: cty.NullVal(schema.ImpliedType()), + } + + // We skip the read and further validation since we make up the state + // of the imported resource anyways. + return state.AsInstanceObject(), deferred, diags } + for _, obj := range imported { + log.Printf("[TRACE] graphNodeImportState: import %s %q produced instance object of type %s", absAddr.String(), importId, obj.TypeName) + } + + importedState := imported[0].AsInstanceObject() + // We can only call the hooks and validate the imported state if we have // actually done the import. if resp.Deferred == nil { @@ -605,22 +622,24 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. diags = diags.Append(ctx.Hook(func(h Hook) (HookAction, error) { return h.PostPlanImport(hookResourceID, imported) })) + } - if imported[0].TypeName == "" { - diags = diags.Append(fmt.Errorf("import of %s didn't set type", n.Addr.String())) - return nil, diags - } + if imported[0].TypeName == "" { + diags = diags.Append(fmt.Errorf("import of %s didn't set type", n.Addr.String())) + return nil, deferred, diags + } + + if deferred == nil && importedState.Value.IsNull() { + // It's actually okay for a deferred import to have returned a null. + diags = diags.Append(tfdiags.Sourceless( + tfdiags.Error, + "Import returned null resource", + fmt.Sprintf("While attempting to import with ID %s, the provider"+ + "returned an instance with no state.", + n.importTarget.IDString, + ), + )) - if importedState.Value.IsNull() { - diags = diags.Append(tfdiags.Sourceless( - tfdiags.Error, - "Import returned null resource", - fmt.Sprintf("While attempting to import with ID %s, the provider"+ - "returned an instance with no state.", - n.importTarget.IDString, - ), - )) - } } // refresh @@ -634,22 +653,16 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. instanceRefreshState, refreshDeferred, refreshDiags := riNode.refresh(ctx, states.NotDeposed, importedState, ctx.Deferrals().DeferralAllowed()) diags = diags.Append(refreshDiags) if diags.HasErrors() { - return instanceRefreshState, diags + return instanceRefreshState, deferred, diags } // report the refresh was deferred, we don't need to error since the import step succeeded - if refreshDeferred != nil { - ctx.Deferrals().ReportResourceInstanceDeferred(n.Addr, refreshDeferred.Reason, &plans.ResourceInstanceChange{ - Addr: n.Addr, - Change: plans.Change{ - Action: plans.Read, - After: instanceRefreshState.Value, - }, - }) + if deferred == nil && refreshDeferred != nil { + deferred = refreshDeferred } // verify the existence of the imported resource - if instanceRefreshState.Value.IsNull() && refreshDeferred == nil { + if refreshDeferred == nil && instanceRefreshState.Value.IsNull() { var diags tfdiags.Diagnostics diags = diags.Append(tfdiags.Sourceless( tfdiags.Error, @@ -664,13 +677,15 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. n.Addr, ), )) - return instanceRefreshState, diags + return instanceRefreshState, deferred, diags } - // If we're importing and generating config, generate it now. - if len(n.generateConfigPath) > 0 { + // If we're importing and generating config, generate it now. We only + // generate config if the import isn't being deferred. We should generate + // the configuration in the plan that the import is actually happening in. + if deferred == nil && len(n.generateConfigPath) > 0 { if n.Config != nil { - return instanceRefreshState, diags.Append(fmt.Errorf("tried to generate config for %s, but it already exists", n.Addr)) + return instanceRefreshState, nil, diags.Append(fmt.Errorf("tried to generate config for %s, but it already exists", n.Addr)) } // Generate the HCL string first, then parse the HCL body from it. @@ -686,7 +701,7 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. synthHCLFile, hclDiags := hclsyntax.ParseConfig([]byte(generatedHCLAttributes), filepath.Base(n.generateConfigPath), hcl.Pos{Byte: 0, Line: 1, Column: 1}) diags = diags.Append(hclDiags) if hclDiags.HasErrors() { - return instanceRefreshState, diags + return instanceRefreshState, nil, diags } // We have to do a kind of mini parsing of the content here to correctly @@ -696,7 +711,7 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. _, remain, resourceDiags := synthHCLFile.Body.PartialContent(configs.ResourceBlockSchema) diags = diags.Append(resourceDiags) if resourceDiags.HasErrors() { - return instanceRefreshState, diags + return instanceRefreshState, nil, diags } n.Config = &configs.Resource{ @@ -709,8 +724,13 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. } } - diags = diags.Append(riNode.writeResourceInstanceState(ctx, instanceRefreshState, refreshState)) - return instanceRefreshState, diags + if deferred == nil { + // Only write the state if the change isn't being deferred. We're also + // reporting the deferred status to the caller, so they should know + // not to read from the state. + diags = diags.Append(riNode.writeResourceInstanceState(ctx, instanceRefreshState, refreshState)) + } + return instanceRefreshState, deferred, diags } // generateHCLStringAttributes produces a string in HCL format for the given From 9cf790ce6a756040172a42daf8515009f16b7a3b Mon Sep 17 00:00:00 2001 From: Felix <90956507+cloudwithfelix@users.noreply.github.com> Date: Sun, 28 Apr 2024 08:56:04 +0200 Subject: [PATCH 013/161] Wrong reference I think line 249 is meaning to reference to the "when" functionality, not the "on_failure" functionality. --- website/docs/language/resources/provisioners/syntax.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/language/resources/provisioners/syntax.mdx b/website/docs/language/resources/provisioners/syntax.mdx index 69f8c422fa..35923611fe 100644 --- a/website/docs/language/resources/provisioners/syntax.mdx +++ b/website/docs/language/resources/provisioners/syntax.mdx @@ -246,7 +246,7 @@ can leave a resource in a semi-configured state. Because Terraform cannot reason about what the provisioner does, the only way to ensure proper creation of a resource is to recreate it. This is tainting. -You can change this behavior by setting the `on_failure` attribute, +You can change this behavior by setting the `when` attribute, which is covered in detail below. ## Destroy-Time Provisioners From 828e4155e2d1a5335108fc82a5c4c8f0a46279e3 Mon Sep 17 00:00:00 2001 From: Bandhan Majumder <133476557+bandhan-majumder@users.noreply.github.com> Date: Mon, 29 Apr 2024 11:02:12 +0530 Subject: [PATCH 014/161] Update configuration.mdx Added information about labels "aws_instance" and "example" in the resource. --- website/docs/language/syntax/configuration.mdx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/website/docs/language/syntax/configuration.mdx b/website/docs/language/syntax/configuration.mdx index 114249876a..ea8311f008 100644 --- a/website/docs/language/syntax/configuration.mdx +++ b/website/docs/language/syntax/configuration.mdx @@ -76,6 +76,10 @@ resource "aws_instance" "example" { A block has a _type_ (`resource` in this example). Each block type defines how many _labels_ must follow the type keyword. The `resource` block type expects two labels, which are `aws_instance` and `example` in the example above. +First label `aws_instance` is the `resource` type provided by AWS provider in Terraform and +second label `example` is an arbitrary name given to this particular instance of the `aws_instance` resource. +In Terraform, we can have multiple instances of the same resource type. And we differentiate +them by giving each instance a unique name. A particular block type may have any number of required labels, or it may require none as with the nested `network_interface` block type. From 70fd14c022758d7a1c86dd75f5d0c60c5e696d4c Mon Sep 17 00:00:00 2001 From: Bandhan Majumder <133476557+bandhan-majumder@users.noreply.github.com> Date: Mon, 29 Apr 2024 11:09:17 +0530 Subject: [PATCH 015/161] Update configuration.mdx Updated information about labels "aws_instance" and "example" in the block resource type . --- website/docs/language/syntax/configuration.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/language/syntax/configuration.mdx b/website/docs/language/syntax/configuration.mdx index ea8311f008..f7a8473d89 100644 --- a/website/docs/language/syntax/configuration.mdx +++ b/website/docs/language/syntax/configuration.mdx @@ -77,8 +77,8 @@ A block has a _type_ (`resource` in this example). Each block type defines how many _labels_ must follow the type keyword. The `resource` block type expects two labels, which are `aws_instance` and `example` in the example above. First label `aws_instance` is the `resource` type provided by AWS provider in Terraform and -second label `example` is an arbitrary name given to this particular instance of the `aws_instance` resource. -In Terraform, we can have multiple instances of the same resource type. And we differentiate +second label `example` is an arbitrary name given to this particular instance of the `aws_instance` of block `resource`. +In Terraform, we can have multiple instances of the same block type (`resource`). And we differentiate them by giving each instance a unique name. A particular block type may have any number of required labels, or it may require none as with the nested `network_interface` block type. From f0e2861c1e30df18906b7088d0143376b5cecf4e Mon Sep 17 00:00:00 2001 From: Alex Ott Date: Fri, 26 Apr 2024 12:20:01 +0200 Subject: [PATCH 016/161] Improve performance of AttachResourceConfigTransformer on big graphs The current implementation of `AttachResourceConfigTransformer` has performance of `O(N^2)` to the number of vertices in the graph, and this leads to significant performance degradation on huge graphs. The given implementation decreases the complexity to `O(N)` by performing direct lookup of a resource in the `ManagedResources` or `DataResources` depending on the object type. Signed-off-by: Alex Ott --- .../transform_attach_config_resource.go | 65 ++++--------------- 1 file changed, 14 insertions(+), 51 deletions(-) diff --git a/internal/terraform/transform_attach_config_resource.go b/internal/terraform/transform_attach_config_resource.go index 358aa88b21..48a71a1034 100644 --- a/internal/terraform/transform_attach_config_resource.go +++ b/internal/terraform/transform_attach_config_resource.go @@ -6,6 +6,7 @@ package terraform import ( "log" + "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/configs" "github.com/hashicorp/terraform/internal/dag" ) @@ -48,63 +49,25 @@ func (t *AttachResourceConfigTransformer) Transform(g *Graph) error { log.Printf("[TRACE] AttachResourceConfigTransformer: %q (%T) has no configuration available", dag.VertexName(v), v) continue } - - for _, r := range config.Module.ManagedResources { - rAddr := r.Addr() - - if rAddr != addr.Resource { - // Not the same resource - continue - } - - log.Printf("[TRACE] AttachResourceConfigTransformer: attaching to %q (%T) config from %s", dag.VertexName(v), v, r.DeclRange) - arn.AttachResourceConfig(r) - - // attach the provider_meta info - if gnapmc, ok := v.(GraphNodeAttachProviderMetaConfigs); ok { - log.Printf("[TRACE] AttachResourceConfigTransformer: attaching provider meta configs to %s", dag.VertexName(v)) - if config == nil { - log.Printf("[TRACE] AttachResourceConfigTransformer: no config set on the transformer for %s", dag.VertexName(v)) - continue - } - if config.Module == nil { - log.Printf("[TRACE] AttachResourceConfigTransformer: no module in config for %s", dag.VertexName(v)) - continue - } - if config.Module.ProviderMetas == nil { - log.Printf("[TRACE] AttachResourceConfigTransformer: no provider metas defined for %s", dag.VertexName(v)) - continue - } - gnapmc.AttachProviderMetaConfigs(config.Module.ProviderMetas) - } + var m map[string]*configs.Resource + if addr.Resource.Mode == addrs.ManagedResourceMode { + m = config.Module.ManagedResources + } else if addr.Resource.Mode == addrs.DataResourceMode { + m = config.Module.DataResources + } else { + panic("unknown resource mode: " + addr.Resource.Mode.String()) } - for _, r := range config.Module.DataResources { - rAddr := r.Addr() - - if rAddr != addr.Resource { - // Not the same resource - continue - } - + coord := addr.Resource.String() + if r, ok := m[coord]; ok && r.Addr() == addr.Resource { log.Printf("[TRACE] AttachResourceConfigTransformer: attaching to %q (%T) config from %#v", dag.VertexName(v), v, r.DeclRange) arn.AttachResourceConfig(r) - - // attach the provider_meta info if gnapmc, ok := v.(GraphNodeAttachProviderMetaConfigs); ok { log.Printf("[TRACE] AttachResourceConfigTransformer: attaching provider meta configs to %s", dag.VertexName(v)) - if config == nil { - log.Printf("[TRACE] AttachResourceConfigTransformer: no config set on the transformer for %s", dag.VertexName(v)) - continue + if config.Module.ProviderMetas != nil { + gnapmc.AttachProviderMetaConfigs(config.Module.ProviderMetas) + } else { + log.Printf("[TRACE] AttachResourceConfigTransformer: no provider meta configs available to attach to %s", dag.VertexName(v)) } - if config.Module == nil { - log.Printf("[TRACE] AttachResourceConfigTransformer: no module in config for %s", dag.VertexName(v)) - continue - } - if config.Module.ProviderMetas == nil { - log.Printf("[TRACE] AttachResourceConfigTransformer: no provider metas defined for %s", dag.VertexName(v)) - continue - } - gnapmc.AttachProviderMetaConfigs(config.Module.ProviderMetas) } } } From 2562420d1676f9b78ce7d8915f6db97c2f493c9e Mon Sep 17 00:00:00 2001 From: James Bardin Date: Fri, 26 Apr 2024 15:03:49 -0400 Subject: [PATCH 017/161] prevent panics with null objects in nested attrs When descending into nested structural attributes, don't try to extract attributes from null objects. Unlike with blocks, nested attributes allow the possibility of assigning null values. While these technically aren't allowed to be altered, we need to accept these for compatibility. --- internal/plans/objchange/plan_valid.go | 25 +++++++++++++++--- internal/plans/objchange/plan_valid_test.go | 29 +++++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/internal/plans/objchange/plan_valid.go b/internal/plans/objchange/plan_valid.go index 49b9db6d7b..f03666a87c 100644 --- a/internal/plans/objchange/plan_valid.go +++ b/internal/plans/objchange/plan_valid.go @@ -256,12 +256,31 @@ func assertPlannedAttrsValid(schema map[string]*configschema.Attribute, priorSta } func assertPlannedAttrValid(name string, attrS *configschema.Attribute, priorState, config, plannedState cty.Value, path cty.Path) []error { - plannedV := plannedState.GetAttr(name) - configV := config.GetAttr(name) - priorV := cty.NullVal(attrS.Type) + // any of the config, prior or planned values may be null at this point if + // we are in nested structural attributes. + var plannedV, configV, priorV cty.Value + if attrS.NestedType != nil { + configV = cty.NullVal(attrS.NestedType.ImpliedType()) + priorV = cty.NullVal(attrS.NestedType.ImpliedType()) + plannedV = cty.NullVal(attrS.NestedType.ImpliedType()) + } else { + configV = cty.NullVal(attrS.Type) + priorV = cty.NullVal(attrS.Type) + plannedV = cty.NullVal(attrS.Type) + } + + if !config.IsNull() { + configV = config.GetAttr(name) + } + if !priorState.IsNull() { priorV = priorState.GetAttr(name) } + + if !plannedState.IsNull() { + plannedV = plannedState.GetAttr(name) + } + path = append(path, cty.GetAttrStep{Name: name}) return assertPlannedValueValid(attrS, priorV, configV, plannedV, path) diff --git a/internal/plans/objchange/plan_valid_test.go b/internal/plans/objchange/plan_valid_test.go index 461ed77b9a..4445f29bb6 100644 --- a/internal/plans/objchange/plan_valid_test.go +++ b/internal/plans/objchange/plan_valid_test.go @@ -1510,6 +1510,7 @@ func TestAssertPlanValid(t *testing.T) { // When an object has dynamic attrs, the map may be // handled as an object. "map_as_obj": { + Optional: true, NestedType: &configschema.Object{ Nesting: configschema.NestingMap, Attributes: map[string]*configschema.Attribute{ @@ -1522,6 +1523,7 @@ func TestAssertPlanValid(t *testing.T) { }, }, "list": { + Optional: true, NestedType: &configschema.Object{ Nesting: configschema.NestingList, Attributes: map[string]*configschema.Attribute{ @@ -1586,11 +1588,23 @@ func TestAssertPlanValid(t *testing.T) { "one": cty.ObjectVal(map[string]cty.Value{ "name": cty.NullVal(cty.DynamicPseudoType), }), + "two": cty.NullVal(cty.Object(map[string]cty.Type{ + "name": cty.DynamicPseudoType, + })), + "three": cty.NullVal(cty.Object(map[string]cty.Type{ + "name": cty.DynamicPseudoType, + })), }), "list": cty.ListVal([]cty.Value{ cty.ObjectVal(map[string]cty.Value{ "name": cty.NullVal(cty.String), }), + cty.NullVal(cty.Object(map[string]cty.Type{ + "name": cty.String, + })), + cty.NullVal(cty.Object(map[string]cty.Type{ + "name": cty.String, + })), }), "set": cty.SetVal([]cty.Value{ cty.ObjectVal(map[string]cty.Value{ @@ -1611,11 +1625,26 @@ func TestAssertPlanValid(t *testing.T) { "one": cty.ObjectVal(map[string]cty.Value{ "name": cty.StringVal("computed"), }), + // The config was null, but some providers may return a + // non-null object here, so we need to accept this for + // compatibility. + "two": cty.ObjectVal(map[string]cty.Value{ + "name": cty.NullVal(cty.String), + }), + "three": cty.NullVal(cty.Object(map[string]cty.Type{ + "name": cty.DynamicPseudoType, + })), }), "list": cty.ListVal([]cty.Value{ cty.ObjectVal(map[string]cty.Value{ "name": cty.StringVal("computed"), }), + cty.ObjectVal(map[string]cty.Value{ + "name": cty.NullVal(cty.String), + }), + cty.NullVal(cty.Object(map[string]cty.Type{ + "name": cty.String, + })), }), "set": cty.SetVal([]cty.Value{ cty.ObjectVal(map[string]cty.Value{ From 3a7150b27ef42ad9619d9c57683c9d4a85cbbb6e Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Wed, 17 Apr 2024 12:49:42 +0200 Subject: [PATCH 018/161] stacks: handle unknown values in component for_each --- .../internal/stackeval/component.go | 26 +- .../internal/stackeval/component_instance.go | 5 + .../internal/stackeval/component_test.go | 43 +-- .../internal/stackeval/for_each.go | 23 +- .../internal/stackeval/for_each_test.go | 250 +++++++++++---- .../internal/stackeval/provider.go | 2 +- .../internal/stackeval/stack_call.go | 2 +- .../internal/stackeval/walk_dynamic.go | 2 - internal/stacks/stackruntime/plan_test.go | 292 ++++++++++++++++++ ...ponent-for-each-from-component.tfstack.hcl | 37 +++ .../parent/parent.tf | 27 ++ .../self/self.tf | 23 ++ .../deferred-component-for-each.tfstack.hcl | 26 ++ 13 files changed, 658 insertions(+), 100 deletions(-) create mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/deferred-component-for-each-from-component.tfstack.hcl create mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/parent/parent.tf create mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/self/self.tf create mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/deferred-component-for-each/deferred-component-for-each.tfstack.hcl diff --git a/internal/stacks/stackruntime/internal/stackeval/component.go b/internal/stacks/stackruntime/internal/stackeval/component.go index e5c2dd9336..e964fde857 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component.go +++ b/internal/stacks/stackruntime/internal/stackeval/component.go @@ -116,17 +116,6 @@ func (c *Component) CheckForEachValue(ctx context.Context, phase EvalPhase) (cty return cty.DynamicVal, diags } - if !result.Value.IsKnown() { - // FIXME: We should somehow allow this and emit a - // "deferred change" representing all of the as-yet-unknown - // instances of this call and everything beneath it. - diags = diags.Append(result.Diagnostic( - tfdiags.Error, - "Invalid for_each value", - "The for_each value must not be derived from values that will be determined only during the apply phase.", - )) - } - return result.Value, diags default: @@ -174,7 +163,7 @@ func (c *Component) CheckInstances(ctx context.Context, phase EvalPhase) (map[ad ret := instancesMap(forEachVal, func(ik addrs.InstanceKey, rd instances.RepetitionData) *ComponentInstance { return newComponentInstance(c, ik, rd) - }) + }, true) addrs := make([]stackaddrs.AbsComponentInstance, 0, len(ret)) for _, ci := range ret { @@ -209,6 +198,12 @@ func (c *Component) ResultValue(ctx context.Context, phase EvalPhase) cty.Value return cty.DynamicVal } + if insts[addrs.WildcardKey] != nil { + // If the wildcard key is used the instance originates from an unknown + // for_each value, which means the result is unknown. + return cty.DynamicVal + } + // We expect that the instances all have string keys, which will // become the keys of a map that we're returning. elems := make(map[string]cty.Value, len(insts)) @@ -257,6 +252,12 @@ func (c *Component) PlanIsComplete(ctx context.Context) bool { return false } + if insts[addrs.WildcardKey] != nil { + // If the wildcard key is used the instance originates from an unknown + // for_each value, which means the result is unknown. + return false + } + for _, inst := range insts { plan := inst.ModuleTreePlan(ctx) if plan == nil { @@ -266,6 +267,7 @@ func (c *Component) PlanIsComplete(ctx context.Context) bool { // get returned by a different return path. return false } + if !plan.Complete { return false } diff --git a/internal/stacks/stackruntime/internal/stackeval/component_instance.go b/internal/stacks/stackruntime/internal/stackeval/component_instance.go index 6d1d3ef8e5..cbaa15226c 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_instance.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_instance.go @@ -576,6 +576,11 @@ func (c *ComponentInstance) CheckModuleTreePlan(ctx context.Context) (*plans.Pla } } + // The instance is also upstream deferred if the for_each value for this instance is unknown. + if c.key == addrs.WildcardKey { + upstreamDeferred = true + } + // NOTE: This ComponentInstance type only deals with component // instances currently declared in the configuration. See // [ComponentInstanceRemoved] for the model of a component instance diff --git a/internal/stacks/stackruntime/internal/stackeval/component_test.go b/internal/stacks/stackruntime/internal/stackeval/component_test.go index 0f5cd2769b..612fe48cad 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_test.go @@ -190,14 +190,12 @@ func TestComponentCheckInstances(t *testing.T) { } // When the for_each expression is invalid, CheckInstances should - // return nil to represent that we don't know enough to predict - // how many instances there are. This is a different result than - // when we know there are zero instances, which would be a non-nil - // empty map. + // return a single instance with dynamic values in the repetition data. + // We don't distinguish between invalid and unknown for_each values. gotInsts, diags := component.CheckInstances(ctx, InspectPhase) assertNoDiags(t, diags) - if gotInsts != nil { - t.Errorf("wrong instances; want nil\n%#v", gotInsts) + if got, want := len(gotInsts), 1; got != want { + t.Fatalf("wrong number of instances %d; want %d\n%#v", got, want, gotInsts) } }) subtestInPromisingTask(t, "unknown", func(ctx context.Context, t *testing.T) { @@ -208,30 +206,33 @@ func TestComponentCheckInstances(t *testing.T) { }, }) - // For now it's invalid to use an unknown value in for_each. - // Later we're expecting to make this succeed but announce that - // planning everything beneath this component must be deferred to a - // future plan after everything else has been applied first. component := getComponent(ctx, main) gotVal, diags := component.CheckForEachValue(ctx, InspectPhase) - assertMatchingDiag(t, diags, func(diag tfdiags.Diagnostic) bool { - return (diag.Severity() == tfdiags.Error && - diag.Description().Detail == "The for_each value must not be derived from values that will be determined only during the apply phase.") - }) + assertNoDiags(t, diags) + wantVal := cty.UnknownVal(cty.Map(cty.EmptyObject)) if !wantVal.RawEquals(gotVal) { t.Errorf("wrong result\ngot: %#v\nwant: %#v", gotVal, wantVal) } - // When the for_each expression is invalid, CheckInstances should - // return nil to represent that we don't know enough to predict - // how many instances there are. This is a different result than - // when we know there are zero instances, which would be a non-nil - // empty map. + // When the for_each expression is unknown, CheckInstances should + // return a single instance with dynamic values in the repetition data. gotInsts, diags := component.CheckInstances(ctx, InspectPhase) assertNoDiags(t, diags) - if gotInsts != nil { - t.Errorf("wrong instances; want nil\n%#v", gotInsts) + if got, want := len(gotInsts), 1; got != want { + t.Fatalf("wrong number of instances %d; want %d\n%#v", got, want, gotInsts) + } + + if gotInsts[addrs.WildcardKey] == nil { + t.Fatalf("missing expected addrs.WildcardKey instance\n%#v", gotInsts) + } + + if gotInsts[addrs.WildcardKey].repetition.EachKey.IsKnown() { + t.Errorf("EachKey should be unknown, but is known") + } + + if gotInsts[addrs.WildcardKey].repetition.EachValue.IsKnown() { + t.Errorf("EachValue should be unknown, but is known") } }) }) diff --git a/internal/stacks/stackruntime/internal/stackeval/for_each.go b/internal/stacks/stackruntime/internal/stackeval/for_each.go index 5c717e3eab..8be7d61ab5 100644 --- a/internal/stacks/stackruntime/internal/stackeval/for_each.go +++ b/internal/stacks/stackruntime/internal/stackeval/for_each.go @@ -145,7 +145,7 @@ func evaluateForEachExpr(ctx context.Context, expr hcl.Expression, phase EvalPha // If maybeForEach value is non-nil but not a valid value produced by // [evaluateForEachExpr] then the behavior is unpredictable, including the // possibility of a panic. -func instancesMap[T any](maybeForEachVal cty.Value, makeInst func(addrs.InstanceKey, instances.RepetitionData) T) map[addrs.InstanceKey]T { +func instancesMap[T any](maybeForEachVal cty.Value, makeInst func(addrs.InstanceKey, instances.RepetitionData) T, allowsUnknown bool) map[addrs.InstanceKey]T { switch { case maybeForEachVal == cty.NilVal: @@ -154,10 +154,12 @@ func instancesMap[T any](maybeForEachVal cty.Value, makeInst func(addrs.Instance return noForEachInstancesMap(makeInst) case !maybeForEachVal.IsKnown(): - // The for_each expression is too invalid for us to be able to - // know which instances exist. A totally nil map (as opposed to a - // non-nil map of length zero) signals that situation. - return nil + // This is temporary to gradually rollout support for unknown for_each values + if allowsUnknown { + return unknownForEachInstancesMap(makeInst) + } else { + return nil + } default: // Otherwise we should be able to assume the value is valid per the @@ -239,6 +241,17 @@ func noForEachInstancesMap[T any](makeInst func(addrs.InstanceKey, instances.Rep } } +func unknownForEachInstancesMap[T any](makeInst func(addrs.InstanceKey, instances.RepetitionData) T) map[addrs.InstanceKey]T { + return map[addrs.InstanceKey]T{ + addrs.WildcardKey: makeInst(addrs.WildcardKey, instances.RepetitionData{ + // As we don't know the for_each value, we can only provide dynamic values + // for the repetition symbols. + EachKey: cty.DynamicVal, + EachValue: cty.DynamicVal, + }), + } +} + // markSafeLengthInt allows calling LengthInt on marked values safely func markSafeLengthInt(val cty.Value) int { v, _ := val.UnmarkDeep() diff --git a/internal/stacks/stackruntime/internal/stackeval/for_each_test.go b/internal/stacks/stackruntime/internal/stackeval/for_each_test.go index 018d6849fc..34029bf85c 100644 --- a/internal/stacks/stackruntime/internal/stackeval/for_each_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/for_each_test.go @@ -178,10 +178,17 @@ func TestEvaluateForEachExpr(t *testing.T) { } func TestInstancesMap(t *testing.T) { + type InstanceObj struct { Key addrs.InstanceKey Rep instances.RepetitionData } + // This is a temporary nusiance while we gradually rollout support for + // unknown for_each values. + type Expectation struct { + UnknownForEachSupported map[addrs.InstanceKey]InstanceObj + UnknownForEachUnsupported map[addrs.InstanceKey]InstanceObj + } makeObj := func(k addrs.InstanceKey, r instances.RepetitionData) InstanceObj { return InstanceObj{ Key: k, @@ -191,7 +198,7 @@ func TestInstancesMap(t *testing.T) { tests := []struct { Input cty.Value - Want map[addrs.InstanceKey]InstanceObj + Want Expectation // This function always either succeeds or panics, because it // expects to be given already-validated input from another function. @@ -200,11 +207,21 @@ func TestInstancesMap(t *testing.T) { // No for_each at all { cty.NilVal, - map[addrs.InstanceKey]InstanceObj{ - addrs.NoKey: { - Key: addrs.NoKey, - Rep: instances.RepetitionData{ - // No data available for the non-repeating case + Expectation{ + UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ + addrs.NoKey: { + Key: addrs.NoKey, + Rep: instances.RepetitionData{ + // No data available for the non-repeating case + }, + }, + }, + UnknownForEachUnsupported: map[addrs.InstanceKey]InstanceObj{ + addrs.NoKey: { + Key: addrs.NoKey, + Rep: instances.RepetitionData{ + // No data available for the non-repeating case + }, }, }, }, @@ -213,40 +230,94 @@ func TestInstancesMap(t *testing.T) { // Unknowns { cty.UnknownVal(cty.EmptyObject), - nil, // a nil map means "unknown" for this function + Expectation{ + UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ + addrs.WildcardKey: { + Key: addrs.WildcardKey, + Rep: instances.RepetitionData{ + EachKey: cty.DynamicVal, + EachValue: cty.DynamicVal, + }, + }, + }, + UnknownForEachUnsupported: nil, // a nil map means "unknown" for this function + }, }, { cty.UnknownVal(cty.Map(cty.Bool)), - nil, // a nil map means "unknown" for this function + Expectation{ + UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ + addrs.WildcardKey: { + Key: addrs.WildcardKey, + Rep: instances.RepetitionData{ + EachKey: cty.DynamicVal, + EachValue: cty.DynamicVal, + }, + }, + }, + UnknownForEachUnsupported: nil, // a nil map means "unknown" for this function + }, }, { cty.UnknownVal(cty.Set(cty.String)), - nil, // a nil map means "unknown" for this function + Expectation{ + UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ + addrs.WildcardKey: { + Key: addrs.WildcardKey, + Rep: instances.RepetitionData{ + EachKey: cty.DynamicVal, + EachValue: cty.DynamicVal, + }, + }, + }, + UnknownForEachUnsupported: nil, // a nil map means "unknown" for this function + }, }, // Empties { cty.EmptyObjectVal, - map[addrs.InstanceKey]InstanceObj{ - // intentionally a non-nil empty map to assert that we know - // that there are zero instances, rather than that we don't - // know how many there are. + Expectation{ + UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ + // intentionally a non-nil empty map to assert that we know + // that there are zero instances, rather than that we don't + // know how many there are. + }, + UnknownForEachUnsupported: map[addrs.InstanceKey]InstanceObj{ + // intentionally a non-nil empty map to assert that we know + // that there are zero instances, rather than that we don't + // know how many there are. + }, }, }, { cty.MapValEmpty(cty.String), - map[addrs.InstanceKey]InstanceObj{ - // intentionally a non-nil empty map to assert that we know - // that there are zero instances, rather than that we don't - // know how many there are. + Expectation{ + UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ + // intentionally a non-nil empty map to assert that we know + // that there are zero instances, rather than that we don't + // know how many there are. + }, + UnknownForEachUnsupported: map[addrs.InstanceKey]InstanceObj{ + // intentionally a non-nil empty map to assert that we know + // that there are zero instances, rather than that we don't + // know how many there are. + }, }, }, { cty.SetValEmpty(cty.String), - map[addrs.InstanceKey]InstanceObj{ - // intentionally a non-nil empty map to assert that we know - // that there are zero instances, rather than that we don't - // know how many there are. + Expectation{ + UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ + // intentionally a non-nil empty map to assert that we know + // that there are zero instances, rather than that we don't + // know how many there are. + }, + UnknownForEachUnsupported: map[addrs.InstanceKey]InstanceObj{ + // intentionally a non-nil empty map to assert that we know + // that there are zero instances, rather than that we don't + // know how many there are. + }, }, }, @@ -256,19 +327,37 @@ func TestInstancesMap(t *testing.T) { "a": cty.StringVal("beep"), "b": cty.StringVal("boop"), }), - map[addrs.InstanceKey]InstanceObj{ - addrs.StringKey("a"): { - Key: addrs.StringKey("a"), - Rep: instances.RepetitionData{ - EachKey: cty.StringVal("a"), - EachValue: cty.StringVal("beep"), + Expectation{ + UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ + addrs.StringKey("a"): { + Key: addrs.StringKey("a"), + Rep: instances.RepetitionData{ + EachKey: cty.StringVal("a"), + EachValue: cty.StringVal("beep"), + }, + }, + addrs.StringKey("b"): { + Key: addrs.StringKey("b"), + Rep: instances.RepetitionData{ + EachKey: cty.StringVal("b"), + EachValue: cty.StringVal("boop"), + }, }, }, - addrs.StringKey("b"): { - Key: addrs.StringKey("b"), - Rep: instances.RepetitionData{ - EachKey: cty.StringVal("b"), - EachValue: cty.StringVal("boop"), + UnknownForEachUnsupported: map[addrs.InstanceKey]InstanceObj{ + addrs.StringKey("a"): { + Key: addrs.StringKey("a"), + Rep: instances.RepetitionData{ + EachKey: cty.StringVal("a"), + EachValue: cty.StringVal("beep"), + }, + }, + addrs.StringKey("b"): { + Key: addrs.StringKey("b"), + Rep: instances.RepetitionData{ + EachKey: cty.StringVal("b"), + EachValue: cty.StringVal("boop"), + }, }, }, }, @@ -278,19 +367,37 @@ func TestInstancesMap(t *testing.T) { "a": cty.StringVal("beep"), "b": cty.StringVal("boop"), }), - map[addrs.InstanceKey]InstanceObj{ - addrs.StringKey("a"): { - Key: addrs.StringKey("a"), - Rep: instances.RepetitionData{ - EachKey: cty.StringVal("a"), - EachValue: cty.StringVal("beep"), + Expectation{ + UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ + addrs.StringKey("a"): { + Key: addrs.StringKey("a"), + Rep: instances.RepetitionData{ + EachKey: cty.StringVal("a"), + EachValue: cty.StringVal("beep"), + }, + }, + addrs.StringKey("b"): { + Key: addrs.StringKey("b"), + Rep: instances.RepetitionData{ + EachKey: cty.StringVal("b"), + EachValue: cty.StringVal("boop"), + }, }, }, - addrs.StringKey("b"): { - Key: addrs.StringKey("b"), - Rep: instances.RepetitionData{ - EachKey: cty.StringVal("b"), - EachValue: cty.StringVal("boop"), + UnknownForEachUnsupported: map[addrs.InstanceKey]InstanceObj{ + addrs.StringKey("a"): { + Key: addrs.StringKey("a"), + Rep: instances.RepetitionData{ + EachKey: cty.StringVal("a"), + EachValue: cty.StringVal("beep"), + }, + }, + addrs.StringKey("b"): { + Key: addrs.StringKey("b"), + Rep: instances.RepetitionData{ + EachKey: cty.StringVal("b"), + EachValue: cty.StringVal("boop"), + }, }, }, }, @@ -300,19 +407,37 @@ func TestInstancesMap(t *testing.T) { cty.StringVal("beep"), cty.StringVal("boop"), }), - map[addrs.InstanceKey]InstanceObj{ - addrs.StringKey("beep"): { - Key: addrs.StringKey("beep"), - Rep: instances.RepetitionData{ - EachKey: cty.StringVal("beep"), - EachValue: cty.StringVal("beep"), + Expectation{ + UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ + addrs.StringKey("beep"): { + Key: addrs.StringKey("beep"), + Rep: instances.RepetitionData{ + EachKey: cty.StringVal("beep"), + EachValue: cty.StringVal("beep"), + }, + }, + addrs.StringKey("boop"): { + Key: addrs.StringKey("boop"), + Rep: instances.RepetitionData{ + EachKey: cty.StringVal("boop"), + EachValue: cty.StringVal("boop"), + }, }, }, - addrs.StringKey("boop"): { - Key: addrs.StringKey("boop"), - Rep: instances.RepetitionData{ - EachKey: cty.StringVal("boop"), - EachValue: cty.StringVal("boop"), + UnknownForEachUnsupported: map[addrs.InstanceKey]InstanceObj{ + addrs.StringKey("beep"): { + Key: addrs.StringKey("beep"), + Rep: instances.RepetitionData{ + EachKey: cty.StringVal("beep"), + EachValue: cty.StringVal("beep"), + }, + }, + addrs.StringKey("boop"): { + Key: addrs.StringKey("boop"), + Rep: instances.RepetitionData{ + EachKey: cty.StringVal("boop"), + EachValue: cty.StringVal("boop"), + }, }, }, }, @@ -321,11 +446,20 @@ func TestInstancesMap(t *testing.T) { for _, test := range tests { t.Run(fmt.Sprintf("%s", test.Input), func(t *testing.T) { - got := instancesMap(test.Input, makeObj) + t.Run("unknown for_each supported", func(t *testing.T) { + got := instancesMap(test.Input, makeObj, true) - if diff := cmp.Diff(test.Want, got, ctydebug.CmpOptions); diff != "" { - t.Errorf("wrong result\ninput: %#v\n%s", test.Input, diff) - } + if diff := cmp.Diff(test.Want.UnknownForEachSupported, got, ctydebug.CmpOptions); diff != "" { + t.Errorf("wrong result\ninput: %#v\n%s", test.Input, diff) + } + }) + t.Run("unknown for_each unsupported", func(t *testing.T) { + got := instancesMap(test.Input, makeObj, false) + + if diff := cmp.Diff(test.Want.UnknownForEachUnsupported, got, ctydebug.CmpOptions); diff != "" { + t.Errorf("wrong result\ninput: %#v\n%s", test.Input, diff) + } + }) }) } } diff --git a/internal/stacks/stackruntime/internal/stackeval/provider.go b/internal/stacks/stackruntime/internal/stackeval/provider.go index b3d83c244f..c5c9990829 100644 --- a/internal/stacks/stackruntime/internal/stackeval/provider.go +++ b/internal/stacks/stackruntime/internal/stackeval/provider.go @@ -181,7 +181,7 @@ func (p *Provider) CheckInstances(ctx context.Context, phase EvalPhase) (map[add forEachVal := p.ForEachValue(ctx, phase) return instancesMap(forEachVal, func(ik addrs.InstanceKey, rd instances.RepetitionData) *ProviderInstance { return newProviderInstance(p, ik, rd) - }), diags + }, false), diags }, ) } diff --git a/internal/stacks/stackruntime/internal/stackeval/stack_call.go b/internal/stacks/stackruntime/internal/stackeval/stack_call.go index 9a384b05b5..49f36ff151 100644 --- a/internal/stacks/stackruntime/internal/stackeval/stack_call.go +++ b/internal/stacks/stackruntime/internal/stackeval/stack_call.go @@ -167,7 +167,7 @@ func (c *StackCall) CheckInstances(ctx context.Context, phase EvalPhase) (map[ad return instancesMap(forEachVal, func(ik addrs.InstanceKey, rd instances.RepetitionData) *StackCallInstance { return newStackCallInstance(c, ik, rd) - }), diags + }, false), diags }, ) } diff --git a/internal/stacks/stackruntime/internal/stackeval/walk_dynamic.go b/internal/stacks/stackruntime/internal/stackeval/walk_dynamic.go index 7d6b9188e8..92ed14b189 100644 --- a/internal/stacks/stackruntime/internal/stackeval/walk_dynamic.go +++ b/internal/stacks/stackruntime/internal/stackeval/walk_dynamic.go @@ -70,10 +70,8 @@ func walkDynamicObjectsInStack[Output any]( // We also need to visit and check all of the other declarations in // the current stack. - for _, component := range stack.Components(ctx) { component := component // separate symbol per loop iteration - visit(ctx, walk, component) // We need to perform the instance expansion in an overall async task diff --git a/internal/stacks/stackruntime/plan_test.go b/internal/stacks/stackruntime/plan_test.go index f7179a49b1..9e68b5c6ea 100644 --- a/internal/stacks/stackruntime/plan_test.go +++ b/internal/stacks/stackruntime/plan_test.go @@ -1574,6 +1574,298 @@ func TestPlanWithCheckableObjects(t *testing.T) { } } +func TestPlanWithDeferredComponentForEach(t *testing.T) { + ctx := context.Background() + cfg := loadMainBundleConfigForTest(t, path.Join("with-single-input", "deferred-component-for-each")) + + fakePlanTimestamp, err := time.Parse(time.RFC3339, "1991-08-25T20:57:08Z") + if err != nil { + t.Fatal(err) + } + + changesCh := make(chan stackplan.PlannedChange, 8) + diagsCh := make(chan tfdiags.Diagnostic, 2) + req := PlanRequest{ + Config: cfg, + ProviderFactories: map[addrs.Provider]providers.Factory{ + addrs.NewDefaultProvider("testing"): func() (providers.Interface, error) { + return stacks_testing_provider.NewProvider(), nil + }, + }, + ForcePlanTimestamp: &fakePlanTimestamp, + InputValues: map[stackaddrs.InputVariable]ExternalInputValue{ + {Name: "components"}: { + Value: cty.UnknownVal(cty.Set(cty.String)), + DefRange: tfdiags.SourceRange{}, + }, + }, + } + resp := PlanResponse{ + PlannedChanges: changesCh, + Diagnostics: diagsCh, + } + go Plan(ctx, &req, &resp) + gotChanges, diags := collectPlanOutput(changesCh, diagsCh) + + reportDiagnosticsForTest(t, diags) + if len(diags) != 0 { + t.FailNow() // We reported the diags above/ + } + + sort.SliceStable(gotChanges, func(i, j int) bool { + return plannedChangeSortKey(gotChanges[i]) < plannedChangeSortKey(gotChanges[j]) + }) + + wantChanges := []stackplan.PlannedChange{ + &stackplan.PlannedChangeApplyable{ + Applyable: true, + }, + &stackplan.PlannedChangeComponentInstance{ + Addr: stackaddrs.Absolute( + stackaddrs.RootStackInstance, + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "self"}, + Key: addrs.WildcardKey, + }, + ), + PlanApplyable: true, + PlanComplete: true, + Action: plans.Create, + PlannedInputValues: map[string]plans.DynamicValue{ + "id": mustPlanDynamicValueDynamicType(cty.NullVal(cty.String)), + "input": mustPlanDynamicValueDynamicType(cty.UnknownVal(cty.String)), + }, + PlannedOutputValues: map[string]cty.Value{}, + PlannedCheckResults: &states.CheckResults{}, + PlanTimestamp: fakePlanTimestamp, + PlannedInputValueMarks: map[string][]cty.PathValueMarks{ + "id": nil, + "input": nil, + }, + }, + &stackplan.PlannedChangeResourceInstancePlanned{ + ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ + Component: stackaddrs.Absolute( + stackaddrs.RootStackInstance, + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "self"}, + Key: addrs.WildcardKey, + }, + ), + Item: addrs.AbsResourceInstanceObject{ + ResourceInstance: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + }, + }, + ProviderConfigAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: &plans.ResourceInstanceChangeSrc{ + Addr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + PrevRunAddr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + ProviderAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: plans.ChangeSrc{ + Action: plans.Create, + Before: mustPlanDynamicValue(cty.NullVal(cty.DynamicPseudoType)), + After: mustPlanDynamicValueSchema(cty.ObjectVal(map[string]cty.Value{ + "id": cty.UnknownVal(cty.String), + "value": cty.UnknownVal(cty.String), + }), stacks_testing_provider.TestingResourceSchema), + AfterSensitivePaths: nil, + }, + }, + Schema: stacks_testing_provider.TestingResourceSchema, + }, + &stackplan.PlannedChangeHeader{ + TerraformVersion: version.SemVer, + }, + &stackplan.PlannedChangeRootInputValue{ + Addr: stackaddrs.InputVariable{Name: "components"}, + Value: cty.UnknownVal(cty.Set(cty.String)), + }, + } + + if diff := cmp.Diff(wantChanges, gotChanges, ctydebug.CmpOptions, cmpCollectionsSet); diff != "" { + t.Errorf("wrong changes\n%s", diff) + } +} + +func TestPlanWithDeferredComponentForEachDueToParentComponentOutput(t *testing.T) { + ctx := context.Background() + cfg := loadMainBundleConfigForTest(t, "deferred-component-for-each-from-component") + + fakePlanTimestamp, err := time.Parse(time.RFC3339, "1991-08-25T20:57:08Z") + if err != nil { + t.Fatal(err) + } + + changesCh := make(chan stackplan.PlannedChange, 8) + diagsCh := make(chan tfdiags.Diagnostic, 2) + req := PlanRequest{ + Config: cfg, + ProviderFactories: map[addrs.Provider]providers.Factory{ + addrs.NewDefaultProvider("testing"): func() (providers.Interface, error) { + return stacks_testing_provider.NewProvider(), nil + }, + }, + + ForcePlanTimestamp: &fakePlanTimestamp, + + InputValues: map[stackaddrs.InputVariable]ExternalInputValue{ + {Name: "components"}: { + Value: cty.UnknownVal(cty.Set(cty.String)), + DefRange: tfdiags.SourceRange{}, + }, + }, + } + resp := PlanResponse{ + PlannedChanges: changesCh, + Diagnostics: diagsCh, + } + go Plan(ctx, &req, &resp) + gotChanges, diags := collectPlanOutput(changesCh, diagsCh) + + reportDiagnosticsForTest(t, diags) + if len(diags) != 0 { + t.FailNow() // We reported the diags above/ + } + + sort.SliceStable(gotChanges, func(i, j int) bool { + return plannedChangeSortKey(gotChanges[i]) < plannedChangeSortKey(gotChanges[j]) + }) + + wantChanges := []stackplan.PlannedChange{ + &stackplan.PlannedChangeApplyable{ + Applyable: true, + }, + &stackplan.PlannedChangeComponentInstance{ + Addr: stackaddrs.Absolute( + stackaddrs.RootStackInstance, + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "parent"}, + }, + ), + PlanApplyable: true, + PlanComplete: true, + Action: plans.Create, + PlannedInputValues: map[string]plans.DynamicValue{ + "id": mustPlanDynamicValueDynamicType(cty.NullVal(cty.String)), + "input": mustPlanDynamicValueDynamicType(cty.StringVal("parent")), + }, + PlannedOutputValues: map[string]cty.Value{ + "letters_in_id": cty.UnknownVal(cty.Set(cty.DynamicPseudoType)), + }, + PlannedCheckResults: &states.CheckResults{}, + PlanTimestamp: fakePlanTimestamp, + PlannedInputValueMarks: map[string][]cty.PathValueMarks{ + "id": nil, + "input": nil, + }, + }, + &stackplan.PlannedChangeResourceInstancePlanned{ + ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ + Component: stackaddrs.Absolute( + stackaddrs.RootStackInstance, + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "parent"}, + }, + ), + Item: addrs.AbsResourceInstanceObject{ + ResourceInstance: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + }, + }, + ProviderConfigAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: &plans.ResourceInstanceChangeSrc{ + Addr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + PrevRunAddr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + ProviderAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: plans.ChangeSrc{ + Action: plans.Create, + Before: mustPlanDynamicValue(cty.NullVal(cty.DynamicPseudoType)), + After: plans.DynamicValue{ + // This is ignored for this test + }, + }, + }, + Schema: stacks_testing_provider.TestingResourceSchema, + }, + &stackplan.PlannedChangeComponentInstance{ + Addr: stackaddrs.Absolute( + stackaddrs.RootStackInstance, + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "self"}, + Key: addrs.WildcardKey, + }, + ), + PlanApplyable: false, + PlanComplete: true, + Action: plans.Create, + RequiredComponents: collections.NewSet[stackaddrs.AbsComponent]( + stackaddrs.AbsComponent{ + Stack: stackaddrs.RootStackInstance, + Item: stackaddrs.Component{Name: "parent"}, + }, + ), + PlannedInputValues: map[string]plans.DynamicValue{ + "id": mustPlanDynamicValueDynamicType(cty.NullVal(cty.String)), + "input": mustPlanDynamicValueDynamicType(cty.UnknownVal(cty.String)), + }, + PlannedOutputValues: map[string]cty.Value{}, + PlannedCheckResults: &states.CheckResults{}, + PlanTimestamp: fakePlanTimestamp, + PlannedInputValueMarks: map[string][]cty.PathValueMarks{ + "id": nil, + "input": nil, + }, + }, + &stackplan.PlannedChangeHeader{ + TerraformVersion: version.SemVer, + }, + } + + // Ignore dynamic value + gotChanges[2].(*stackplan.PlannedChangeResourceInstancePlanned).ChangeSrc.After = wantChanges[2].(*stackplan.PlannedChangeResourceInstancePlanned).ChangeSrc.After + + if diff := cmp.Diff(wantChanges, gotChanges, ctydebug.CmpOptions, cmpCollectionsSet); diff != "" { + t.Errorf("wrong changes\n%s", diff) + } +} + +// TODO: Test that we throw diagnostics if the output used in component for each has a non-set type + // collectPlanOutput consumes the two output channels emitting results from // a call to [Plan], and collects all of the data written to them before // returning once changesCh has been closed by the sender to indicate that diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/deferred-component-for-each-from-component.tfstack.hcl b/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/deferred-component-for-each-from-component.tfstack.hcl new file mode 100644 index 0000000000..a544348cfe --- /dev/null +++ b/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/deferred-component-for-each-from-component.tfstack.hcl @@ -0,0 +1,37 @@ +required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } +} + + +provider "testing" "default" {} + + +component "parent" { + source = "./parent" + + providers = { + testing = provider.testing.default + } + + inputs = { + input = "parent" + } +} + + +component "self" { + source = "./self" + + providers = { + testing = provider.testing.default + } + + inputs = { + input = each.value + } + + for_each = component.parent.letters_in_id +} diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/parent/parent.tf b/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/parent/parent.tf new file mode 100644 index 0000000000..315721bc52 --- /dev/null +++ b/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/parent/parent.tf @@ -0,0 +1,27 @@ +terraform { + required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } + } +} + +variable "id" { + type = string + default = null + nullable = true # We'll generate an ID if none provided. +} + +variable "input" { + type = string +} + +resource "testing_resource" "data" { + id = var.id + value = var.input +} + +output "letters_in_id" { + value = toset(split("", testing_resource.data.id)) +} diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/self/self.tf b/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/self/self.tf new file mode 100644 index 0000000000..4da49727a5 --- /dev/null +++ b/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/self/self.tf @@ -0,0 +1,23 @@ +terraform { + required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } + } +} + +variable "id" { + type = string + default = null + nullable = true # We'll generate an ID if none provided. +} + +variable "input" { + type = string +} + +resource "testing_resource" "data" { + id = var.id + value = var.input +} diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/deferred-component-for-each/deferred-component-for-each.tfstack.hcl b/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/deferred-component-for-each/deferred-component-for-each.tfstack.hcl new file mode 100644 index 0000000000..be31797b6f --- /dev/null +++ b/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/deferred-component-for-each/deferred-component-for-each.tfstack.hcl @@ -0,0 +1,26 @@ +required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } +} + +variable "components" { + type = set(string) +} + +provider "testing" "default" {} + +component "self" { + source = "../" + + providers = { + testing = provider.testing.default + } + + inputs = { + input = each.value + } + + for_each = var.components +} From 3cbfd397219d01e8051d1740b616f6e12558de03 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Fri, 19 Apr 2024 12:50:08 +0200 Subject: [PATCH 019/161] stacks: validate unknown component for_each type --- .../internal/stackeval/for_each.go | 14 +- internal/stacks/stackruntime/plan_test.go | 135 ++---------------- ...rom-component-of-invalid-type.tfstack.hcl" | 37 +++++ .../parent/parent.tf | 27 ++++ .../self/self.tf | 23 +++ 5 files changed, 106 insertions(+), 130 deletions(-) create mode 100644 "internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/\020deferred-component-for-each-from-component-of-invalid-type.tfstack.hcl" create mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/parent/parent.tf create mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/self/self.tf diff --git a/internal/stacks/stackruntime/internal/stackeval/for_each.go b/internal/stacks/stackruntime/internal/stackeval/for_each.go index 8be7d61ab5..90f9f9dced 100644 --- a/internal/stacks/stackruntime/internal/stackeval/for_each.go +++ b/internal/stacks/stackruntime/internal/stackeval/for_each.go @@ -69,22 +69,18 @@ func evaluateForEachExpr(ctx context.Context, expr hcl.Expression, phase EvalPha case ty.IsObjectType() || ty.IsMapType(): // okay - case !result.Value.IsKnown(): - // we can't validate further without knowing the value - return result, diags - case ty.IsSetType(): - if markSafeLengthInt(result.Value) == 0 { - // we are okay with an empty set - return result, diags - } - // since we can't use a set values that are unknown, we treat the // entire set as unknown if !result.Value.IsWhollyKnown() { return result, diags } + if markSafeLengthInt(result.Value) == 0 { + // we are okay with an empty set + return result, diags + } + if !ty.ElementType().Equals(cty.String) { diags = diags.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, diff --git a/internal/stacks/stackruntime/plan_test.go b/internal/stacks/stackruntime/plan_test.go index 9e68b5c6ea..ad5bf7c87b 100644 --- a/internal/stacks/stackruntime/plan_test.go +++ b/internal/stacks/stackruntime/plan_test.go @@ -1705,9 +1705,9 @@ func TestPlanWithDeferredComponentForEach(t *testing.T) { } } -func TestPlanWithDeferredComponentForEachDueToParentComponentOutput(t *testing.T) { +func TestPlanWithDeferredComponentForEachOfInvalidType(t *testing.T) { ctx := context.Background() - cfg := loadMainBundleConfigForTest(t, "deferred-component-for-each-from-component") + cfg := loadMainBundleConfigForTest(t, "deferred-component-for-each-from-component-of-invalid-type") fakePlanTimestamp, err := time.Parse(time.RFC3339, "1991-08-25T20:57:08Z") if err != nil { @@ -1738,134 +1738,27 @@ func TestPlanWithDeferredComponentForEachDueToParentComponentOutput(t *testing.T Diagnostics: diagsCh, } go Plan(ctx, &req, &resp) - gotChanges, diags := collectPlanOutput(changesCh, diagsCh) + _, diags := collectPlanOutput(changesCh, diagsCh) - reportDiagnosticsForTest(t, diags) - if len(diags) != 0 { - t.FailNow() // We reported the diags above/ + if len(diags) != 1 { + t.Fatalf("expected 1 diagnostic, got %d: %s", len(diags), diags) } - sort.SliceStable(gotChanges, func(i, j int) bool { - return plannedChangeSortKey(gotChanges[i]) < plannedChangeSortKey(gotChanges[j]) - }) - - wantChanges := []stackplan.PlannedChange{ - &stackplan.PlannedChangeApplyable{ - Applyable: true, - }, - &stackplan.PlannedChangeComponentInstance{ - Addr: stackaddrs.Absolute( - stackaddrs.RootStackInstance, - stackaddrs.ComponentInstance{ - Component: stackaddrs.Component{Name: "parent"}, - }, - ), - PlanApplyable: true, - PlanComplete: true, - Action: plans.Create, - PlannedInputValues: map[string]plans.DynamicValue{ - "id": mustPlanDynamicValueDynamicType(cty.NullVal(cty.String)), - "input": mustPlanDynamicValueDynamicType(cty.StringVal("parent")), - }, - PlannedOutputValues: map[string]cty.Value{ - "letters_in_id": cty.UnknownVal(cty.Set(cty.DynamicPseudoType)), - }, - PlannedCheckResults: &states.CheckResults{}, - PlanTimestamp: fakePlanTimestamp, - PlannedInputValueMarks: map[string][]cty.PathValueMarks{ - "id": nil, - "input": nil, - }, - }, - &stackplan.PlannedChangeResourceInstancePlanned{ - ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ - Component: stackaddrs.Absolute( - stackaddrs.RootStackInstance, - stackaddrs.ComponentInstance{ - Component: stackaddrs.Component{Name: "parent"}, - }, - ), - Item: addrs.AbsResourceInstanceObject{ - ResourceInstance: addrs.Resource{ - Mode: addrs.ManagedResourceMode, - Type: "testing_resource", - Name: "data", - }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), - }, - }, - ProviderConfigAddr: addrs.AbsProviderConfig{ - Module: addrs.RootModule, - Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), - }, - ChangeSrc: &plans.ResourceInstanceChangeSrc{ - Addr: addrs.Resource{ - Mode: addrs.ManagedResourceMode, - Type: "testing_resource", - Name: "data", - }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), - PrevRunAddr: addrs.Resource{ - Mode: addrs.ManagedResourceMode, - Type: "testing_resource", - Name: "data", - }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), - ProviderAddr: addrs.AbsProviderConfig{ - Module: addrs.RootModule, - Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), - }, - ChangeSrc: plans.ChangeSrc{ - Action: plans.Create, - Before: mustPlanDynamicValue(cty.NullVal(cty.DynamicPseudoType)), - After: plans.DynamicValue{ - // This is ignored for this test - }, - }, - }, - Schema: stacks_testing_provider.TestingResourceSchema, - }, - &stackplan.PlannedChangeComponentInstance{ - Addr: stackaddrs.Absolute( - stackaddrs.RootStackInstance, - stackaddrs.ComponentInstance{ - Component: stackaddrs.Component{Name: "self"}, - Key: addrs.WildcardKey, - }, - ), - PlanApplyable: false, - PlanComplete: true, - Action: plans.Create, - RequiredComponents: collections.NewSet[stackaddrs.AbsComponent]( - stackaddrs.AbsComponent{ - Stack: stackaddrs.RootStackInstance, - Item: stackaddrs.Component{Name: "parent"}, - }, - ), - PlannedInputValues: map[string]plans.DynamicValue{ - "id": mustPlanDynamicValueDynamicType(cty.NullVal(cty.String)), - "input": mustPlanDynamicValueDynamicType(cty.UnknownVal(cty.String)), - }, - PlannedOutputValues: map[string]cty.Value{}, - PlannedCheckResults: &states.CheckResults{}, - PlanTimestamp: fakePlanTimestamp, - PlannedInputValueMarks: map[string][]cty.PathValueMarks{ - "id": nil, - "input": nil, - }, - }, - &stackplan.PlannedChangeHeader{ - TerraformVersion: version.SemVer, - }, + if diags[0].Severity() != tfdiags.Error { + t.Errorf("expected error diagnostic, got %q", diags[0].Severity()) } - // Ignore dynamic value - gotChanges[2].(*stackplan.PlannedChangeResourceInstancePlanned).ChangeSrc.After = wantChanges[2].(*stackplan.PlannedChangeResourceInstancePlanned).ChangeSrc.After + expectedSummary := "Invalid for_each value" + if diags[0].Description().Summary != expectedSummary { + t.Errorf("expected diagnostic with summary %q, got %q", expectedSummary, diags[0].Description().Summary) + } - if diff := cmp.Diff(wantChanges, gotChanges, ctydebug.CmpOptions, cmpCollectionsSet); diff != "" { - t.Errorf("wrong changes\n%s", diff) + expectedDetail := "The for_each expression must produce either a map of any type or a set of strings. The keys of the map or the set elements will serve as unique identifiers for multiple instances of this component." + if diags[0].Description().Detail != expectedDetail { + t.Errorf("expected diagnostic with detail %q, got %q", expectedDetail, diags[0].Description().Detail) } } -// TODO: Test that we throw diagnostics if the output used in component for each has a non-set type - // collectPlanOutput consumes the two output channels emitting results from // a call to [Plan], and collects all of the data written to them before // returning once changesCh has been closed by the sender to indicate that diff --git "a/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/\020deferred-component-for-each-from-component-of-invalid-type.tfstack.hcl" "b/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/\020deferred-component-for-each-from-component-of-invalid-type.tfstack.hcl" new file mode 100644 index 0000000000..4ace97c011 --- /dev/null +++ "b/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/\020deferred-component-for-each-from-component-of-invalid-type.tfstack.hcl" @@ -0,0 +1,37 @@ +required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } +} + + +provider "testing" "default" {} + + +component "parent" { + source = "./parent" + + providers = { + testing = provider.testing.default + } + + inputs = { + input = "parent" + } +} + + +component "self" { + source = "./self" + + providers = { + testing = provider.testing.default + } + + inputs = { + input = each.value + } + + for_each = component.parent.letters_in_id // This is a list and no set or map +} diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/parent/parent.tf b/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/parent/parent.tf new file mode 100644 index 0000000000..006a3818fe --- /dev/null +++ b/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/parent/parent.tf @@ -0,0 +1,27 @@ +terraform { + required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } + } +} + +variable "id" { + type = string + default = null + nullable = true # We'll generate an ID if none provided. +} + +variable "input" { + type = string +} + +resource "testing_resource" "data" { + id = var.id + value = var.input +} + +output "letters_in_id" { + value = split("", testing_resource.data.id) +} diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/self/self.tf b/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/self/self.tf new file mode 100644 index 0000000000..4da49727a5 --- /dev/null +++ b/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/self/self.tf @@ -0,0 +1,23 @@ +terraform { + required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } + } +} + +variable "id" { + type = string + default = null + nullable = true # We'll generate an ID if none provided. +} + +variable "input" { + type = string +} + +resource "testing_resource" "data" { + id = var.id + value = var.input +} From 6f95225a91d67e544bfcafd2314ad0b49c1328f5 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Thu, 25 Apr 2024 15:18:11 +0200 Subject: [PATCH 020/161] stacks: handle unknown dynamic values --- .../internal/stackeval/for_each.go | 6 +++++ .../internal/stackeval/for_each_test.go | 22 +++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/internal/stacks/stackruntime/internal/stackeval/for_each.go b/internal/stacks/stackruntime/internal/stackeval/for_each.go index 90f9f9dced..ce1ca5497f 100644 --- a/internal/stacks/stackruntime/internal/stackeval/for_each.go +++ b/internal/stacks/stackruntime/internal/stackeval/for_each.go @@ -107,6 +107,12 @@ func evaluateForEachExpr(ctx context.Context, expr hcl.Expression, phase EvalPha } } + case !result.Value.IsWhollyKnown() && ty.HasDynamicTypes(): + // If the value is unknown and has dynamic types, we can't + // determine if it's a valid for_each value, so we'll just + // return the unknown value. + return result, diags + default: diags = diags.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, diff --git a/internal/stacks/stackruntime/internal/stackeval/for_each_test.go b/internal/stacks/stackruntime/internal/stackeval/for_each_test.go index 34029bf85c..9d4ee070cf 100644 --- a/internal/stacks/stackruntime/internal/stackeval/for_each_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/for_each_test.go @@ -41,10 +41,6 @@ func TestEvaluateForEachExpr(t *testing.T) { "b": cty.StringVal("beep"), }), }, - "unknown object": { - Expr: hcltest.MockExprLiteral(cty.UnknownVal(cty.EmptyObject)), - Want: cty.UnknownVal(cty.EmptyObject), - }, // Maps "map of string": { @@ -137,6 +133,24 @@ func TestEvaluateForEachExpr(t *testing.T) { Expr: hcltest.MockExprLiteral(cty.NullVal(cty.String)), WantErr: `Invalid for_each value`, }, + + // Unknown sets, maps, objects, and dynamic types are allowed + "unknown set": { + Expr: hcltest.MockExprLiteral(cty.UnknownVal(cty.Set(cty.String))), + Want: cty.UnknownVal(cty.Set(cty.String)), + }, + "unknown map": { + Expr: hcltest.MockExprLiteral(cty.UnknownVal(cty.Map(cty.String))), + Want: cty.UnknownVal(cty.Map(cty.String)), + }, + "unknown object": { + Expr: hcltest.MockExprLiteral(cty.UnknownVal(cty.EmptyObject)), + Want: cty.UnknownVal(cty.EmptyObject), + }, + "unknown dynamic type": { + Expr: hcltest.MockExprLiteral(cty.DynamicVal), + Want: cty.DynamicVal, + }, } ctx := context.Background() From d1168ffa62e0b4b3156235ea0902ceb958b5addb Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Thu, 25 Apr 2024 16:35:19 +0200 Subject: [PATCH 021/161] stacks: return instance value for wildcard component instances --- .../stacks/stackruntime/internal/stackeval/component.go | 6 ------ internal/stacks/stackruntime/internal/stackeval/for_each.go | 1 - 2 files changed, 7 deletions(-) diff --git a/internal/stacks/stackruntime/internal/stackeval/component.go b/internal/stacks/stackruntime/internal/stackeval/component.go index e964fde857..45d1d07eb5 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component.go +++ b/internal/stacks/stackruntime/internal/stackeval/component.go @@ -198,12 +198,6 @@ func (c *Component) ResultValue(ctx context.Context, phase EvalPhase) cty.Value return cty.DynamicVal } - if insts[addrs.WildcardKey] != nil { - // If the wildcard key is used the instance originates from an unknown - // for_each value, which means the result is unknown. - return cty.DynamicVal - } - // We expect that the instances all have string keys, which will // become the keys of a map that we're returning. elems := make(map[string]cty.Value, len(insts)) diff --git a/internal/stacks/stackruntime/internal/stackeval/for_each.go b/internal/stacks/stackruntime/internal/stackeval/for_each.go index ce1ca5497f..c8a5a9534c 100644 --- a/internal/stacks/stackruntime/internal/stackeval/for_each.go +++ b/internal/stacks/stackruntime/internal/stackeval/for_each.go @@ -149,7 +149,6 @@ func evaluateForEachExpr(ctx context.Context, expr hcl.Expression, phase EvalPha // possibility of a panic. func instancesMap[T any](maybeForEachVal cty.Value, makeInst func(addrs.InstanceKey, instances.RepetitionData) T, allowsUnknown bool) map[addrs.InstanceKey]T { switch { - case maybeForEachVal == cty.NilVal: // No for_each expression at all, then. We have exactly one instance // without an instance key and with no repetition data. From 7d0c4cfc4d7af20dcb13dc6cadd25d980a6e745c Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Thu, 25 Apr 2024 16:37:26 +0200 Subject: [PATCH 022/161] stacks: early exit on invalid for_each values for components --- .../internal/stackeval/component.go | 9 ++++++- .../internal/stackeval/component_test.go | 25 ++++++++----------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/internal/stacks/stackruntime/internal/stackeval/component.go b/internal/stacks/stackruntime/internal/stackeval/component.go index 45d1d07eb5..1282541d6c 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component.go +++ b/internal/stacks/stackruntime/internal/stackeval/component.go @@ -159,7 +159,14 @@ func (c *Component) CheckInstances(ctx context.Context, phase EvalPhase) (map[ad ctx, c.instances.For(phase), c.main, func(ctx context.Context) (map[addrs.InstanceKey]*ComponentInstance, tfdiags.Diagnostics) { var diags tfdiags.Diagnostics - forEachVal := c.ForEachValue(ctx, phase) + forEachVal, forEachValueDiags := c.CheckForEachValue(ctx, phase) + + // We can not create an instance map if the for each vaulu is not valid. + // We don't want to report on forEachValueDiags here because we + // already do this in checkValid. + if forEachValueDiags.HasErrors() { + return nil, diags + } ret := instancesMap(forEachVal, func(ik addrs.InstanceKey, rd instances.RepetitionData) *ComponentInstance { return newComponentInstance(c, ik, rd) diff --git a/internal/stacks/stackruntime/internal/stackeval/component_test.go b/internal/stacks/stackruntime/internal/stackeval/component_test.go index 612fe48cad..f4fca231f9 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_test.go @@ -192,10 +192,10 @@ func TestComponentCheckInstances(t *testing.T) { // When the for_each expression is invalid, CheckInstances should // return a single instance with dynamic values in the repetition data. // We don't distinguish between invalid and unknown for_each values. - gotInsts, diags := component.CheckInstances(ctx, InspectPhase) - assertNoDiags(t, diags) - if got, want := len(gotInsts), 1; got != want { - t.Fatalf("wrong number of instances %d; want %d\n%#v", got, want, gotInsts) + gotInsts, _ := component.CheckInstances(ctx, InspectPhase) + + if gotInsts != nil { + t.Fatalf("unexpected instances\ngot: %#v\nwant: nil", gotInsts) } }) subtestInPromisingTask(t, "unknown", func(ctx context.Context, t *testing.T) { @@ -389,16 +389,13 @@ func TestComponentResultValue(t *testing.T) { component := getComponent(ctx, t, main) got := component.ResultValue(ctx, InspectPhase) // When the for_each expression is unknown, the result value - // is unknown too so we can use it as a placeholder for partial - // downstream checking. - want := cty.DynamicVal - // FIXME: the cmp transformer ctydebug.CmpOptions seems to find - // this particular pair of values troubling, causing it to get - // into an infinite recursion. For now we'll just use RawEquals, - // at the expense of a less helpful failure message. This seems - // to be a bug in upstream ctydebug. - if !want.RawEquals(got) { - t.Fatalf("wrong result\ngot: %#v\nwant: %#v", got, want) + // is an instance map with the wildcard key and an empty object + want := cty.ObjectVal(map[string]cty.Value{ + "*": cty.EmptyObjectVal, + }) + + if diff := cmp.Diff(want, got, ctydebug.CmpOptions); diff != "" { + t.Fatalf("wrong result\n%s", diff) } }) }) From 91a18a6b3022dc58d04fa2dd9c1722e458573279 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Fri, 26 Apr 2024 17:34:50 +0200 Subject: [PATCH 023/161] stacks: fix typo Co-authored-by: Liam Cervante --- internal/stacks/stackruntime/internal/stackeval/component.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/stacks/stackruntime/internal/stackeval/component.go b/internal/stacks/stackruntime/internal/stackeval/component.go index 1282541d6c..b1dbcffa41 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component.go +++ b/internal/stacks/stackruntime/internal/stackeval/component.go @@ -161,7 +161,7 @@ func (c *Component) CheckInstances(ctx context.Context, phase EvalPhase) (map[ad var diags tfdiags.Diagnostics forEachVal, forEachValueDiags := c.CheckForEachValue(ctx, phase) - // We can not create an instance map if the for each vaulu is not valid. + // We can not create an instance map if the for each value is not valid. // We don't want to report on forEachValueDiags here because we // already do this in checkValid. if forEachValueDiags.HasErrors() { From 1afc9789efbc353b5543ab33acc60859b8d5e2db Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Mon, 29 Apr 2024 16:25:45 +0200 Subject: [PATCH 024/161] stacks: use UnknownForEachRepetitionData for instance map repetition data in for_each --- .../internal/stackeval/for_each.go | 11 ++------ .../internal/stackeval/for_each_test.go | 28 +++++++++++++------ 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/internal/stacks/stackruntime/internal/stackeval/for_each.go b/internal/stacks/stackruntime/internal/stackeval/for_each.go index c8a5a9534c..db410c5f31 100644 --- a/internal/stacks/stackruntime/internal/stackeval/for_each.go +++ b/internal/stacks/stackruntime/internal/stackeval/for_each.go @@ -157,7 +157,7 @@ func instancesMap[T any](maybeForEachVal cty.Value, makeInst func(addrs.Instance case !maybeForEachVal.IsKnown(): // This is temporary to gradually rollout support for unknown for_each values if allowsUnknown { - return unknownForEachInstancesMap(makeInst) + return unknownForEachInstancesMap(maybeForEachVal.Type(), makeInst) } else { return nil } @@ -242,14 +242,9 @@ func noForEachInstancesMap[T any](makeInst func(addrs.InstanceKey, instances.Rep } } -func unknownForEachInstancesMap[T any](makeInst func(addrs.InstanceKey, instances.RepetitionData) T) map[addrs.InstanceKey]T { +func unknownForEachInstancesMap[T any](ty cty.Type, makeInst func(addrs.InstanceKey, instances.RepetitionData) T) map[addrs.InstanceKey]T { return map[addrs.InstanceKey]T{ - addrs.WildcardKey: makeInst(addrs.WildcardKey, instances.RepetitionData{ - // As we don't know the for_each value, we can only provide dynamic values - // for the repetition symbols. - EachKey: cty.DynamicVal, - EachValue: cty.DynamicVal, - }), + addrs.WildcardKey: makeInst(addrs.WildcardKey, instances.UnknownForEachRepetitionData(ty)), } } diff --git a/internal/stacks/stackruntime/internal/stackeval/for_each_test.go b/internal/stacks/stackruntime/internal/stackeval/for_each_test.go index 9d4ee070cf..d3d93c3cf8 100644 --- a/internal/stacks/stackruntime/internal/stackeval/for_each_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/for_each_test.go @@ -5,7 +5,6 @@ package stackeval import ( "context" - "fmt" "testing" "github.com/davecgh/go-spew/spew" @@ -211,6 +210,7 @@ func TestInstancesMap(t *testing.T) { } tests := []struct { + Name string Input cty.Value Want Expectation @@ -220,6 +220,7 @@ func TestInstancesMap(t *testing.T) { }{ // No for_each at all { + "nil", cty.NilVal, Expectation{ UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ @@ -243,13 +244,14 @@ func TestInstancesMap(t *testing.T) { // Unknowns { + "unknown empty object", cty.UnknownVal(cty.EmptyObject), Expectation{ UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ addrs.WildcardKey: { Key: addrs.WildcardKey, Rep: instances.RepetitionData{ - EachKey: cty.DynamicVal, + EachKey: cty.UnknownVal(cty.String), EachValue: cty.DynamicVal, }, }, @@ -258,14 +260,15 @@ func TestInstancesMap(t *testing.T) { }, }, { + "unknown bool map", cty.UnknownVal(cty.Map(cty.Bool)), Expectation{ UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ addrs.WildcardKey: { Key: addrs.WildcardKey, Rep: instances.RepetitionData{ - EachKey: cty.DynamicVal, - EachValue: cty.DynamicVal, + EachKey: cty.UnknownVal(cty.String), + EachValue: cty.UnknownVal(cty.Bool), }, }, }, @@ -273,14 +276,15 @@ func TestInstancesMap(t *testing.T) { }, }, { + "unknown set of strings", cty.UnknownVal(cty.Set(cty.String)), Expectation{ UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ addrs.WildcardKey: { Key: addrs.WildcardKey, Rep: instances.RepetitionData{ - EachKey: cty.DynamicVal, - EachValue: cty.DynamicVal, + EachKey: cty.UnknownVal(cty.String), + EachValue: cty.UnknownVal(cty.String), }, }, }, @@ -290,6 +294,7 @@ func TestInstancesMap(t *testing.T) { // Empties { + "empty object", cty.EmptyObjectVal, Expectation{ UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ @@ -305,6 +310,7 @@ func TestInstancesMap(t *testing.T) { }, }, { + "empty string map", cty.MapValEmpty(cty.String), Expectation{ UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ @@ -320,6 +326,7 @@ func TestInstancesMap(t *testing.T) { }, }, { + "empty string set", cty.SetValEmpty(cty.String), Expectation{ UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ @@ -337,6 +344,7 @@ func TestInstancesMap(t *testing.T) { // Known and not empty { + "object", cty.ObjectVal(map[string]cty.Value{ "a": cty.StringVal("beep"), "b": cty.StringVal("boop"), @@ -377,6 +385,7 @@ func TestInstancesMap(t *testing.T) { }, }, { + "map", cty.MapVal(map[string]cty.Value{ "a": cty.StringVal("beep"), "b": cty.StringVal("boop"), @@ -417,6 +426,7 @@ func TestInstancesMap(t *testing.T) { }, }, { + "set", cty.SetVal([]cty.Value{ cty.StringVal("beep"), cty.StringVal("boop"), @@ -459,15 +469,15 @@ func TestInstancesMap(t *testing.T) { } for _, test := range tests { - t.Run(fmt.Sprintf("%s", test.Input), func(t *testing.T) { - t.Run("unknown for_each supported", func(t *testing.T) { + t.Run(test.Name, func(t *testing.T) { + t.Run("unknown for_each supported", func(t *testing.T) { got := instancesMap(test.Input, makeObj, true) if diff := cmp.Diff(test.Want.UnknownForEachSupported, got, ctydebug.CmpOptions); diff != "" { t.Errorf("wrong result\ninput: %#v\n%s", test.Input, diff) } }) - t.Run("unknown for_each unsupported", func(t *testing.T) { + t.Run("unknown for_each unsupported", func(t *testing.T) { got := instancesMap(test.Input, makeObj, false) if diff := cmp.Diff(test.Want.UnknownForEachUnsupported, got, ctydebug.CmpOptions); diff != "" { From c370e5e71d4a736c92dcf8c78d6f120f9f6a3595 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Mon, 29 Apr 2024 16:32:59 +0200 Subject: [PATCH 025/161] stacks: use more precise name for variable --- .../internal/stackeval/component_instance.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/stacks/stackruntime/internal/stackeval/component_instance.go b/internal/stacks/stackruntime/internal/stackeval/component_instance.go index cbaa15226c..b4eba207ba 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_instance.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_instance.go @@ -558,27 +558,27 @@ func (c *ComponentInstance) CheckModuleTreePlan(ctx context.Context) (*plans.Pla // If any of our upstream components have incomplete plans then // we need to force treating everything in this component as // deferred so we can preserve the correct dependency ordering. - upstreamDeferred := false + deferred := false for _, depAddr := range c.call.RequiredComponents(ctx).Elems() { depStack := c.main.Stack(ctx, depAddr.Stack, PlanPhase) if depStack == nil { - upstreamDeferred = true // to be conservative + deferred = true // to be conservative break } depComponent := depStack.Component(ctx, depAddr.Item) if depComponent == nil { - upstreamDeferred = true // to be conservative + deferred = true // to be conservative break } if !depComponent.PlanIsComplete(ctx) { - upstreamDeferred = true + deferred = true break } } // The instance is also upstream deferred if the for_each value for this instance is unknown. if c.key == addrs.WildcardKey { - upstreamDeferred = true + deferred = true } // NOTE: This ComponentInstance type only deals with component @@ -591,7 +591,7 @@ func (c *ComponentInstance) CheckModuleTreePlan(ctx context.Context) (*plans.Pla SetVariables: inputValues, ExternalProviders: providerClients, DeferralAllowed: stackPlanOpts.DeferralAllowed, - ExternalDependencyDeferred: upstreamDeferred, + ExternalDependencyDeferred: deferred, // This is set by some tests but should not be used in main code. // (nil means to use the real time when tfCtx.Plan was called.) From f847360a40f97e8522ec8669f47eb06538b456fb Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Mon, 29 Apr 2024 17:10:14 +0200 Subject: [PATCH 026/161] stacks: component.CheckInstances now reports on for each value diagnostics So there is no need for checkValid to do this during th walkDynamicObjects phase --- .../stackruntime/internal/stackeval/component.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/internal/stacks/stackruntime/internal/stackeval/component.go b/internal/stacks/stackruntime/internal/stackeval/component.go index b1dbcffa41..7906ba71e8 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component.go +++ b/internal/stacks/stackruntime/internal/stackeval/component.go @@ -161,10 +161,8 @@ func (c *Component) CheckInstances(ctx context.Context, phase EvalPhase) (map[ad var diags tfdiags.Diagnostics forEachVal, forEachValueDiags := c.CheckForEachValue(ctx, phase) - // We can not create an instance map if the for each value is not valid. - // We don't want to report on forEachValueDiags here because we - // already do this in checkValid. - if forEachValueDiags.HasErrors() { + diags = diags.Append(forEachValueDiags) + if diags.HasErrors() { return nil, diags } @@ -286,9 +284,7 @@ func (c *Component) ExprReferenceValue(ctx context.Context, phase EvalPhase) cty func (c *Component) checkValid(ctx context.Context, phase EvalPhase) tfdiags.Diagnostics { var diags tfdiags.Diagnostics - _, moreDiags := c.CheckForEachValue(ctx, phase) - diags = diags.Append(moreDiags) - _, moreDiags = c.CheckInstances(ctx, phase) + _, moreDiags := c.CheckInstances(ctx, phase) diags = diags.Append(moreDiags) return diags From 847925b531d42e44f418fe745dae4c81953d93cf Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Fri, 5 Apr 2024 18:04:43 -0700 Subject: [PATCH 027/161] experiments: template_string_func experiment keyword This doesn't actually do anything yet, but we'll make it do something in a future commit. --- internal/experiments/experiment.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/internal/experiments/experiment.go b/internal/experiments/experiment.go index 486fda3685..7fa4b902f0 100644 --- a/internal/experiments/experiment.go +++ b/internal/experiments/experiment.go @@ -20,6 +20,7 @@ const ( VariableValidationCrossRef = Experiment("variable_validation_crossref") ModuleVariableOptionalAttrs = Experiment("module_variable_optional_attrs") SuppressProviderSensitiveAttrs = Experiment("provider_sensitive_attrs") + TemplateStringFunc = Experiment("template_string_func") ConfigDrivenMove = Experiment("config_driven_move") PreconditionsPostconditions = Experiment("preconditions_postconditions") UnknownInstances = Experiment("unknown_instances") @@ -32,6 +33,7 @@ func init() { registerConcludedExperiment(VariableValidation, "Custom variable validation can now be used by default, without enabling an experiment.") registerCurrentExperiment(VariableValidationCrossRef) registerConcludedExperiment(SuppressProviderSensitiveAttrs, "Provider-defined sensitive attributes are now redacted by default, without enabling an experiment.") + registerCurrentExperiment(TemplateStringFunc) registerConcludedExperiment(ConfigDrivenMove, "Declarations of moved resource instances using \"moved\" blocks can now be used by default, without enabling an experiment.") registerConcludedExperiment(PreconditionsPostconditions, "Condition blocks can now be used by default, without enabling an experiment.") registerConcludedExperiment(ModuleVariableOptionalAttrs, "The final feature corresponding to this experiment differs from the experimental form and is available in the Terraform language from Terraform v1.3.0 onwards.") From 2ac2f4096f67d76b440d9839e4b9c36ab0e82fb1 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Fri, 5 Apr 2024 19:10:33 -0700 Subject: [PATCH 028/161] collections: NewSetCmp takes optional initial elements We previously updated the other two constructors to work this way, but missed this one. NewSetCmp is now consistent with NewSet and NewSetFunc. --- internal/collections/set.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/collections/set.go b/internal/collections/set.go index fb8c1b8259..75a2ca67be 100644 --- a/internal/collections/set.go +++ b/internal/collections/set.go @@ -42,8 +42,8 @@ func NewSetFunc[T any](keyFunc func(T) UniqueKey[T], elems ...T) Set[T] { // NewSetCmp constructs a new set for any comparable type, using the built-in // == operator as the definition of element equivalence. -func NewSetCmp[T comparable]() Set[T] { - return NewSetFunc(cmpUniqueKeyFunc[T]) +func NewSetCmp[T comparable](elems ...T) Set[T] { + return NewSetFunc(cmpUniqueKeyFunc[T], elems...) } // Has returns true if the given value is present in the set, or false From edf335e7ebddb8f67f22ed28fc3e4594b42550d9 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Mon, 8 Apr 2024 08:40:25 -0700 Subject: [PATCH 029/161] lang/funcs: Experimental "templatestring" function This function complements the existing "templatefile" to deal with the unusual situation of rendering a template that comes from somewhere outside of the current module's source code, such as from a data resource result. We have some historical experience with the now-deprecated hashicorp/template provider and its template_file data source, where we found that new authors would find it via web search and assume it was "the way" to render templates in Terraform, and then get frustrated dealing with the confusing situation of writing a string template that generates another string template for a second round of template rendering. To try to support those who have this unusual need without creating another attractive nuisance that would derail new authors, this function imposes the artificial extra rule that its template argument may only be populated using a single reference to a symbol defined elsewhere in the same module. This is intended to entice folks trying to use this function for something other than its intended purpose to refer to its documentation (once written) and then hopefully learn what other Terraform language feature they ought to have used instead. The syntax restriction only goes one level deep, so particularly-determined authors can still intentionally misuse this function by adding one level of indirection, such as by building template source code in a local value and then passing that local value as the template argument. The restriction is in place only to reduce the chances of someone _misunderstanding_ the purpose of this function; we don't intend to prevent someone from actively deciding to misuse it, if they have a good reason to do so. This new function inherits the same restriction as templatefile where it does not allow recursively calling other template-rendering functions. This is to dissuade from trying to use Terraform templates "at large", since Terraform's template language is not designed for such uses. It would be better to build a Terraform provider that wraps a more featureful template system like Gonja if someone really does need advanced templating, beyond Terraform's basic goals of being able to build small configuration files, etc. Because this function's intended purpose is rendering templates obtained from elsewhere, this function also blocks calls to any of Terraform's functions that would read from the filesystem of the computer where Terraform is running. This is a small additional measure of isolation to reduce the risk of an attacker somehow modifying a dynamically-fetched template to inspire Terraform to write sensitive data from the host computer into a location accessible to the same attacker, or similar. This is currently only a language experiment and so will not yet be available in stable releases of Terraform. Before stabilizing this and committing to supporting it indefinitely we'll want to gather feedback on whether this function actually meets the intended narrow set of use-cases around dynamic template rendering. --- internal/lang/funcs/descriptions.go | 7 + internal/lang/funcs/filesystem.go | 90 ++----- internal/lang/funcs/filesystem_test.go | 26 ++- internal/lang/funcs/string.go | 232 ++++++++++++++++++ internal/lang/funcs/string_test.go | 310 +++++++++++++++++++++++++ internal/lang/functions.go | 60 ++++- 6 files changed, 633 insertions(+), 92 deletions(-) diff --git a/internal/lang/funcs/descriptions.go b/internal/lang/funcs/descriptions.go index cfe529b1b0..1967793ea7 100644 --- a/internal/lang/funcs/descriptions.go +++ b/internal/lang/funcs/descriptions.go @@ -420,6 +420,13 @@ var DescriptionList = map[string]descriptionEntry{ Description: "`templatefile` reads the file at the given path and renders its content as a template using a supplied set of template variables.", ParamDescription: []string{"", ""}, }, + "templatestring": { + Description: "`templatestring` takes a string from elsewhere in the module and renders its content as a template using a supplied set of template variables.", + ParamDescription: []string{ + "a simple reference to a string value containing the template source code", + "object of variables to expose in the template scope", + }, + }, "textdecodebase64": { Description: "`textdecodebase64` function decodes a string that was previously Base64-encoded, and then interprets the result as characters in a specified character encoding.", ParamDescription: []string{"", ""}, diff --git a/internal/lang/funcs/filesystem.go b/internal/lang/funcs/filesystem.go index 5447d698eb..4092cd5046 100644 --- a/internal/lang/funcs/filesystem.go +++ b/internal/lang/funcs/filesystem.go @@ -6,7 +6,7 @@ package funcs import ( "encoding/base64" "fmt" - "io/ioutil" + "io" "os" "path/filepath" "unicode/utf8" @@ -17,6 +17,8 @@ import ( homedir "github.com/mitchellh/go-homedir" "github.com/zclconf/go-cty/cty" "github.com/zclconf/go-cty/cty/function" + + "github.com/hashicorp/terraform/internal/collections" ) // MakeFileFunc constructs a function that takes a file path and returns the @@ -69,20 +71,7 @@ func MakeFileFunc(baseDir string, encBase64 bool) function.Function { // As a special exception, a referenced template file may not recursively call // the templatefile function, since that would risk the same file being // included into itself indefinitely. -func MakeTemplateFileFunc(baseDir string, funcsCb func() map[string]function.Function) function.Function { - - params := []function.Parameter{ - { - Name: "path", - Type: cty.String, - AllowMarked: true, - }, - { - Name: "vars", - Type: cty.DynamicPseudoType, - }, - } - +func MakeTemplateFileFunc(baseDir string, funcsCb func() (funcs map[string]function.Function, fsFuncs collections.Set[string], templateFuncs collections.Set[string])) function.Function { loadTmpl := func(fn string, marks cty.ValueMarks) (hcl.Expression, error) { // We re-use File here to ensure the same filename interpretation // as it does, along with its other safety checks. @@ -99,65 +88,20 @@ func MakeTemplateFileFunc(baseDir string, funcsCb func() map[string]function.Fun return expr, nil } - renderTmpl := func(expr hcl.Expression, varsVal cty.Value) (cty.Value, error) { - if varsTy := varsVal.Type(); !(varsTy.IsMapType() || varsTy.IsObjectType()) { - return cty.DynamicVal, function.NewArgErrorf(1, "invalid vars value: must be a map") // or an object, but we don't strongly distinguish these most of the time - } - - ctx := &hcl.EvalContext{ - Variables: varsVal.AsValueMap(), - } - - // We require all of the variables to be valid HCL identifiers, because - // otherwise there would be no way to refer to them in the template - // anyway. Rejecting this here gives better feedback to the user - // than a syntax error somewhere in the template itself. - for n := range ctx.Variables { - if !hclsyntax.ValidIdentifier(n) { - // This error message intentionally doesn't describe _all_ of - // the different permutations that are technically valid as an - // HCL identifier, but rather focuses on what we might - // consider to be an "idiomatic" variable name. - return cty.DynamicVal, function.NewArgErrorf(1, "invalid template variable name %q: must start with a letter, followed by zero or more letters, digits, and underscores", n) - } - } - - // We'll pre-check references in the template here so we can give a - // more specialized error message than HCL would by default, so it's - // clearer that this problem is coming from a templatefile call. - for _, traversal := range expr.Variables() { - root := traversal.RootName() - if _, ok := ctx.Variables[root]; !ok { - return cty.DynamicVal, function.NewArgErrorf(1, "vars map does not contain key %q, referenced at %s", root, traversal[0].SourceRange()) - } - } - - givenFuncs := funcsCb() // this callback indirection is to avoid chicken/egg problems - funcs := make(map[string]function.Function, len(givenFuncs)) - for name, fn := range givenFuncs { - if name == "templatefile" || name == "core::templatefile" { - // We stub this one out to prevent recursive calls. - funcs[name] = function.New(&function.Spec{ - Params: params, - Type: func(args []cty.Value) (cty.Type, error) { - return cty.NilType, fmt.Errorf("cannot recursively call templatefile from inside templatefile call") - }, - }) - continue - } - funcs[name] = fn - } - ctx.Functions = funcs - - val, diags := expr.Value(ctx) - if diags.HasErrors() { - return cty.DynamicVal, diags - } - return val, nil - } + renderTmpl := makeRenderTemplateFunc(funcsCb, true) return function.New(&function.Spec{ - Params: params, + Params: []function.Parameter{ + { + Name: "path", + Type: cty.String, + AllowMarked: true, + }, + { + Name: "vars", + Type: cty.DynamicPseudoType, + }, + }, Type: func(args []cty.Value) (cty.Type, error) { if !(args[0].IsKnown() && args[1].IsKnown()) { return cty.DynamicPseudoType, nil @@ -426,7 +370,7 @@ func readFileBytes(baseDir, path string, marks cty.ValueMarks) ([]byte, error) { } defer f.Close() - src, err := ioutil.ReadAll(f) + src, err := io.ReadAll(f) if err != nil { return nil, fmt.Errorf("failed to read file: %w", err) } diff --git a/internal/lang/funcs/filesystem_test.go b/internal/lang/funcs/filesystem_test.go index e54eae6ce3..cab8f27976 100644 --- a/internal/lang/funcs/filesystem_test.go +++ b/internal/lang/funcs/filesystem_test.go @@ -9,11 +9,13 @@ import ( "path/filepath" "testing" - "github.com/hashicorp/terraform/internal/lang/marks" homedir "github.com/mitchellh/go-homedir" "github.com/zclconf/go-cty/cty" "github.com/zclconf/go-cty/cty/function" "github.com/zclconf/go-cty/cty/function/stdlib" + + "github.com/hashicorp/terraform/internal/collections" + "github.com/hashicorp/terraform/internal/lang/marks" ) func TestFile(t *testing.T) { @@ -149,13 +151,13 @@ func TestTemplateFile(t *testing.T) { cty.StringVal("testdata/recursive.tmpl"), cty.MapValEmpty(cty.String), cty.NilVal, - `testdata/recursive.tmpl:1,3-16: Error in function call; Call to function "templatefile" failed: cannot recursively call templatefile from inside templatefile call.`, + `testdata/recursive.tmpl:1,3-16: Error in function call; Call to function "templatefile" failed: cannot recursively call templatefile from inside another template function.`, }, { cty.StringVal("testdata/recursive_namespaced.tmpl"), cty.MapValEmpty(cty.String), cty.NilVal, - `testdata/recursive_namespaced.tmpl:1,3-22: Error in function call; Call to function "core::templatefile" failed: cannot recursively call templatefile from inside templatefile call.`, + `testdata/recursive_namespaced.tmpl:1,3-22: Error in function call; Call to function "core::templatefile" failed: cannot recursively call templatefile from inside another template function.`, }, { cty.StringVal("testdata/list.tmpl"), @@ -187,14 +189,16 @@ func TestTemplateFile(t *testing.T) { }, } - templateFileFn := MakeTemplateFileFunc(".", func() map[string]function.Function { - return map[string]function.Function{ - "join": stdlib.JoinFunc, - "core::join": stdlib.JoinFunc, - "templatefile": MakeFileFunc(".", false), // just a placeholder, since templatefile itself overrides this - "core::templatefile": MakeFileFunc(".", false), // just a placeholder, since templatefile itself overrides this - } - }) + funcs := map[string]function.Function{ + "join": stdlib.JoinFunc, + "core::join": stdlib.JoinFunc, + } + funcsFunc := func() (funcTable map[string]function.Function, fsFuncs collections.Set[string], templateFuncs collections.Set[string]) { + return funcs, collections.NewSetCmp[string](), collections.NewSetCmp[string]("templatefile") + } + templateFileFn := MakeTemplateFileFunc(".", funcsFunc) + funcs["templatefile"] = templateFileFn + funcs["core::templatefile"] = templateFileFn for _, test := range tests { t.Run(fmt.Sprintf("TemplateFile(%#v, %#v)", test.Path, test.Vars), func(t *testing.T) { diff --git a/internal/lang/funcs/string.go b/internal/lang/funcs/string.go index 311ee41ed4..33142f2952 100644 --- a/internal/lang/funcs/string.go +++ b/internal/lang/funcs/string.go @@ -4,11 +4,18 @@ package funcs import ( + "fmt" "regexp" "strings" + "github.com/hashicorp/hcl/v2" + "github.com/hashicorp/hcl/v2/ext/customdecode" + "github.com/hashicorp/hcl/v2/hclsyntax" "github.com/zclconf/go-cty/cty" + "github.com/zclconf/go-cty/cty/convert" "github.com/zclconf/go-cty/cty/function" + + "github.com/hashicorp/terraform/internal/collections" ) // StartsWithFunc constructs a function that checks if a string starts with @@ -153,6 +160,231 @@ var StrContainsFunc = function.New(&function.Spec{ }, }) +// TemplateStringFunc renders a template presented either as a literal string +// or as a reference to a string from elsewhere. +func MakeTemplateStringFunc(funcsCb func() (funcs map[string]function.Function, fsFuncs collections.Set[string], templateFuncs collections.Set[string])) function.Function { + return function.New(&function.Spec{ + Params: []function.Parameter{ + { + Name: "template", + Type: customdecode.ExpressionClosureType, + }, + { + Name: "vars", + Type: cty.DynamicPseudoType, + }, + }, + Type: function.StaticReturnType(cty.String), + RefineResult: refineNotNull, + Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { + templateClosure := customdecode.ExpressionClosureFromVal(args[0]) + varsVal := args[1] + + // Our historical experience with the hashicorp/template provider's + // template_file data source tells us that situations where authors + // must write a string template that generates a string template + // cause all sorts of confusion, because the same syntax ends up + // being evaluated in two different contexts with different variables + // in scope, and new authors tend to be attracted to a function + // named "template" and so miss that the language has built-in + // support for inline template expressions. + // + // As a compromise to try to meet the (relatively unusual) use-cases + // where dynamic template fetching is needed without creating an + // attractive nuisance for those who would be better off just writing + // a plain inline template, this function imposes constraints on how + // the template argument may be provided and thus allows us + // to return slightly more helpful error messages. + // + // The only valid way to provide the template argument is as a + // simple, direct reference to some other value in scope that is + // of type string: + // templatestring(local.greeting_template, { name = "Alex" }) + // + // Those with more unusual desires, such as dynamically generating + // a template at runtime by trying to concatenate template chunks + // together, can still do such things by placing the template + // construction expression in a separate local value and then passing + // that local value to the template argument. But the restriction is + // intended to intentionally add an extra "roadbump" so that + // anyone who mistakenly thinks they need templatestring to render + // an inline template (a common mistake for new authors with + // template_file) will hopefully hit this roadblock and refer to + // the function documentation to learn about the other options that + // are probably more suitable for what they need. + switch expr := templateClosure.Expression.(type) { + case *hclsyntax.ScopeTraversalExpr: + // A standalone traversal is always acceptable. + case *hclsyntax.TemplateWrapExpr: + // This situation occurs when someone writes an interpolation-only + // expression as was required in Terraform v0.11 and earlier. + // Because older versions of Terraform required this and this + // habit has been sticky for some authors, we'll return a + // special error message. + return cty.UnknownVal(retType), function.NewArgErrorf( + 0, "invalid template expression: templatestring is only for rendering templates retrieved dynamically from elsewhere; to treat the inner expression as template syntax, write the reference expression directly without any template interpolation syntax", + ) + case *hclsyntax.TemplateExpr: + // This is the more general case of someone trying to write + // an inline template as the argument. In this case we'll + // distinguish between an entirely-literal template, which + // probably suggests someone was trying to escape their template + // for the function to consume, vs. a template with other + // sequences that suggests someone was just trying to write + // an inline template and so probably doesn't need to call + // this function at all. + literal := true + if len(expr.Parts) != 1 { + literal = false + } else if _, ok := expr.Parts[0].(*hclsyntax.LiteralValueExpr); !ok { + literal = false + } + if literal { + return cty.UnknownVal(retType), function.NewArgErrorf( + 0, "invalid template expression: templatestring is only for rendering templates retrieved dynamically from elsewhere, and so does not support providing a literal template; consider using a template string expression instead", + ) + } else { + return cty.UnknownVal(retType), function.NewArgErrorf( + 0, "invalid template expression: templatestring is only for rendering templates retrieved dynamically from elsewhere; to render an inline template, consider using a plain template string expression", + ) + } + default: + // Nothing else is allowed. + // Someone who really does want to construct a template dynamically + // can factor out that construction into a local value and refer + // to it in the templatestring call, but it's not really feasible + // to explain that clearly in a short error message so we'll deal + // with that option on the function's documentation page instead, + // where we can show a full example. + return cty.UnknownVal(retType), function.NewArgErrorf( + 0, "invalid template expression: must be a direct reference to a single string from elsewhere, containing valid Terraform template syntax", + ) + } + + templateVal, diags := templateClosure.Value() + if diags.HasErrors() { + // With the constraints we imposed above the possible errors + // here are pretty limited: it must be some kind of invalid + // traversal. As usual HCL diagnostics don't make for very + // good function errors but we've already filtered out many + // common reasons for error here, so we should get here pretty + // rarely. + return cty.UnknownVal(retType), function.NewArgErrorf( + 0, "invalid template expression: %s", + diags.Error(), + ) + } + if !templateVal.IsKnown() { + // We'll need to wait until we actually know what the template is. + return cty.UnknownVal(retType), nil + } + if templateVal.Type() != cty.String || templateVal.IsNull() { + // We're being a little stricter than usual here and requiring + // exactly a string, rather than just anything that can convert + // to one. This is because the stringification of a number or + // boolean value cannot be a useful template (it wouldn't have + // any template sequences in it) and so far more likely to be + // a mistake than actually intentional. + return cty.UnknownVal(retType), function.NewArgErrorf( + 0, "invalid template value: a string is required", + ) + } + templateVal, templateMarks := templateVal.Unmark() + templateStr := templateVal.AsString() + expr, diags := hclsyntax.ParseTemplate([]byte(templateStr), "", hcl.Pos{Line: 1, Column: 1}) + if diags.HasErrors() { + return cty.UnknownVal(retType), function.NewArgErrorf( + 0, "invalid template: %s", + diags.Error(), + ) + } + + render := makeRenderTemplateFunc(funcsCb, false) + retVal, err := render(expr, varsVal) + if err != nil { + return cty.UnknownVal(retType), err + } + retVal, err = convert.Convert(retVal, cty.String) + if err != nil { + return cty.UnknownVal(retType), fmt.Errorf("invalid template result: %s", err) + } + return retVal.WithMarks(templateMarks), nil + }, + }) +} + +func makeRenderTemplateFunc(funcsCb func() (funcs map[string]function.Function, fsFuncs collections.Set[string], templateFuncs collections.Set[string]), allowFS bool) func(expr hcl.Expression, varsVal cty.Value) (cty.Value, error) { + return func(expr hcl.Expression, varsVal cty.Value) (cty.Value, error) { + if varsTy := varsVal.Type(); !(varsTy.IsMapType() || varsTy.IsObjectType()) { + return cty.DynamicVal, function.NewArgErrorf(1, "invalid vars value: must be a map") // or an object, but we don't strongly distinguish these most of the time + } + + ctx := &hcl.EvalContext{ + Variables: varsVal.AsValueMap(), + } + + // We require all of the variables to be valid HCL identifiers, because + // otherwise there would be no way to refer to them in the template + // anyway. Rejecting this here gives better feedback to the user + // than a syntax error somewhere in the template itself. + for n := range ctx.Variables { + if !hclsyntax.ValidIdentifier(n) { + // This error message intentionally doesn't describe _all_ of + // the different permutations that are technically valid as an + // HCL identifier, but rather focuses on what we might + // consider to be an "idiomatic" variable name. + return cty.DynamicVal, function.NewArgErrorf(1, "invalid template variable name %q: must start with a letter, followed by zero or more letters, digits, and underscores", n) + } + } + + // We'll pre-check references in the template here so we can give a + // more specialized error message than HCL would by default, so it's + // clearer that this problem is coming from a templatefile call. + for _, traversal := range expr.Variables() { + root := traversal.RootName() + if _, ok := ctx.Variables[root]; !ok { + return cty.DynamicVal, function.NewArgErrorf(1, "vars map does not contain key %q, referenced at %s", root, traversal[0].SourceRange()) + } + } + + givenFuncs, fsFuncs, templateFuncs := funcsCb() // this callback indirection is to avoid chicken/egg problems + funcs := make(map[string]function.Function, len(givenFuncs)) + for name, fn := range givenFuncs { + plainName := strings.TrimPrefix(name, "core::") + switch { + case templateFuncs.Has(plainName): + funcs[name] = function.New(&function.Spec{ + Params: fn.Params(), + VarParam: fn.VarParam(), + Type: func(args []cty.Value) (cty.Type, error) { + return cty.NilType, fmt.Errorf("cannot recursively call %s from inside another template function", plainName) + }, + }) + case !allowFS && fsFuncs.Has(plainName): + // Note: for now this assumes that allowFS is false only for + // the templatestring function, and so mentions that name + // directly in the error message. + funcs[name] = function.New(&function.Spec{ + Params: fn.Params(), + VarParam: fn.VarParam(), + Type: func(args []cty.Value) (cty.Type, error) { + return cty.NilType, fmt.Errorf("cannot use filesystem access functions like %s in templatestring templates; consider passing the function result as a template variable instead", plainName) + }, + }) + default: + funcs[name] = fn + } + } + ctx.Functions = funcs + + val, diags := expr.Value(ctx) + if diags.HasErrors() { + return cty.DynamicVal, diags + } + return val, nil + } +} + // Replace searches a given string for another given substring, // and replaces all occurences with a given replacement string. func Replace(str, substr, replace cty.Value) (cty.Value, error) { diff --git a/internal/lang/funcs/string_test.go b/internal/lang/funcs/string_test.go index b66c2611d7..c0de6b3239 100644 --- a/internal/lang/funcs/string_test.go +++ b/internal/lang/funcs/string_test.go @@ -5,9 +5,16 @@ package funcs import ( "fmt" + "strings" "testing" + "github.com/hashicorp/hcl/v2" + "github.com/hashicorp/hcl/v2/ext/customdecode" + "github.com/hashicorp/hcl/v2/hclsyntax" "github.com/zclconf/go-cty/cty" + "github.com/zclconf/go-cty/cty/function" + + "github.com/hashicorp/terraform/internal/collections" ) func TestReplace(t *testing.T) { @@ -253,3 +260,306 @@ func TestStartsWith(t *testing.T) { }) } } + +func TestTemplateString(t *testing.T) { + // This function has some special restrictions on what syntax is valid + // in its first argument, so we'll test this one using HCL expressions + // as the inputs, rather than direct cty values as we do for most other + // functions in this package. + tests := []struct { + templateExpr string + exprScope map[string]cty.Value + vars cty.Value + want cty.Value + wantErr string + }{ + { + `template`, + map[string]cty.Value{ + "template": cty.StringVal(`it's ${a}`), + }, + cty.ObjectVal(map[string]cty.Value{ + "a": cty.StringVal("a value"), + }), + cty.StringVal(`it's a value`), + ``, + }, + { + `template`, + map[string]cty.Value{ + "template": cty.StringVal(`${a}`), + }, + cty.ObjectVal(map[string]cty.Value{ + "a": cty.True, + }), + // The special treatment of a template with only a single + // interpolation sequence does not apply to templatestring, because + // we're expecting to be evaluating templates fetched dynamically + // from somewhere else and want to avoid callers needing to deal + // with anything other than string results. + cty.StringVal(`true`), + ``, + }, + { + `template`, + map[string]cty.Value{ + "template": cty.StringVal(`${a}`), + }, + cty.ObjectVal(map[string]cty.Value{ + "a": cty.EmptyTupleVal, + }), + // The special treatment of a template with only a single + // interpolation sequence does not apply to templatestring, because + // we're expecting to be evaluating templates fetched dynamically + // from somewhere else and want to avoid callers needing to deal + // with anything other than string results. + cty.NilVal, + `invalid template result: string required`, + }, + { + `data.whatever.whatever["foo"].result`, + map[string]cty.Value{ + "data": cty.ObjectVal(map[string]cty.Value{ + "whatever": cty.ObjectVal(map[string]cty.Value{ + "whatever": cty.MapVal(map[string]cty.Value{ + "foo": cty.ObjectVal(map[string]cty.Value{ + "result": cty.StringVal("it's ${a}"), + }), + }), + }), + }), + }, + cty.ObjectVal(map[string]cty.Value{ + "a": cty.StringVal("a value"), + }), + cty.StringVal(`it's a value`), + ``, + }, + { + `"can't write $${not_allowed}"`, + map[string]cty.Value{}, + cty.ObjectVal(map[string]cty.Value{ + "not_allowed": cty.StringVal("a literal template"), + }), + cty.NilVal, + `invalid template expression: templatestring is only for rendering templates retrieved dynamically from elsewhere, and so does not support providing a literal template; consider using a template string expression instead`, + }, + { + `"can't write ${not_allowed}"`, + map[string]cty.Value{}, + cty.ObjectVal(map[string]cty.Value{ + "not_allowed": cty.StringVal("a literal template"), + }), + cty.NilVal, + `invalid template expression: templatestring is only for rendering templates retrieved dynamically from elsewhere; to render an inline template, consider using a plain template string expression`, + }, + { + `"can't write %%{for x in things}a literal template%%{endfor}"`, + map[string]cty.Value{}, + cty.ObjectVal(map[string]cty.Value{ + "things": cty.ListVal([]cty.Value{cty.True}), + }), + cty.NilVal, + `invalid template expression: templatestring is only for rendering templates retrieved dynamically from elsewhere, and so does not support providing a literal template; consider using a template string expression instead`, + }, + { + `"can't write %{for x in things}a literal template%{endfor}"`, + map[string]cty.Value{}, + cty.ObjectVal(map[string]cty.Value{ + "things": cty.ListVal([]cty.Value{cty.True}), + }), + cty.NilVal, + `invalid template expression: templatestring is only for rendering templates retrieved dynamically from elsewhere; to render an inline template, consider using a plain template string expression`, + }, + { + `"${not_allowed}"`, + map[string]cty.Value{}, + cty.ObjectVal(map[string]cty.Value{ + "not allowed": cty.StringVal("an interp-only template"), + }), + cty.NilVal, + `invalid template expression: templatestring is only for rendering templates retrieved dynamically from elsewhere; to treat the inner expression as template syntax, write the reference expression directly without any template interpolation syntax`, + }, + { + `1 + 1`, + map[string]cty.Value{}, + cty.ObjectVal(map[string]cty.Value{}), + cty.NilVal, + `invalid template expression: must be a direct reference to a single string from elsewhere, containing valid Terraform template syntax`, + }, + { + `not_a_string`, + map[string]cty.Value{ + "not_a_string": cty.True, + }, + cty.ObjectVal(map[string]cty.Value{}), + cty.NilVal, + `invalid template value: a string is required`, + }, + { + `with_lower`, + map[string]cty.Value{ + "with_lower": cty.StringVal(`it's ${lower(a)}`), + }, + cty.ObjectVal(map[string]cty.Value{ + "a": cty.StringVal("A VALUE"), + }), + cty.StringVal("it's a value"), + ``, + }, + { + `with_core_lower`, + map[string]cty.Value{ + "with_core_lower": cty.StringVal(`it's ${core::lower(a)}`), + }, + cty.ObjectVal(map[string]cty.Value{ + "a": cty.StringVal("A VALUE"), + }), + cty.StringVal("it's a value"), + ``, + }, + { + `with_fsfunc`, + map[string]cty.Value{ + "with_fsfunc": cty.StringVal(`it's ${fsfunc()}`), + }, + cty.ObjectVal(map[string]cty.Value{}), + cty.NilVal, + `:1,8-15: Error in function call; Call to function "fsfunc" failed: cannot use filesystem access functions like fsfunc in templatestring templates; consider passing the function result as a template variable instead.`, + }, + { + `with_core_fsfunc`, + map[string]cty.Value{ + "with_core_fsfunc": cty.StringVal(`it's ${core::fsfunc()}`), + }, + cty.ObjectVal(map[string]cty.Value{}), + cty.NilVal, + `:1,8-21: Error in function call; Call to function "core::fsfunc" failed: cannot use filesystem access functions like fsfunc in templatestring templates; consider passing the function result as a template variable instead.`, + }, + { + `with_templatefunc`, + map[string]cty.Value{ + "with_templatefunc": cty.StringVal(`it's ${templatefunc()}`), + }, + cty.ObjectVal(map[string]cty.Value{}), + cty.NilVal, + `:1,8-21: Error in function call; Call to function "templatefunc" failed: cannot recursively call templatefunc from inside another template function.`, + }, + { + `with_core_templatefunc`, + map[string]cty.Value{ + "with_core_templatefunc": cty.StringVal(`it's ${core::templatefunc()}`), + }, + cty.ObjectVal(map[string]cty.Value{}), + cty.NilVal, + `:1,8-27: Error in function call; Call to function "core::templatefunc" failed: cannot recursively call templatefunc from inside another template function.`, + }, + { + `with_fstemplatefunc`, + map[string]cty.Value{ + "with_fstemplatefunc": cty.StringVal(`it's ${fstemplatefunc()}`), + }, + cty.ObjectVal(map[string]cty.Value{}), + cty.NilVal, + // The template function error takes priority over the filesystem + // function error if calling a function that's in both categories. + `:1,8-23: Error in function call; Call to function "fstemplatefunc" failed: cannot recursively call fstemplatefunc from inside another template function.`, + }, + { + `with_core_fstemplatefunc`, + map[string]cty.Value{ + "with_core_fstemplatefunc": cty.StringVal(`it's ${core::fstemplatefunc()}`), + }, + cty.ObjectVal(map[string]cty.Value{}), + cty.NilVal, + // The template function error takes priority over the filesystem + // function error if calling a function that's in both categories. + `:1,8-29: Error in function call; Call to function "core::fstemplatefunc" failed: cannot recursively call fstemplatefunc from inside another template function.`, + }, + } + + funcToTest := MakeTemplateStringFunc(func() (funcs map[string]function.Function, fsFuncs collections.Set[string], templateFuncs collections.Set[string]) { + // These are the functions available for use inside the nested template + // evaluation context. These are here only to test that we can call + // functions and that the template/filesystem functions get blocked + // with suitable error messages. This is not a realistic set of + // functions that would be available in a real call. + funcs = map[string]function.Function{ + "lower": function.New(&function.Spec{ + Params: []function.Parameter{ + { + Name: "str", + Type: cty.String, + }, + }, + Type: function.StaticReturnType(cty.String), + Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { + s := args[0].AsString() + return cty.StringVal(strings.ToLower(s)), nil + }, + }), + "fsfunc": function.New(&function.Spec{ + Type: function.StaticReturnType(cty.String), + Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { + return cty.UnknownVal(retType), fmt.Errorf("should not be able to call fsfunc") + }, + }), + "templatefunc": function.New(&function.Spec{ + Type: function.StaticReturnType(cty.String), + Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { + return cty.UnknownVal(retType), fmt.Errorf("should not be able to call templatefunc") + }, + }), + "fstemplatefunc": function.New(&function.Spec{ + Type: function.StaticReturnType(cty.String), + Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { + return cty.UnknownVal(retType), fmt.Errorf("should not be able to call fstemplatefunc") + }, + }), + } + funcs["core::lower"] = funcs["lower"] + funcs["core::fsfunc"] = funcs["fsfunc"] + funcs["core::templatefunc"] = funcs["templatefunc"] + funcs["core::fstemplatefunc"] = funcs["fstemplatefunc"] + return funcs, collections.NewSetCmp("fsfunc", "fstemplatefunc"), collections.NewSetCmp("templatefunc", "fstemplatefunc") + }) + + for _, test := range tests { + t.Run(test.templateExpr, func(t *testing.T) { + // The following mimics what HCL itself would do when preparing + // the first argument to this function, since the parameter + // uses the special "expression closure type" which causes + // HCL to delay evaluation of the expression and let the + // function handle it directly itself. + expr, diags := hclsyntax.ParseExpression([]byte(test.templateExpr), "", hcl.InitialPos) + if diags.HasErrors() { + t.Fatalf("unexpected errors: %s", diags.Error()) + } + exprClosure := &customdecode.ExpressionClosure{ + Expression: expr, + EvalContext: &hcl.EvalContext{ + Variables: test.exprScope, + }, + } + exprClosureVal := customdecode.ExpressionClosureVal(exprClosure) + + got, gotErr := funcToTest.Call([]cty.Value{exprClosureVal, test.vars}) + + if test.wantErr != "" { + if gotErr == nil { + t.Fatalf("unexpected success\ngot: %#v\nwant error: %s", got, test.wantErr) + } + if got, want := gotErr.Error(), test.wantErr; got != want { + t.Fatalf("wrong error\ngot: %s\nwant: %s", got, want) + } + return + } + if gotErr != nil { + t.Errorf("unexpected error: %s", gotErr.Error()) + } + if !test.want.RawEquals(got) { + t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.want) + } + }) + } +} diff --git a/internal/lang/functions.go b/internal/lang/functions.go index 10c72981a6..f811f0b503 100644 --- a/internal/lang/functions.go +++ b/internal/lang/functions.go @@ -12,6 +12,7 @@ import ( "github.com/zclconf/go-cty/cty/function" "github.com/zclconf/go-cty/cty/function/stdlib" + "github.com/hashicorp/terraform/internal/collections" "github.com/hashicorp/terraform/internal/experiments" "github.com/hashicorp/terraform/internal/lang/funcs" ) @@ -22,6 +23,32 @@ var impureFunctions = []string{ "uuid", } +// filesystemFunctions are the functions that allow interacting with arbitrary +// paths in the local filesystem, and which can therefore have their results +// vary based on something other than their arguments, and might allow template +// rendering to expose details about the system where Terraform is running. +var filesystemFunctions = collections.NewSetCmp[string]( + "file", + "fileexists", + "fileset", + "filebase64", + "filebase64sha256", + "filebase64sha512", + "filemd5", + "filesha1", + "filesha256", + "filesha512", + "templatefile", +) + +// templateFunctions are functions that render nested templates. These are +// callable from module code but not from within the templates they are +// rendering. +var templateFunctions = collections.NewSetCmp[string]( + "templatefile", + "templatestring", +) + // Functions returns the set of functions that should be used to when evaluating // expressions in the receiving scope. func (s *Scope) Functions() map[string]function.Function { @@ -29,6 +56,10 @@ func (s *Scope) Functions() map[string]function.Function { if s.funcs == nil { s.funcs = baseFunctions(s.BaseDir) + // If you're adding something here, please consider whether it meets + // the criteria for either or both of the sets [filesystemFunctions] + // and [templateFunctions] and add it there if so, to ensure that + // functions relying on those classifications will behave correctly. coreFuncs := map[string]function.Function{ "abs": stdlib.AbsoluteFunc, "abspath": funcs.AbsPathFunc, @@ -148,12 +179,20 @@ func (s *Scope) Functions() map[string]function.Function { "zipmap": stdlib.ZipmapFunc, } - coreFuncs["templatefile"] = funcs.MakeTemplateFileFunc(s.BaseDir, func() map[string]function.Function { - // The templatefile function prevents recursive calls to itself - // by copying this map and overwriting the "templatefile" and - // "core:templatefile" entries. - return s.funcs - }) + // Our two template-rendering functions want to be able to call + // all of the other functions themselves, but we pass them indirectly + // via a callback to avoid chicken/egg problems while initializing + // the functions table. + funcsFunc := func() (funcs map[string]function.Function, fsFuncs collections.Set[string], templateFuncs collections.Set[string]) { + // The templatefile and templatestring functions prevent recursive + // calls to themselves and each other by copying this map and + // overwriting the relevant entries. + return s.funcs, filesystemFunctions, templateFunctions + } + coreFuncs["templatefile"] = funcs.MakeTemplateFileFunc(s.BaseDir, funcsFunc) + if s.activeExperiments.Has(experiments.TemplateStringFunc) { + coreFuncs["templatestring"] = funcs.MakeTemplateStringFunc(funcsFunc) + } if s.ConsoleMode { // The type function is only available in terraform console. @@ -228,6 +267,11 @@ func baseFunctions(baseDir string) map[string]function.Function { // in the "funcs" directory and potentially graduate to cty stdlib // later if the functionality seems to be something domain-agnostic // that would be useful to all applications using cty functions. + // + // If you're adding something here, please consider whether it meets + // the criteria for either or both of the sets [filesystemFunctions] + // and [templateFunctions] and add it there if so, to ensure that + // functions relying on those classifications will behave correctly. fs := map[string]function.Function{ "abs": stdlib.AbsoluteFunc, "abspath": funcs.AbsPathFunc, @@ -347,10 +391,10 @@ func baseFunctions(baseDir string) map[string]function.Function { "zipmap": stdlib.ZipmapFunc, } - fs["templatefile"] = funcs.MakeTemplateFileFunc(baseDir, func() map[string]function.Function { + fs["templatefile"] = funcs.MakeTemplateFileFunc(baseDir, func() (map[string]function.Function, collections.Set[string], collections.Set[string]) { // The templatefile function prevents recursive calls to itself // by copying this map and overwriting the "templatefile" entry. - return fs + return fs, filesystemFunctions, templateFunctions }) return fs From 2a035cd8a52c328a916c33d8732a22d4c70e08b1 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Mon, 29 Apr 2024 09:22:17 -0700 Subject: [PATCH 030/161] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c89681071..e3fa7c396a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ EXPERIMENTS: Experiments are only enabled in alpha releases of Terraform CLI. The following features are not yet available in stable releases. * `variable_validation_crossref`: This [language experiment](https://developer.hashicorp.com/terraform/language/settings#experimental-language-features) allows `validation` blocks inside input variable declarations to refer to other objects inside the module where the variable is declared, including to the values of other input variables in the same module. +* `template_string_func`: This [language experiment](https://developer.hashicorp.com/terraform/language/settings#experimental-language-features) introduces a new built-in function named `templatestring` which is similar to `templatefile` but designed to render templates obtained dynamically, such as from a data resource result. * `terraform test` accepts a new option `-junit-xml=FILENAME`. If specified, and if the test configuration is valid enough to begin executing, then Terraform writes a JUnit XML test result report to the given filename, describing similar information as included in the normal test output. ([#34291](https://github.com/hashicorp/terraform/issues/34291)) * The new command `terraform rpcapi` exposes some Terraform Core functionality through an RPC interface compatible with [`go-plugin`](https://github.com/hashicorp/go-plugin). The exact RPC API exposed here is currently subject to change at any time, because it's here primarily as a vehicle to support the [Terraform Stacks](https://www.hashicorp.com/blog/terraform-stacks-explained) private preview and so will be broken if necessary to respond to feedback from private preview participants, or possibly for other reasons. Do not use this mechanism yet outside of Terraform Stacks private preview. * The experimental "deferred actions" feature, enabled by passing the `-allow-deferral` option to `terraform plan`, permits `count` and `for_each` arguments in `module`, `resource`, and `data` blocks to have unknown values and allows providers to react more flexibly to unknown values. This experiment is under active development, and so it's not yet useful to participate in this experiment. From bf0a6ed41cab4ad0f3f5ba492dd43951633997dc Mon Sep 17 00:00:00 2001 From: Nick Fagerlund Date: Mon, 29 Apr 2024 15:39:26 -0700 Subject: [PATCH 031/161] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3fa7c396a..72a11bdf38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ENHANCEMENTS: * `cli`: Updates the Terraform CLI output to show logical separation between OPA and Sentinel policy evaluations * `terraform init` now accepts a `-json` option. If specified, enables the machine readable JSON output. ([#34886](https://github.com/hashicorp/terraform/pull/34886)) * `terraform test:` The test framework will now maintain sensitive metadata between run blocks. ([#35021](https://github.com/hashicorp/terraform/pull/35021)) +* Core: improved performance of `AttachResourceConfigTransformer` (an implementation detail of plans and applies) when the number of resources is extremely large. ([#35088](https://github.com/hashicorp/terraform/pull/35088)) BUG FIXES: From aeb5b4772321bc4a0d6317ce1292cac7cac73b09 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Tue, 30 Apr 2024 17:16:49 +0200 Subject: [PATCH 032/161] stacks: remove unused test case --- ...ponent-for-each-from-component.tfstack.hcl | 37 ------------------- .../parent/parent.tf | 27 -------------- .../self/self.tf | 23 ------------ 3 files changed, 87 deletions(-) delete mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/deferred-component-for-each-from-component.tfstack.hcl delete mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/parent/parent.tf delete mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/self/self.tf diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/deferred-component-for-each-from-component.tfstack.hcl b/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/deferred-component-for-each-from-component.tfstack.hcl deleted file mode 100644 index a544348cfe..0000000000 --- a/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/deferred-component-for-each-from-component.tfstack.hcl +++ /dev/null @@ -1,37 +0,0 @@ -required_providers { - testing = { - source = "hashicorp/testing" - version = "0.1.0" - } -} - - -provider "testing" "default" {} - - -component "parent" { - source = "./parent" - - providers = { - testing = provider.testing.default - } - - inputs = { - input = "parent" - } -} - - -component "self" { - source = "./self" - - providers = { - testing = provider.testing.default - } - - inputs = { - input = each.value - } - - for_each = component.parent.letters_in_id -} diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/parent/parent.tf b/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/parent/parent.tf deleted file mode 100644 index 315721bc52..0000000000 --- a/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/parent/parent.tf +++ /dev/null @@ -1,27 +0,0 @@ -terraform { - required_providers { - testing = { - source = "hashicorp/testing" - version = "0.1.0" - } - } -} - -variable "id" { - type = string - default = null - nullable = true # We'll generate an ID if none provided. -} - -variable "input" { - type = string -} - -resource "testing_resource" "data" { - id = var.id - value = var.input -} - -output "letters_in_id" { - value = toset(split("", testing_resource.data.id)) -} diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/self/self.tf b/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/self/self.tf deleted file mode 100644 index 4da49727a5..0000000000 --- a/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component/self/self.tf +++ /dev/null @@ -1,23 +0,0 @@ -terraform { - required_providers { - testing = { - source = "hashicorp/testing" - version = "0.1.0" - } - } -} - -variable "id" { - type = string - default = null - nullable = true # We'll generate an ID if none provided. -} - -variable "input" { - type = string -} - -resource "testing_resource" "data" { - id = var.id - value = var.input -} From e7831d4e5d7c6a4e897a6f67f861d30844607b91 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Tue, 30 Apr 2024 17:16:30 -0400 Subject: [PATCH 033/161] use ResourceByAddr to lookup resource config The format of the resource keys in a `configs.Module` is an internal implementation detail, and should not be compared outside of the configs package. A module config already has a ResourceByAddr method we can use here which looks up a resource config by address. --- .../terraform/transform_attach_config_resource.go | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/internal/terraform/transform_attach_config_resource.go b/internal/terraform/transform_attach_config_resource.go index 48a71a1034..c582ad9fd0 100644 --- a/internal/terraform/transform_attach_config_resource.go +++ b/internal/terraform/transform_attach_config_resource.go @@ -6,7 +6,6 @@ package terraform import ( "log" - "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/configs" "github.com/hashicorp/terraform/internal/dag" ) @@ -49,16 +48,8 @@ func (t *AttachResourceConfigTransformer) Transform(g *Graph) error { log.Printf("[TRACE] AttachResourceConfigTransformer: %q (%T) has no configuration available", dag.VertexName(v), v) continue } - var m map[string]*configs.Resource - if addr.Resource.Mode == addrs.ManagedResourceMode { - m = config.Module.ManagedResources - } else if addr.Resource.Mode == addrs.DataResourceMode { - m = config.Module.DataResources - } else { - panic("unknown resource mode: " + addr.Resource.Mode.String()) - } - coord := addr.Resource.String() - if r, ok := m[coord]; ok && r.Addr() == addr.Resource { + + if r := config.Module.ResourceByAddr(addr.Resource); r != nil { log.Printf("[TRACE] AttachResourceConfigTransformer: attaching to %q (%T) config from %#v", dag.VertexName(v), v, r.DeclRange) arn.AttachResourceConfig(r) if gnapmc, ok := v.(GraphNodeAttachProviderMetaConfigs); ok { From 6e6f5502a7e193a307df95609756aa013e5df97f Mon Sep 17 00:00:00 2001 From: Nick Fagerlund Date: Wed, 1 May 2024 16:09:28 -0700 Subject: [PATCH 034/161] version: Prepare for 1.9.0-alpha20240501 release --- CHANGELOG.md | 2 +- version/VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 72a11bdf38..85c8ca2c3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## 1.9.0 (Unreleased) +## 1.9.0-alpha20240501 (May 1, 2024) ENHANCEMENTS: diff --git a/version/VERSION b/version/VERSION index 27167ba29c..b624057957 100644 --- a/version/VERSION +++ b/version/VERSION @@ -1 +1 @@ -1.9.0-alpha +1.9.0-alpha20240501 From d287ea43b5b1b8bc9f484423f33d23dc374fd2e3 Mon Sep 17 00:00:00 2001 From: Nick Fagerlund Date: Wed, 1 May 2024 17:18:37 -0700 Subject: [PATCH 035/161] Revert "version: Prepare for 1.9.0-alpha20240501 release" This reverts commit 6e6f5502a7e193a307df95609756aa013e5df97f. --- CHANGELOG.md | 2 +- version/VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85c8ca2c3a..72a11bdf38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## 1.9.0-alpha20240501 (May 1, 2024) +## 1.9.0 (Unreleased) ENHANCEMENTS: diff --git a/version/VERSION b/version/VERSION index b624057957..27167ba29c 100644 --- a/version/VERSION +++ b/version/VERSION @@ -1 +1 @@ -1.9.0-alpha20240501 +1.9.0-alpha From 35f44b01f00466f3eff909320c981cbc4235273a Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Thu, 2 May 2024 12:47:48 +0200 Subject: [PATCH 036/161] stacks: fix comment and add assertion for diagnostics --- .../stackruntime/internal/stackeval/component_test.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/internal/stacks/stackruntime/internal/stackeval/component_test.go b/internal/stacks/stackruntime/internal/stackeval/component_test.go index f4fca231f9..754dfc5d9d 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_test.go @@ -190,13 +190,17 @@ func TestComponentCheckInstances(t *testing.T) { } // When the for_each expression is invalid, CheckInstances should - // return a single instance with dynamic values in the repetition data. - // We don't distinguish between invalid and unknown for_each values. - gotInsts, _ := component.CheckInstances(ctx, InspectPhase) + // return nil and diagnostics. + gotInsts, diags := component.CheckInstances(ctx, InspectPhase) if gotInsts != nil { t.Fatalf("unexpected instances\ngot: %#v\nwant: nil", gotInsts) } + + assertMatchingDiag(t, diags, func(diag tfdiags.Diagnostic) bool { + return (diag.Severity() == tfdiags.Error && + diag.Description().Detail == "The for_each expression must produce either a map of any type or a set of strings. The keys of the map or the set elements will serve as unique identifiers for multiple instances of this component.") + }) }) subtestInPromisingTask(t, "unknown", func(ctx context.Context, t *testing.T) { main := testEvaluator(t, testEvaluatorOpts{ From 0d8c5e87e916f75bed961adc546632a087a3a249 Mon Sep 17 00:00:00 2001 From: Nick Fagerlund Date: Thu, 18 Apr 2024 11:42:08 -0700 Subject: [PATCH 037/161] =?UTF-8?q?=F0=9F=A7=B9=20Tests:=20Remove=20an=20e?= =?UTF-8?q?arly=20return=20that=20slipped=20in=20during=20debugging?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I checked this with James, and it was to temporarily speed up test cycle times on a slippery bug. --- internal/terraform/context_apply2_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/internal/terraform/context_apply2_test.go b/internal/terraform/context_apply2_test.go index 2018a3b6c6..1bf3f759e3 100644 --- a/internal/terraform/context_apply2_test.go +++ b/internal/terraform/context_apply2_test.go @@ -1336,7 +1336,6 @@ output "out" { _, diags = ctx.Plan(m, state, opts) assertNoErrors(t, diags) - return otherProvider.ConfigureProviderCalled = false otherProvider.ConfigureProviderFn = func(req providers.ConfigureProviderRequest) (resp providers.ConfigureProviderResponse) { @@ -2101,7 +2100,7 @@ resource "test_resource" "a" { import { to = test_resource.a - id = "importable" + id = "importable" } `, }) From a4f4abfe7989509bbd95e6ecbf85ae233b6127e3 Mon Sep 17 00:00:00 2001 From: Nick Fagerlund Date: Thu, 18 Apr 2024 11:48:22 -0700 Subject: [PATCH 038/161] Deferred actions tests: Add a computed output to the data source --- internal/terraform/context_apply_deferred_test.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/internal/terraform/context_apply_deferred_test.go b/internal/terraform/context_apply_deferred_test.go index 04e1f67949..2e19caae40 100644 --- a/internal/terraform/context_apply_deferred_test.go +++ b/internal/terraform/context_apply_deferred_test.go @@ -1627,7 +1627,8 @@ output "b" { }, wantOutputs: map[string]cty.Value{ "a": cty.NullVal(cty.Object(map[string]cty.Type{ - "name": cty.String, + "name": cty.String, + "output": cty.String, })), "b": cty.NullVal(cty.DynamicPseudoType), }, @@ -2311,6 +2312,10 @@ func (provider *deferredActionsProvider) Provider() providers.Interface { Type: cty.String, Required: true, }, + "output": { + Computed: true, + Type: cty.String, + }, }, }, }, @@ -2340,7 +2345,10 @@ func (provider *deferredActionsProvider) Provider() providers.Interface { } } return providers.ReadDataSourceResponse{ - State: req.Config, + State: cty.ObjectVal(map[string]cty.Value{ + "name": req.Config.GetAttr("name"), + "output": req.Config.GetAttr("name"), + }), } }, PlanResourceChangeFn: func(req providers.PlanResourceChangeRequest) providers.PlanResourceChangeResponse { From 582c7298d3493ee9be2286877e62a2543408ec70 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Thu, 2 May 2024 15:34:34 -0400 Subject: [PATCH 039/161] don't evaluate providers in overridden modules While we don't normally encounter providers within modules, they are technically still supported, and could exist within a module which has been overridden for testing. Since the module is not being evaluated, we cannot safely evaluate the provider config as variables will not exist within that module. --- .../terraform/context_apply_overrides_test.go | 47 +++++++++++++++++++ internal/terraform/graph.go | 19 +++++++- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/internal/terraform/context_apply_overrides_test.go b/internal/terraform/context_apply_overrides_test.go index ab033f931f..787af20630 100644 --- a/internal/terraform/context_apply_overrides_test.go +++ b/internal/terraform/context_apply_overrides_test.go @@ -638,6 +638,43 @@ resource "test_instance" "resource" { output "id" { value = test_instance.resource[0].id } +`, + }, + overrides: mocking.OverridesForTesting(nil, func(overrides addrs.Map[addrs.Targetable, *configs.Override]) { + overrides.Put(mustModuleInstance("module.test"), &configs.Override{ + Values: cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("h3ll0"), + }), + }) + }), + outputs: cty.EmptyObjectVal, + }, + "legacy provider config inside overridden module": { + configs: map[string]string{ + "main.tf": ` +module "test" { + source = "./child" +} +`, + "child/main.tf": ` +module "grandchild" { + source = "../grandchild" +} +output "id" { + value = "child" +} +`, + "grandchild/main.tf": ` +variable "in" { + default = "test_value" +} + +provider "test" { + value = var.in +} + +resource "test_instance" "resource" { +} `, }, overrides: mocking.OverridesForTesting(nil, func(overrides addrs.Map[addrs.Targetable, *configs.Override]) { @@ -720,6 +757,16 @@ output "id" { // functionality, in that they should stop the provider from being executed. var underlyingOverridesProvider = &testing_provider.MockProvider{ GetProviderSchemaResponse: &providers.GetProviderSchemaResponse{ + Provider: providers.Schema{ + Block: &configschema.Block{ + Attributes: map[string]*configschema.Attribute{ + "value": { + Type: cty.String, + Optional: true, + }, + }, + }, + }, ResourceTypes: map[string]providers.Schema{ "test_instance": { Block: &configschema.Block{ diff --git a/internal/terraform/graph.go b/internal/terraform/graph.go index 736c70e71c..98b1e85709 100644 --- a/internal/terraform/graph.go +++ b/internal/terraform/graph.go @@ -64,9 +64,11 @@ func (g *Graph) walk(walker GraphWalker) tfdiags.Diagnostics { } }() + haveOverrides := !ctx.Overrides().Empty() + // If the graph node is overridable, we'll check our overrides to see // if we need to apply any overrides to the node. - if overridable, ok := v.(GraphNodeOverridable); ok && !ctx.Overrides().Empty() { + if overridable, ok := v.(GraphNodeOverridable); ok && haveOverrides { // It'd be nice if we could just pass the overrides directly into // the nodes, but the way the AbstractNodeResource is created is // complicated and it's not easy to make sure that every @@ -80,6 +82,21 @@ func (g *Graph) walk(walker GraphWalker) tfdiags.Diagnostics { } } + if provider, ok := v.(GraphNodeProvider); ok && haveOverrides { + // If we find a legacy provider within an overridden module, we + // can't evaluate the config so we have to skip it. We do this here + // for the similar reasons as the resource overrides above, and to + // keep all the override logic together. + addr := provider.ProviderAddr() + // UnkeyedInstanceShim is used by legacy provider configs within a + // module to return an instance of that module, since they can never + // exist within an expanded instance. + if ctx.Overrides().IsOverridden(addr.Module.UnkeyedInstanceShim()) { + log.Printf("[DEBUG] skipping provider %s found within overridden module", addr) + return + } + } + // vertexCtx is the context that we use when evaluating. This // is normally the global context but can be overridden // with either a GraphNodeModuleInstance, GraphNodePartialExpandedModule, From b74715e5fbd5226dbf9505c926e733b365f4d773 Mon Sep 17 00:00:00 2001 From: kmoe <5575356+kmoe@users.noreply.github.com> Date: Fri, 3 May 2024 08:12:27 +0100 Subject: [PATCH 040/161] stacks: fix invalid filename (#35111) --- ...-component-for-each-from-component-of-invalid-type.tfstack.hcl | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/\020deferred-component-for-each-from-component-of-invalid-type.tfstack.hcl" => internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/deferred-component-for-each-from-component-of-invalid-type.tfstack.hcl (100%) diff --git "a/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/\020deferred-component-for-each-from-component-of-invalid-type.tfstack.hcl" b/internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/deferred-component-for-each-from-component-of-invalid-type.tfstack.hcl similarity index 100% rename from "internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/\020deferred-component-for-each-from-component-of-invalid-type.tfstack.hcl" rename to internal/stacks/stackruntime/testdata/mainbundle/test/deferred-component-for-each-from-component-of-invalid-type/deferred-component-for-each-from-component-of-invalid-type.tfstack.hcl From becfb069180d27713d399781cb70f7134c754e87 Mon Sep 17 00:00:00 2001 From: trujillo-adam Date: Fri, 3 May 2024 15:35:54 -0700 Subject: [PATCH 041/161] added reference page for block --- website/data/language-nav-data.json | 4 ++ website/docs/language/moved.mdx | 63 +++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 website/docs/language/moved.mdx diff --git a/website/data/language-nav-data.json b/website/data/language-nav-data.json index 6fadb9d28d..895afcc264 100644 --- a/website/data/language-nav-data.json +++ b/website/data/language-nav-data.json @@ -217,6 +217,10 @@ } ] }, + { + "title": "moved block", + "path": "moved" + }, { "title": "Checks", "path": "checks" }, { "title": "Import", diff --git a/website/docs/language/moved.mdx b/website/docs/language/moved.mdx new file mode 100644 index 0000000000..64dd91d119 --- /dev/null +++ b/website/docs/language/moved.mdx @@ -0,0 +1,63 @@ +--- +page_title: moved block configuration reference +description: Learn about the `moved` block that you can specify in Terraform configurations. The `moved` block programmatically changes the location of resource. +--- + +# `moved` block configuration reference + +This topic provides reference information for the `moved` block. + +## Introduction + +The `moved` block programmatically changes the address of a resource. Refer to [Refactoring](/terraform/language/modules/develop/refactoring) for details about how to use the `moved` block in your Terraform configurations. + +## Configuration model + +The following list outlines field hierarchy, language-specific data types, and requirements in the `moved` block. + +- [`moved`](#moved): map + - [`from`](#moved): string + - [`to`](#moved): string + +## Complete configuration + +When every field is defined, a `moved` block has the following form: + +```hcl + +moved = { + from = + to = +} +``` + +## Specification + +This section provides details about the fields you can configure in the `moved` block. + +### `moved` + +Map that specifies addresses for the resource. The following table describes the fields you can set in the `moved` block. + +| Field | Description | Type | Required | +| --- | --- | --- | --- | +| `from` | Specifies the previous address of the resource addresses using a syntax that allows Terraform to select modules, resources, and resources inside child modules. | string | required | +| `to` | Sepcifies the current address of the resource using a syntax that allows Terraform to select modules, resources, and resources inside child modules. | string | required | + +Before creating a new plan for the resource specified in the `to` field, Terraform checks the state for an existing object at the address specified in the `from` field. Terraform renames existing objects to the string specified in the `to` field then creates a plan. The plan directs Terraform to provision the resource specified in the `from` field as the resource specified in the `to` field. As a result, Terraform does not destroy the resource during the Terraform run. + +## Example + +The following example moves and AWS instance from address `aws_instance.a` to `aws_instance.b`: + +```hcl +moved { + from = aws_instance.a + to = aws_instance.b +} +``` + + + + + From d56ed454841b3e3c0883f5f453078ea9f99e5507 Mon Sep 17 00:00:00 2001 From: trujillo-adam Date: Fri, 3 May 2024 16:12:01 -0700 Subject: [PATCH 042/161] capitalized Moved and removed backticks --- website/data/language-nav-data.json | 2 +- website/docs/language/moved.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/website/data/language-nav-data.json b/website/data/language-nav-data.json index 895afcc264..bee6f0b01a 100644 --- a/website/data/language-nav-data.json +++ b/website/data/language-nav-data.json @@ -218,7 +218,7 @@ ] }, { - "title": "moved block", + "title": "Moved block", "path": "moved" }, { "title": "Checks", "path": "checks" }, diff --git a/website/docs/language/moved.mdx b/website/docs/language/moved.mdx index 64dd91d119..cb47c147ea 100644 --- a/website/docs/language/moved.mdx +++ b/website/docs/language/moved.mdx @@ -3,7 +3,7 @@ page_title: moved block configuration reference description: Learn about the `moved` block that you can specify in Terraform configurations. The `moved` block programmatically changes the location of resource. --- -# `moved` block configuration reference +# Moved block configuration reference This topic provides reference information for the `moved` block. From 5422c0d3f6664fe26f3915e318828fa15b47cbb1 Mon Sep 17 00:00:00 2001 From: Alex Ott Date: Tue, 30 Apr 2024 15:10:14 +0200 Subject: [PATCH 043/161] Make persist interval configurable via environment variable Signed-off-by: Alex Ott --- internal/backend/local/backend_apply.go | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/internal/backend/local/backend_apply.go b/internal/backend/local/backend_apply.go index d50ee24da8..c101d5bd4a 100644 --- a/internal/backend/local/backend_apply.go +++ b/internal/backend/local/backend_apply.go @@ -8,6 +8,8 @@ import ( "errors" "fmt" "log" + "os" + "strconv" "time" "github.com/hashicorp/terraform/internal/addrs" @@ -25,6 +27,22 @@ import ( // test hook called between plan+apply during opApply var testHookStopPlanApply func() +var ( + defaultPersistInterval = 20 // arbitrary interval that's hopefully a sweet spot + persistIntervalEnvironmentVariableName = "TF_BACKEND_PERSIST_INTERVAL_SECONDS" +) + +func getEnvAsInt(envName string, defaultValue int) int { + if val, exists := os.LookupEnv(envName); exists { + parsedVal, err := strconv.Atoi(val) + if err == nil { + return parsedVal + } + log.Printf("[ERROR] Can't parse value '%s' of environment variable '%s'", val, envName) + } + return defaultValue +} + func (b *Local) opApply( stopCtx context.Context, cancelCtx context.Context, @@ -82,7 +100,8 @@ func (b *Local) opApply( // stateHook uses schemas for when it periodically persists state to the // persistent storage backend. stateHook.Schemas = schemas - stateHook.PersistInterval = 20 * time.Second // arbitrary interval that's hopefully a sweet spot + persistInterval := getEnvAsInt(persistIntervalEnvironmentVariableName, defaultPersistInterval) + stateHook.PersistInterval = time.Duration(persistInterval) * time.Second var plan *plans.Plan // If we weren't given a plan, then we refresh/plan From 08917d162807eb82f291a4be254d9b5210c4531a Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Mon, 6 May 2024 13:38:59 +0200 Subject: [PATCH 044/161] stacks: error if provider emits deferred action when it's not supported --- internal/plans/deferring/deferred.go | 7 ++++ .../node_resource_abstract_instance.go | 42 +++++++++++++++++-- .../terraform/node_resource_plan_instance.go | 9 +++- 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/internal/plans/deferring/deferred.go b/internal/plans/deferring/deferred.go index 1221915e75..c7d54330ca 100644 --- a/internal/plans/deferring/deferred.go +++ b/internal/plans/deferring/deferred.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/plans" "github.com/hashicorp/terraform/internal/providers" + "github.com/hashicorp/terraform/internal/tfdiags" ) // Deferred keeps track of deferrals that have already happened, to help @@ -435,3 +436,9 @@ func (d *Deferred) ReportModuleExpansionDeferred(addr addrs.PartialExpandedModul } d.partialExpandedModulesDeferred.Add(addr) } + +// UnexpectedProviderDeferralDiagnostic is a diagnostic that indicates that a +// provider was deferred although deferrals were not allowed. +func UnexpectedProviderDeferralDiagnostic(addrs addrs.AbsResourceInstance) tfdiags.Diagnostic { + return tfdiags.Sourceless(tfdiags.Error, "Provider deferred changes when Terraform did not allow deferrals", fmt.Sprintf("The provider signaled a deferred action for %q, but in this context deferrals are disabled. This is a bug in the provider, please file an issue.", addrs.String())) +} diff --git a/internal/terraform/node_resource_abstract_instance.go b/internal/terraform/node_resource_abstract_instance.go index e18686464a..7b442a714d 100644 --- a/internal/terraform/node_resource_abstract_instance.go +++ b/internal/terraform/node_resource_abstract_instance.go @@ -20,6 +20,7 @@ import ( "github.com/hashicorp/terraform/internal/lang/marks" "github.com/hashicorp/terraform/internal/moduletest/mocking" "github.com/hashicorp/terraform/internal/plans" + "github.com/hashicorp/terraform/internal/plans/deferring" "github.com/hashicorp/terraform/internal/plans/objchange" "github.com/hashicorp/terraform/internal/providers" "github.com/hashicorp/terraform/internal/provisioners" @@ -375,6 +376,7 @@ func (n *NodeAbstractResourceInstance) planDestroy(ctx EvalContext, currentState var plan *plans.ResourceInstanceChange absAddr := n.Addr + deferralAllowed := ctx.Deferrals().DeferralAllowed() if n.ResolvedProvider.Provider.Type == "" { if deposedKey == "" { @@ -442,11 +444,17 @@ func (n *NodeAbstractResourceInstance) planDestroy(ctx EvalContext, currentState PriorPrivate: currentState.Private, ProviderMeta: metaConfigVal, ClientCapabilities: providers.ClientCapabilities{ - DeferralAllowed: ctx.Deferrals().DeferralAllowed(), + DeferralAllowed: deferralAllowed, }, }) deferred = resp.Deferred + // If we don't support deferrals, but the provider reports a deferral and does not + // emit any error level diagnostics, we should emit an error. + if resp.Deferred != nil && !deferralAllowed && !resp.Diagnostics.HasErrors() { + diags = diags.Append(deferring.UnexpectedProviderDeferralDiagnostic(n.Addr)) + } + // We may not have a config for all destroys, but we want to reference // it in the diagnostics if we do. if n.Config != nil { @@ -657,6 +665,12 @@ func (n *NodeAbstractResourceInstance) refresh(ctx EvalContext, deposedKey state }, }) + // If we don't support deferrals, but the provider reports a deferral and does not + // emit any error level diagnostics, we should emit an error. + if resp.Deferred != nil && !deferralAllowed && !resp.Diagnostics.HasErrors() { + diags = diags.Append(deferring.UnexpectedProviderDeferralDiagnostic(n.Addr)) + } + if resp.Deferred != nil { deferred = resp.Deferred } @@ -762,6 +776,8 @@ func (n *NodeAbstractResourceInstance) plan( var deferred *providers.Deferred resource := n.Addr.Resource.Resource + deferralAllowed := ctx.Deferrals().DeferralAllowed() + provider, providerSchema, err := getProvider(ctx, n.ResolvedProvider) if err != nil { return nil, nil, deferred, keyData, diags.Append(err) @@ -936,9 +952,14 @@ func (n *NodeAbstractResourceInstance) plan( PriorPrivate: priorPrivate, ProviderMeta: metaConfigVal, ClientCapabilities: providers.ClientCapabilities{ - DeferralAllowed: ctx.Deferrals().DeferralAllowed(), + DeferralAllowed: deferralAllowed, }, }) + // If we don't support deferrals, but the provider reports a deferral and does not + // emit any error level diagnostics, we should emit an error. + if resp.Deferred != nil && !deferralAllowed && !resp.Diagnostics.HasErrors() { + diags = diags.Append(deferring.UnexpectedProviderDeferralDiagnostic(n.Addr)) + } } diags = diags.Append(resp.Diagnostics.InConfigBody(config.Config, n.Addr.String())) if diags.HasErrors() { @@ -1093,9 +1114,15 @@ func (n *NodeAbstractResourceInstance) plan( PriorPrivate: plannedPrivate, ProviderMeta: metaConfigVal, ClientCapabilities: providers.ClientCapabilities{ - DeferralAllowed: ctx.Deferrals().DeferralAllowed(), + DeferralAllowed: deferralAllowed, }, }) + + // If we don't support deferrals, but the provider reports a deferral and does not + // emit any error level diagnostics, we should emit an error. + if resp.Deferred != nil && !deferralAllowed && !resp.Diagnostics.HasErrors() { + diags = diags.Append(deferring.UnexpectedProviderDeferralDiagnostic(n.Addr)) + } } // We need to tread carefully here, since if there are any warnings // in here they probably also came out of our previous call to @@ -1463,6 +1490,7 @@ func (n *NodeAbstractResourceInstance) readDataSource(ctx EvalContext, configVal var deferred *providers.Deferred config := *n.Config + deferralAllowed := ctx.Deferrals().DeferralAllowed() provider, providerSchema, err := getProvider(ctx, n.ResolvedProvider) diags = diags.Append(err) @@ -1525,10 +1553,16 @@ func (n *NodeAbstractResourceInstance) readDataSource(ctx EvalContext, configVal Config: configVal, ProviderMeta: metaConfigVal, ClientCapabilities: providers.ClientCapabilities{ - DeferralAllowed: ctx.Deferrals().DeferralAllowed(), + DeferralAllowed: deferralAllowed, }, }) + // If we don't support deferrals, but the provider reports a deferral and does not + // emit any error level diagnostics, we should emit an error. + if resp.Deferred != nil && !deferralAllowed && !resp.Diagnostics.HasErrors() { + diags = diags.Append(deferring.UnexpectedProviderDeferralDiagnostic(n.Addr)) + } + if resp.Deferred != nil { deferred = resp.Deferred } diff --git a/internal/terraform/node_resource_plan_instance.go b/internal/terraform/node_resource_plan_instance.go index 761559960c..814325119b 100644 --- a/internal/terraform/node_resource_plan_instance.go +++ b/internal/terraform/node_resource_plan_instance.go @@ -20,6 +20,7 @@ import ( "github.com/hashicorp/terraform/internal/instances" "github.com/hashicorp/terraform/internal/moduletest/mocking" "github.com/hashicorp/terraform/internal/plans" + "github.com/hashicorp/terraform/internal/plans/deferring" "github.com/hashicorp/terraform/internal/providers" "github.com/hashicorp/terraform/internal/states" "github.com/hashicorp/terraform/internal/tfdiags" @@ -477,6 +478,7 @@ func (n *NodePlannableResourceInstance) replaceTriggered(ctx EvalContext, repDat } func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs.AbsResourceInstance, importId string, provider providers.Interface, providerSchema providers.ProviderSchema) (*states.ResourceInstanceObject, *providers.Deferred, tfdiags.Diagnostics) { + deferralAllowed := ctx.Deferrals().DeferralAllowed() var diags tfdiags.Diagnostics absAddr := addr.Resource.Absolute(ctx.Path()) hookResourceID := HookResourceIdentity{ @@ -558,10 +560,15 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs. TypeName: addr.Resource.Resource.Type, ID: importId, ClientCapabilities: providers.ClientCapabilities{ - DeferralAllowed: ctx.Deferrals().DeferralAllowed(), + DeferralAllowed: deferralAllowed, }, }) } + // If we don't support deferrals, but the provider reports a deferral and does not + // emit any error level diagnostics, we should emit an error. + if resp.Deferred != nil && !deferralAllowed && !resp.Diagnostics.HasErrors() { + diags = diags.Append(deferring.UnexpectedProviderDeferralDiagnostic(n.Addr)) + } diags = diags.Append(resp.Diagnostics) deferred = resp.Deferred if diags.HasErrors() { From f684df82f6ae444319ada3b57793f832985eee9d Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Mon, 6 May 2024 15:30:00 +0200 Subject: [PATCH 045/161] stack: improve wording Co-authored-by: Brian Flad --- internal/plans/deferring/deferred.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/plans/deferring/deferred.go b/internal/plans/deferring/deferred.go index c7d54330ca..ab52378769 100644 --- a/internal/plans/deferring/deferred.go +++ b/internal/plans/deferring/deferred.go @@ -440,5 +440,5 @@ func (d *Deferred) ReportModuleExpansionDeferred(addr addrs.PartialExpandedModul // UnexpectedProviderDeferralDiagnostic is a diagnostic that indicates that a // provider was deferred although deferrals were not allowed. func UnexpectedProviderDeferralDiagnostic(addrs addrs.AbsResourceInstance) tfdiags.Diagnostic { - return tfdiags.Sourceless(tfdiags.Error, "Provider deferred changes when Terraform did not allow deferrals", fmt.Sprintf("The provider signaled a deferred action for %q, but in this context deferrals are disabled. This is a bug in the provider, please file an issue.", addrs.String())) + return tfdiags.Sourceless(tfdiags.Error, "Provider deferred changes when Terraform did not allow deferrals", fmt.Sprintf("The provider signaled a deferred action for %q, but in this context deferrals are disabled. This is a bug in the provider, please file an issue with the provider developers.", addrs.String())) } From 4dd4511871883a52afe695106b9ec203d890cfbe Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Mon, 6 May 2024 16:40:04 +0200 Subject: [PATCH 046/161] stacks: add tests for forbidden deferrals I only added them sporadically since I felt like there would be too much clutter if I added them in general. If we feel like this does not give us enough security we can run every tests once with deferral allowed and once without to check this is handled consistently --- .../terraform/context_apply_deferred_test.go | 231 +++++++++++++++++- 1 file changed, 227 insertions(+), 4 deletions(-) diff --git a/internal/terraform/context_apply_deferred_test.go b/internal/terraform/context_apply_deferred_test.go index 04e1f67949..4991d8dc48 100644 --- a/internal/terraform/context_apply_deferred_test.go +++ b/internal/terraform/context_apply_deferred_test.go @@ -71,6 +71,10 @@ type deferredActionsTestStage struct { // buildOpts is an optional field, that lets the test specify additional // options to be used when building the plan. buildOpts func(opts *PlanOpts) + + // wantDiagnostic is an optional field, that lets the test specify the + // expected diagnostics to be returned by the plan. + wantDiagnostic func(diags tfdiags.Diagnostics) bool } type ExpectedDeferred struct { @@ -1588,6 +1592,62 @@ output "a" { }, } + resourceReadButForbiddenTest = deferredActionsTest{ + configs: map[string]string{ + "main.tf": ` +resource "test" "a" { + name = "a" +} +output "a" { + value = test.a +} + `, + }, + state: states.BuildState(func(state *states.SyncState) { + state.SetResourceInstanceCurrent( + mustResourceInstanceAddr("test.a"), + &states.ResourceInstanceObjectSrc{ + Status: states.ObjectReady, + AttrsJSON: mustParseJson(map[string]interface{}{ + "name": "deferred_read", // this signals the mock provider to defer the read + }), + }, + addrs.AbsProviderConfig{ + Provider: addrs.NewDefaultProvider("test"), + Module: addrs.RootModule, + }) + }), + stages: []deferredActionsTestStage{ + { + buildOpts: func(opts *PlanOpts) { + opts.Mode = plans.RefreshOnlyMode + opts.DeferralAllowed = false + }, + inputs: map[string]cty.Value{}, + wantPlanned: map[string]cty.Value{}, + + wantActions: map[string]plans.Action{}, + wantOutputs: map[string]cty.Value{ + "a": cty.ObjectVal(map[string]cty.Value{ + "name": cty.StringVal("a"), + "upstream_names": cty.NullVal(cty.Set(cty.String)), + }), + }, + wantDeferred: map[string]ExpectedDeferred{}, + complete: false, + + wantDiagnostic: func(diags tfdiags.Diagnostics) bool { + for _, diag := range diags { + if diag.Description().Summary == "Provider deferred changes when Terraform did not allow deferrals" { + return true + } + } + return false + }, + }, + }, + } + readDataSourceTest = deferredActionsTest{ configs: map[string]string{ "main.tf": ` @@ -1641,6 +1701,56 @@ output "b" { }, } + readDataSourceButForbiddenTest = deferredActionsTest{ + configs: map[string]string{ + "main.tf": ` +data "test" "a" { + name = "deferred_read" +} + +resource "test" "b" { + name = data.test.a.name +} + +output "a" { + value = data.test.a +} + +output "b" { + value = test.b +} + `, + }, + stages: []deferredActionsTestStage{ + { + buildOpts: func(opts *PlanOpts) { + opts.DeferralAllowed = false + }, + inputs: map[string]cty.Value{}, + wantPlanned: map[string]cty.Value{}, + wantActions: map[string]plans.Action{}, + + wantOutputs: map[string]cty.Value{ + "a": cty.NullVal(cty.Object(map[string]cty.Type{ + "name": cty.String, + })), + "b": cty.NullVal(cty.DynamicPseudoType), + }, + wantDeferred: map[string]ExpectedDeferred{}, + complete: false, + + wantDiagnostic: func(diags tfdiags.Diagnostics) bool { + for _, diag := range diags { + if diag.Description().Summary == "Provider deferred changes when Terraform did not allow deferrals" { + return true + } + } + return false + }, + }, + }, + } + // planCreateResourceChange is a test that covers the behavior of planning a resource that is being created. planCreateResourceChange = deferredActionsTest{ configs: map[string]string{ @@ -2026,6 +2136,57 @@ output "a" { }, } + planDestroyResourceChangeButForbidden = deferredActionsTest{ + configs: map[string]string{ + "main.tf": ` +resource "test" "a" { + name = "deferred_resource_change" +} +output "a" { + value = test.a +} + `, + }, + state: states.BuildState(func(state *states.SyncState) { + state.SetResourceInstanceCurrent( + mustResourceInstanceAddr("test.a"), + &states.ResourceInstanceObjectSrc{ + Status: states.ObjectReady, + AttrsJSON: mustParseJson(map[string]interface{}{ + "name": "deferred_resource_change", + }), + }, + addrs.AbsProviderConfig{ + Provider: addrs.NewDefaultProvider("test"), + Module: addrs.RootModule, + }) + }), + stages: []deferredActionsTestStage{ + { + buildOpts: func(opts *PlanOpts) { + opts.Mode = plans.DestroyMode + opts.DeferralAllowed = false + }, + inputs: map[string]cty.Value{}, + wantPlanned: map[string]cty.Value{}, + + wantActions: map[string]plans.Action{}, + + wantOutputs: map[string]cty.Value{}, + wantDeferred: map[string]ExpectedDeferred{}, + complete: false, + wantDiagnostic: func(diags tfdiags.Diagnostics) bool { + for _, diag := range diags { + if diag.Description().Summary == "Provider deferred changes when Terraform did not allow deferrals" { + return true + } + } + return false + }, + }, + }, + } + importDeferredTest = deferredActionsTest{ configs: map[string]string{ "main.tf": ` @@ -2082,6 +2243,50 @@ import { }, }, } + + importDeferredButForbiddenTest = deferredActionsTest{ + configs: map[string]string{ + "main.tf": ` +variable "import_id" { + type = string +} + +resource "test" "a" { + name = "a" +} + +import { + id = var.import_id + to = test.a +} +`, + }, + stages: []deferredActionsTestStage{ + { + buildOpts: func(opts *PlanOpts) { + // We want to test if the user gets presented with a diagnostic in case no deferrals are allowed + opts.DeferralAllowed = false + }, + inputs: map[string]cty.Value{ + "import_id": cty.StringVal("deferred"), // Telling the test case to defer the import + }, + wantPlanned: map[string]cty.Value{}, + wantActions: make(map[string]plans.Action), + wantDeferred: map[string]ExpectedDeferred{}, + wantOutputs: make(map[string]cty.Value), + complete: false, + + wantDiagnostic: func(diags tfdiags.Diagnostics) bool { + for _, diag := range diags { + if diag.Description().Summary == "Provider deferred changes when Terraform did not allow deferrals" { + return true + } + } + return false + }, + }, + }, + } ) func TestContextApply_deferredActions(t *testing.T) { @@ -2108,6 +2313,10 @@ func TestContextApply_deferredActions(t *testing.T) { "plan_delete_resource_change": planDeleteResourceChange, "plan_destroy_resource_change": planDestroyResourceChange, "import_deferred": importDeferredTest, + "import_deferred_but_forbidden": importDeferredButForbiddenTest, + "resource_read_but_forbidden": resourceReadButForbiddenTest, + "data_read_but_forbidden": readDataSourceButForbiddenTest, + "plan_destroy_resource_change_but_forbidden": planDestroyResourceChangeButForbidden, } for name, test := range tests { @@ -2170,11 +2379,25 @@ func TestContextApply_deferredActions(t *testing.T) { var diags tfdiags.Diagnostics plan, diags = ctx.Plan(cfg, state, opts) - // We expect the correct planned changes and no diagnostics. - if stage.allowWarnings { - assertNoErrors(t, diags) + if stage.wantDiagnostic == nil { + // We expect the correct planned changes and no diagnostics. + if stage.allowWarnings { + assertNoErrors(t, diags) + } else { + assertNoDiagnostics(t, diags) + } } else { - assertNoDiagnostics(t, diags) + if !stage.wantDiagnostic(diags) { + t.Fatalf("missing expected diagnostics: %s", diags) + } else { + // We don't want to make any further assertions in this case. + // If diagnostics are expected it's valid that no plan may be returned. + return + } + } + + if plan == nil { + t.Fatalf("plan is nil") } if plan.Complete != stage.complete { From 3267718d3d20e295f7195a68643e42ffde8cb4a0 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Mon, 6 May 2024 15:37:14 +0200 Subject: [PATCH 047/161] stacks: support unknown for_each on embedded stacks --- .../internal/stackeval/stack_call.go | 24 +- .../internal/stackeval/stack_call_test.go | 48 ++-- internal/stacks/stackruntime/plan_test.go | 260 ++++++++++++++++++ ...d-stack-and-component-for-each.tfstack.hcl | 21 ++ ...ferred-embedded-stack-for-each.tfstack.hcl | 21 ++ 5 files changed, 338 insertions(+), 36 deletions(-) create mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/deferred-embedded-stack-and-component-for-each/deferred-embedded-stack-and-component-for-each.tfstack.hcl create mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/deferred-embedded-stack-for-each/deferred-embedded-stack-for-each.tfstack.hcl diff --git a/internal/stacks/stackruntime/internal/stackeval/stack_call.go b/internal/stacks/stackruntime/internal/stackeval/stack_call.go index 49f36ff151..e2eb7bd6d3 100644 --- a/internal/stacks/stackruntime/internal/stackeval/stack_call.go +++ b/internal/stacks/stackruntime/internal/stackeval/stack_call.go @@ -109,17 +109,6 @@ func (c *StackCall) CheckForEachValue(ctx context.Context, phase EvalPhase) (cty return cty.DynamicVal, diags } - if !result.Value.IsKnown() { - // FIXME: We should somehow allow this and emit a - // "deferred change" representing all of the as-yet-unknown - // instances of this call and everything beneath it. - diags = diags.Append(result.Diagnostic( - tfdiags.Error, - "Invalid for_each value", - "The for_each value must not be derived from values that will be determined only during the apply phase.", - )) - } - return result.Value, diags default: @@ -163,11 +152,16 @@ func (c *StackCall) CheckInstances(ctx context.Context, phase EvalPhase) (map[ad ctx, c.instances.For(phase), c.main, func(ctx context.Context) (map[addrs.InstanceKey]*StackCallInstance, tfdiags.Diagnostics) { var diags tfdiags.Diagnostics - forEachVal := c.ForEachValue(ctx, phase) + forEachVal, forEachValueDiags := c.CheckForEachValue(ctx, phase) + + diags = diags.Append(forEachValueDiags) + if diags.HasErrors() { + return nil, diags + } return instancesMap(forEachVal, func(ik addrs.InstanceKey, rd instances.RepetitionData) *StackCallInstance { return newStackCallInstance(c, ik, rd) - }, false), diags + }, true), diags }, ) } @@ -229,9 +223,7 @@ func (c *StackCall) ExprReferenceValue(ctx context.Context, phase EvalPhase) cty func (c *StackCall) checkValid(ctx context.Context, phase EvalPhase) tfdiags.Diagnostics { var diags tfdiags.Diagnostics - _, moreDiags := c.CheckForEachValue(ctx, phase) - diags = diags.Append(moreDiags) - _, moreDiags = c.CheckInstances(ctx, phase) + _, moreDiags := c.CheckInstances(ctx, phase) diags = diags.Append(moreDiags) // All of the other arguments in a stack call get evaluated separately diff --git a/internal/stacks/stackruntime/internal/stackeval/stack_call_test.go b/internal/stacks/stackruntime/internal/stackeval/stack_call_test.go index 63971e20cd..5557a94477 100644 --- a/internal/stacks/stackruntime/internal/stackeval/stack_call_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/stack_call_test.go @@ -190,7 +190,10 @@ func TestStackCallCheckInstances(t *testing.T) { // when we know there are zero instances, which would be a non-nil // empty map. gotInsts, diags := call.CheckInstances(ctx, InspectPhase) - assertNoDiags(t, diags) + assertMatchingDiag(t, diags, func(diag tfdiags.Diagnostic) bool { + return (diag.Severity() == tfdiags.Error && + diag.Description().Detail == "The for_each expression must produce either a map of any type or a set of strings. The keys of the map or the set elements will serve as unique identifiers for multiple instances of this stack.") + }) if gotInsts != nil { t.Errorf("wrong instances; want nil\n%#v", gotInsts) } @@ -203,30 +206,30 @@ func TestStackCallCheckInstances(t *testing.T) { }, }) - // For now it's invalid to use an unknown value in for_each. - // Later we're expecting to make this succeed but announce that - // planning everything beneath this call must be deferred to a - // future plan after everything else has been applied first. call := getStackCall(ctx, main) gotVal, diags := call.CheckForEachValue(ctx, InspectPhase) - assertMatchingDiag(t, diags, func(diag tfdiags.Diagnostic) bool { - return (diag.Severity() == tfdiags.Error && - diag.Description().Detail == "The for_each value must not be derived from values that will be determined only during the apply phase.") - }) + assertNoDiags(t, diags) wantVal := cty.UnknownVal(cty.Map(cty.EmptyObject)) if !wantVal.RawEquals(gotVal) { t.Errorf("wrong result\ngot: %#v\nwant: %#v", gotVal, wantVal) } - // When the for_each expression is invalid, CheckInstances should - // return nil to represent that we don't know enough to predict - // how many instances there are. This is a different result than - // when we know there are zero instances, which would be a non-nil - // empty map. gotInsts, diags := call.CheckInstances(ctx, InspectPhase) assertNoDiags(t, diags) - if gotInsts != nil { - t.Errorf("wrong instances; want nil\n%#v", gotInsts) + if got, want := len(gotInsts), 1; got != want { + t.Fatalf("wrong number of instances %d; want %d\n%#v", got, want, gotInsts) + } + + if gotInsts[addrs.WildcardKey] == nil { + t.Fatalf("missing expected addrs.WildcardKey instance\n%#v", gotInsts) + } + + if gotInsts[addrs.WildcardKey].repetition.EachKey.IsKnown() { + t.Errorf("EachKey should be unknown, but is known") + } + + if gotInsts[addrs.WildcardKey].repetition.EachValue.IsKnown() { + t.Errorf("EachValue should be unknown, but is known") } }) }) @@ -387,10 +390,15 @@ func TestStackCallResultValue(t *testing.T) { // When the for_each expression is unknown, the result value // is unknown too so we can use it as a placeholder for partial // downstream checking. - want := cty.UnknownVal(cty.Map(cty.Object(map[string]cty.Type{ - "test_map": cty.Map(cty.String), - "test_string": cty.String, - }))) + want := cty.MapVal( + map[string]cty.Value{ + "*": cty.ObjectVal(map[string]cty.Value{ + "test_map": cty.UnknownVal(cty.Map(cty.String)), + "test_string": cty.UnknownVal(cty.String), + }), + }, + ) + // FIXME: the cmp transformer ctydebug.CmpOptions seems to find // this particular pair of values troubling, causing it to get // into an infinite recursion. For now we'll just use RawEquals, diff --git a/internal/stacks/stackruntime/plan_test.go b/internal/stacks/stackruntime/plan_test.go index ad5bf7c87b..74d723b565 100644 --- a/internal/stacks/stackruntime/plan_test.go +++ b/internal/stacks/stackruntime/plan_test.go @@ -1705,6 +1705,266 @@ func TestPlanWithDeferredComponentForEach(t *testing.T) { } } +func TestPlanWithDeferredEmbeddedStackForEach(t *testing.T) { + ctx := context.Background() + cfg := loadMainBundleConfigForTest(t, path.Join("with-single-input", "deferred-embedded-stack-for-each")) + + fakePlanTimestamp, err := time.Parse(time.RFC3339, "1991-08-25T20:57:08Z") + if err != nil { + t.Fatal(err) + } + + changesCh := make(chan stackplan.PlannedChange, 8) + diagsCh := make(chan tfdiags.Diagnostic, 2) + req := PlanRequest{ + Config: cfg, + ProviderFactories: map[addrs.Provider]providers.Factory{ + addrs.NewDefaultProvider("testing"): func() (providers.Interface, error) { + return stacks_testing_provider.NewProvider(), nil + }, + }, + ForcePlanTimestamp: &fakePlanTimestamp, + InputValues: map[stackaddrs.InputVariable]ExternalInputValue{ + {Name: "stacks"}: { + Value: cty.UnknownVal(cty.Set(cty.String)), + DefRange: tfdiags.SourceRange{}, + }, + }, + } + resp := PlanResponse{ + PlannedChanges: changesCh, + Diagnostics: diagsCh, + } + go Plan(ctx, &req, &resp) + gotChanges, diags := collectPlanOutput(changesCh, diagsCh) + + reportDiagnosticsForTest(t, diags) + if len(diags) != 0 { + t.FailNow() // We reported the diags above/ + } + + sort.SliceStable(gotChanges, func(i, j int) bool { + return plannedChangeSortKey(gotChanges[i]) < plannedChangeSortKey(gotChanges[j]) + }) + + wantChanges := []stackplan.PlannedChange{ + &stackplan.PlannedChangeApplyable{ + Applyable: true, + }, + &stackplan.PlannedChangeHeader{ + TerraformVersion: version.SemVer, + }, + &stackplan.PlannedChangeComponentInstance{ + Addr: stackaddrs.Absolute( + stackaddrs.RootStackInstance.Child("a", addrs.WildcardKey), + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "self"}, + }, + ), + PlanApplyable: true, + PlanComplete: true, + Action: plans.Create, + PlannedInputValues: map[string]plans.DynamicValue{ + "id": mustPlanDynamicValueDynamicType(cty.NullVal(cty.String)), + "input": mustPlanDynamicValueDynamicType(cty.UnknownVal(cty.String)), + }, + PlannedOutputValues: map[string]cty.Value{}, + PlannedCheckResults: &states.CheckResults{}, + PlanTimestamp: fakePlanTimestamp, + PlannedInputValueMarks: map[string][]cty.PathValueMarks{ + "id": nil, + "input": nil, + }, + }, + &stackplan.PlannedChangeResourceInstancePlanned{ + ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ + Component: stackaddrs.Absolute( + stackaddrs.RootStackInstance.Child("a", addrs.WildcardKey), + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "self"}, + }, + ), + Item: addrs.AbsResourceInstanceObject{ + ResourceInstance: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + }, + }, + ProviderConfigAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: &plans.ResourceInstanceChangeSrc{ + Addr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + PrevRunAddr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + ProviderAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: plans.ChangeSrc{ + Action: plans.Create, + Before: mustPlanDynamicValue(cty.NullVal(cty.DynamicPseudoType)), + After: mustPlanDynamicValueSchema(cty.ObjectVal(map[string]cty.Value{ + "id": cty.UnknownVal(cty.String), + "value": cty.UnknownVal(cty.String), + }), stacks_testing_provider.TestingResourceSchema), + AfterSensitivePaths: nil, + }, + }, + Schema: stacks_testing_provider.TestingResourceSchema, + }, + &stackplan.PlannedChangeRootInputValue{ + Addr: stackaddrs.InputVariable{Name: "stacks"}, + Value: cty.UnknownVal(cty.Set(cty.String)), + }, + } + + if diff := cmp.Diff(wantChanges, gotChanges, ctydebug.CmpOptions, cmpCollectionsSet); diff != "" { + t.Errorf("wrong changes\n%s", diff) + } +} + +func TestPlanWithDeferredEmbeddedStackAndComponentForEach(t *testing.T) { + ctx := context.Background() + cfg := loadMainBundleConfigForTest(t, path.Join("with-single-input", "deferred-embedded-stack-and-component-for-each")) + + fakePlanTimestamp, err := time.Parse(time.RFC3339, "1991-08-25T20:57:08Z") + if err != nil { + t.Fatal(err) + } + + changesCh := make(chan stackplan.PlannedChange, 8) + diagsCh := make(chan tfdiags.Diagnostic, 2) + req := PlanRequest{ + Config: cfg, + ProviderFactories: map[addrs.Provider]providers.Factory{ + addrs.NewDefaultProvider("testing"): func() (providers.Interface, error) { + return stacks_testing_provider.NewProvider(), nil + }, + }, + ForcePlanTimestamp: &fakePlanTimestamp, + InputValues: map[stackaddrs.InputVariable]ExternalInputValue{ + {Name: "stacks"}: { + Value: cty.UnknownVal(cty.Map(cty.Set(cty.String))), + DefRange: tfdiags.SourceRange{}, + }, + }, + } + resp := PlanResponse{ + PlannedChanges: changesCh, + Diagnostics: diagsCh, + } + go Plan(ctx, &req, &resp) + gotChanges, diags := collectPlanOutput(changesCh, diagsCh) + + reportDiagnosticsForTest(t, diags) + if len(diags) != 0 { + t.FailNow() // We reported the diags above/ + } + + sort.SliceStable(gotChanges, func(i, j int) bool { + return plannedChangeSortKey(gotChanges[i]) < plannedChangeSortKey(gotChanges[j]) + }) + + wantChanges := []stackplan.PlannedChange{ + &stackplan.PlannedChangeApplyable{ + Applyable: true, + }, + &stackplan.PlannedChangeHeader{ + TerraformVersion: version.SemVer, + }, + &stackplan.PlannedChangeComponentInstance{ + Addr: stackaddrs.Absolute( + stackaddrs.RootStackInstance.Child("a", addrs.WildcardKey), + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "self"}, + Key: addrs.WildcardKey, + }, + ), + PlanApplyable: true, + PlanComplete: true, + Action: plans.Create, + PlannedInputValues: map[string]plans.DynamicValue{ + "id": mustPlanDynamicValueDynamicType(cty.NullVal(cty.String)), + "input": mustPlanDynamicValueDynamicType(cty.UnknownVal(cty.String)), + }, + PlannedOutputValues: map[string]cty.Value{}, + PlannedCheckResults: &states.CheckResults{}, + PlanTimestamp: fakePlanTimestamp, + PlannedInputValueMarks: map[string][]cty.PathValueMarks{ + "id": nil, + "input": nil, + }, + }, + &stackplan.PlannedChangeResourceInstancePlanned{ + ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ + Component: stackaddrs.Absolute( + stackaddrs.RootStackInstance.Child("a", addrs.WildcardKey), + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "self"}, + Key: addrs.WildcardKey, + }, + ), + Item: addrs.AbsResourceInstanceObject{ + ResourceInstance: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + }, + }, + ProviderConfigAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: &plans.ResourceInstanceChangeSrc{ + Addr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + PrevRunAddr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + ProviderAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: plans.ChangeSrc{ + Action: plans.Create, + Before: mustPlanDynamicValue(cty.NullVal(cty.DynamicPseudoType)), + After: mustPlanDynamicValueSchema(cty.ObjectVal(map[string]cty.Value{ + "id": cty.UnknownVal(cty.String), + "value": cty.UnknownVal(cty.String), + }), stacks_testing_provider.TestingResourceSchema), + AfterSensitivePaths: nil, + }, + }, + Schema: stacks_testing_provider.TestingResourceSchema, + }, + &stackplan.PlannedChangeRootInputValue{ + Addr: stackaddrs.InputVariable{Name: "stacks"}, + Value: cty.UnknownVal(cty.Map(cty.Set(cty.String))), + }, + } + + if diff := cmp.Diff(wantChanges, gotChanges, ctydebug.CmpOptions, cmpCollectionsSet); diff != "" { + t.Errorf("wrong changes\n%s", diff) + } +} + func TestPlanWithDeferredComponentForEachOfInvalidType(t *testing.T) { ctx := context.Background() cfg := loadMainBundleConfigForTest(t, "deferred-component-for-each-from-component-of-invalid-type") diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/deferred-embedded-stack-and-component-for-each/deferred-embedded-stack-and-component-for-each.tfstack.hcl b/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/deferred-embedded-stack-and-component-for-each/deferred-embedded-stack-and-component-for-each.tfstack.hcl new file mode 100644 index 0000000000..232d7f1257 --- /dev/null +++ b/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/deferred-embedded-stack-and-component-for-each/deferred-embedded-stack-and-component-for-each.tfstack.hcl @@ -0,0 +1,21 @@ +required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } +} + +variable "stacks" { + type = map(set(string)) +} + +provider "testing" "default" {} + +stack "a" { + source = "../deferred-component-for-each" + for_each = var.stacks + + inputs = { + components = each.value + } +} diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/deferred-embedded-stack-for-each/deferred-embedded-stack-for-each.tfstack.hcl b/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/deferred-embedded-stack-for-each/deferred-embedded-stack-for-each.tfstack.hcl new file mode 100644 index 0000000000..998b18abb8 --- /dev/null +++ b/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/deferred-embedded-stack-for-each/deferred-embedded-stack-for-each.tfstack.hcl @@ -0,0 +1,21 @@ +required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } +} + +variable "stacks" { + type = set(string) +} + +provider "testing" "default" {} + +stack "a" { + source = "../valid" + for_each = var.stacks + + inputs = { + input = each.value + } +} From e3d2923c1fc2135d56136e1df5a110ddf5fcad58 Mon Sep 17 00:00:00 2001 From: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> Date: Mon, 6 May 2024 15:35:01 -0700 Subject: [PATCH 048/161] Apply suggestions from code review Co-authored-by: Rose M Koron <32436232+rkoron007@users.noreply.github.com> --- website/docs/language/moved.mdx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/website/docs/language/moved.mdx b/website/docs/language/moved.mdx index cb47c147ea..57989c9de4 100644 --- a/website/docs/language/moved.mdx +++ b/website/docs/language/moved.mdx @@ -1,6 +1,6 @@ --- page_title: moved block configuration reference -description: Learn about the `moved` block that you can specify in Terraform configurations. The `moved` block programmatically changes the location of resource. +description: Learn about the `moved` block that you can specify in Terraform configurations. The `moved` block programmatically changes the location of a resource. --- # Moved block configuration reference @@ -24,7 +24,6 @@ The following list outlines field hierarchy, language-specific data types, and r When every field is defined, a `moved` block has the following form: ```hcl - moved = { from = to = @@ -41,14 +40,14 @@ Map that specifies addresses for the resource. The following table describes the | Field | Description | Type | Required | | --- | --- | --- | --- | -| `from` | Specifies the previous address of the resource addresses using a syntax that allows Terraform to select modules, resources, and resources inside child modules. | string | required | -| `to` | Sepcifies the current address of the resource using a syntax that allows Terraform to select modules, resources, and resources inside child modules. | string | required | +| `from` | Specifies a resource's previous address. The syntax allows Terraform to select modules, resources, and resources inside child modules. | string | required | +| `to` | Specifies the new address to relocate the resource to. The syntax allows Terraform to select modules, resources, and resources inside child modules. | string | required | -Before creating a new plan for the resource specified in the `to` field, Terraform checks the state for an existing object at the address specified in the `from` field. Terraform renames existing objects to the string specified in the `to` field then creates a plan. The plan directs Terraform to provision the resource specified in the `from` field as the resource specified in the `to` field. As a result, Terraform does not destroy the resource during the Terraform run. +Before creating a new plan for the resource specified in the `to` field, Terraform checks the state for an existing object at the address specified in the `from` field. Terraform renames existing objects to the string specified in the `to` field and then creates a plan. The plan directs Terraform to provision the resource specified in the `from` field as the resource specified in the `to` field. As a result, Terraform does not destroy the resource during the Terraform run. ## Example -The following example moves and AWS instance from address `aws_instance.a` to `aws_instance.b`: +The following example moves an AWS instance from address `aws_instance.a` to `aws_instance.b`: ```hcl moved { From 5df901e0224a7d5450115c94788d6ba037388beb Mon Sep 17 00:00:00 2001 From: Nick Fagerlund Date: Mon, 6 May 2024 18:52:58 -0700 Subject: [PATCH 049/161] Always propagate `ExternalDependencyDeferred`, always check `deferralAllowed` Some of the methods on `Deferred` were using `d.externalDependencyDeferred` to report whether some items were deferred, without first checking that `d.deferralAllowed` was even turned on. Then, to accommodate that, we were making sure to only pass the external dependency deferral signal (AKA the whole component is deferred) in to the `Deferred` struct if deferral is allowed. This was an artifact of the order things got implemented in; the "is thing deferred" checks predated the `deferralAllowed` field, and the call sites of those methods were behind other guards at the time. Anyway, this commit flips things so we now always propagate the received `ExternalDependencyDeferred` value in to the `Deferred`, but the `Deferred` takes the global on/off switch into account before relying on that value for its final answers about a given possible deferral. --- internal/plans/deferring/deferred.go | 13 +++++++++++++ internal/terraform/context_walk.go | 17 +++++++++-------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/internal/plans/deferring/deferred.go b/internal/plans/deferring/deferred.go index 1221915e75..69c60193bb 100644 --- a/internal/plans/deferring/deferred.go +++ b/internal/plans/deferring/deferred.go @@ -139,6 +139,11 @@ func NewDeferred(resourceGraph addrs.DirectedGraph[addrs.ConfigResource], enable // been reported to the receiver. func (d *Deferred) GetDeferredChanges() []*plans.DeferredResourceInstanceChange { var changes []*plans.DeferredResourceInstanceChange + + if !d.deferralAllowed { + return changes + } + for _, configMapElem := range d.resourceInstancesDeferred.Elems { for _, changeElem := range configMapElem.Value.Elems { changes = append(changes, changeElem.Value) @@ -196,6 +201,10 @@ func (d *Deferred) HaveAnyDeferrals() bool { // why the resource instance with the given address should have its planned // action deferred for a future plan/apply round. func (d *Deferred) IsResourceInstanceDeferred(addr addrs.AbsResourceInstance) bool { + if !d.deferralAllowed { + return false + } + if d.externalDependencyDeferred { return true } @@ -230,6 +239,10 @@ func (d *Deferred) IsResourceInstanceDeferred(addr addrs.AbsResourceInstance) bo // instance action should be deferred _before_ reporting that it has been by calling // [Deferred.IsResourceInstanceDeferred]. func (d *Deferred) ShouldDeferResourceInstanceChanges(addr addrs.AbsResourceInstance) bool { + if !d.deferralAllowed { + return false + } + d.mu.Lock() defer d.mu.Unlock() diff --git a/internal/terraform/context_walk.go b/internal/terraform/context_walk.go index ef625cc81d..6027da51bc 100644 --- a/internal/terraform/context_walk.go +++ b/internal/terraform/context_walk.go @@ -168,18 +168,19 @@ func (c *Context) graphWalker(graph *Graph, operation walkOperation, opts *graph } } - var deferred *deferring.Deferred - + var resourceGraph addrs.DirectedGraph[addrs.ConfigResource] if opts.DeferralAllowed { // We'll produce a derived graph that only includes the static resource // blocks, since we need that for deferral tracking. - resourceGraph := graph.ResourceGraph() - deferred = deferring.NewDeferred(resourceGraph, opts.DeferralAllowed) - if opts.ExternalDependencyDeferred { - deferred.SetExternalDependencyDeferred() - } + resourceGraph = graph.ResourceGraph() } else { - deferred = deferring.NewDeferred(addrs.NewDirectedGraph[addrs.ConfigResource](), false) + // Temporary (hopefully) optimization: skip building the expensive resource graph. + resourceGraph = addrs.NewDirectedGraph[addrs.ConfigResource]() + } + + deferred := deferring.NewDeferred(resourceGraph, opts.DeferralAllowed) + if opts.ExternalDependencyDeferred { + deferred.SetExternalDependencyDeferred() } return &ContextGraphWalker{ From 9c5377236cfa321054341b9b3465011df82a1bd6 Mon Sep 17 00:00:00 2001 From: Nick Fagerlund Date: Mon, 6 May 2024 19:02:38 -0700 Subject: [PATCH 050/161] Always set `DeferralAllowed` for applies (but skip the resource graph) This should be sound 100% of the time, because the only way anything can be deferred in an apply is if we _planned_ to defer it... in other words, if deferral was allowed during the plan. The reason we need this enabled is to allow proper construction of wildcard key addresses for data sources that are deferred due to unknown count or for_each values. Unlike with resources, we don't have a convenient space in the plan to stash info about a data source deferral; data sources don't have "planned changes" per se (they're unmanaged and thus can't be changed), so they don't result in a "deferred change" and must be re-checked during the apply. However, since applies are relying on the plan's info about deferred _actual_ changes, they don't need to construct the (still somewhat expensive) resource graph, so we should opt them out of that graph construction to avoid a performance regression. --- internal/terraform/context_apply.go | 2 ++ internal/terraform/context_walk.go | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/internal/terraform/context_apply.go b/internal/terraform/context_apply.go index 135e5fc550..8195b20693 100644 --- a/internal/terraform/context_apply.go +++ b/internal/terraform/context_apply.go @@ -154,6 +154,8 @@ func (c *Context) ApplyAndEval(plan *plans.Plan, config *configs.Config, opts *A Overrides: plan.Overrides, ExternalProviderConfigs: opts.ExternalProviders, + DeferralAllowed: true, + // We need to propagate the check results from the plan phase, // because that will tell us which checkable objects we're expecting // to see updated results from during the apply step. diff --git a/internal/terraform/context_walk.go b/internal/terraform/context_walk.go index 6027da51bc..8bc78481a0 100644 --- a/internal/terraform/context_walk.go +++ b/internal/terraform/context_walk.go @@ -169,7 +169,7 @@ func (c *Context) graphWalker(graph *Graph, operation walkOperation, opts *graph } var resourceGraph addrs.DirectedGraph[addrs.ConfigResource] - if opts.DeferralAllowed { + if opts.DeferralAllowed && (operation == walkPlan || operation == walkPlanDestroy) { // We'll produce a derived graph that only includes the static resource // blocks, since we need that for deferral tracking. resourceGraph = graph.ResourceGraph() From f8d3c5b1a2c0c732df15122c00625f961c5feeef Mon Sep 17 00:00:00 2001 From: Nick Fagerlund Date: Thu, 18 Apr 2024 12:08:02 -0700 Subject: [PATCH 051/161] Add tests for data source deferral due to unknown count/for_each --- .../terraform/context_apply_deferred_test.go | 184 ++++++++++++++++++ 1 file changed, 184 insertions(+) diff --git a/internal/terraform/context_apply_deferred_test.go b/internal/terraform/context_apply_deferred_test.go index 2e19caae40..be1a5d7427 100644 --- a/internal/terraform/context_apply_deferred_test.go +++ b/internal/terraform/context_apply_deferred_test.go @@ -82,6 +82,188 @@ var ( // We build some fairly complex configurations here, so we'll use separate // variables for each one outside of the test function itself for clarity. + // dataForEachTest is a test for deferral of data sources due to unknown + // for_each values. Since data sources don't result in planned changes, + // deferral has to be observed indirectly by checking for deferral of + // downstream objects that would otherwise have no reason to be deferred. + dataForEachTest = deferredActionsTest{ + configs: map[string]string{ + "main.tf": ` +variable "each" { + type = set(string) +} + +data "test" "a" { + for_each = var.each + + name = "a:${each.key}" +} + +resource "test" "b" { + name = "b" + upstream_names = [for v in data.test.a : v.name] +} + +output "from_data" { + value = [for v in data.test.a : v.output] +} + +output "from_resource" { + value = test.b.output +} +`, + }, + stages: []deferredActionsTestStage{ + // Stage 0. Unknown for_each in data source. The resource and + // outputs get transitively deferred. + { + inputs: map[string]cty.Value{ + "each": cty.DynamicVal, + }, + wantPlanned: map[string]cty.Value{ + "b": cty.ObjectVal(map[string]cty.Value{ + "name": cty.StringVal("b"), + "output": cty.UnknownVal(cty.String), + "upstream_names": cty.UnknownVal(cty.Set(cty.String)), + }), + }, + wantActions: map[string]plans.Action{}, + wantDeferred: map[string]ExpectedDeferred{ + "test.b": {Reason: providers.DeferredReasonDeferredPrereq, Action: plans.Create}, + }, + wantApplied: map[string]cty.Value{}, + // TODO: These deferred output values are wrong, but outputs are a separate ticket. + wantOutputs: map[string]cty.Value{ + "from_data": cty.EmptyTupleVal, + "from_resource": cty.NullVal(cty.DynamicPseudoType), + }, + complete: false, + allowWarnings: false, + }, + // Stage 1. Everything's known now, so it converges. + { + inputs: map[string]cty.Value{ + "each": cty.SetVal([]cty.Value{cty.StringVal("hey"), cty.StringVal("ho"), cty.StringVal("let's go")}), + }, + wantPlanned: map[string]cty.Value{ + "b": cty.ObjectVal(map[string]cty.Value{ + "name": cty.StringVal("b"), + "output": cty.UnknownVal(cty.String), + "upstream_names": cty.SetVal([]cty.Value{cty.StringVal("a:hey"), cty.StringVal("a:ho"), cty.StringVal("a:let's go")}), + }), + }, + wantActions: map[string]plans.Action{ + "test.b": plans.Create, + }, + wantDeferred: map[string]ExpectedDeferred{}, + wantApplied: map[string]cty.Value{ + "b": cty.ObjectVal(map[string]cty.Value{ + "name": cty.StringVal("b"), + "output": cty.StringVal("b"), + "upstream_names": cty.SetVal([]cty.Value{cty.StringVal("a:hey"), cty.StringVal("a:ho"), cty.StringVal("a:let's go")}), + }), + }, + wantOutputs: map[string]cty.Value{ + "from_data": cty.TupleVal([]cty.Value{cty.StringVal("a:hey"), cty.StringVal("a:ho"), cty.StringVal("a:let's go")}), + "from_resource": cty.StringVal("b"), + }, + complete: true, + allowWarnings: false, + }, + }, + } + + // dataCountTest is a test for deferral of data sources due to unknown + // count values. Since data sources don't result in planned changes, + // deferral has to be observed indirectly by checking for deferral of + // downstream objects that would otherwise have no reason to be deferred. + dataCountTest = deferredActionsTest{ + configs: map[string]string{ + "main.tf": ` +variable "data_count" { + type = number +} + +data "test" "a" { + count = var.data_count + + name = "a:${count.index}" +} + +resource "test" "b" { + name = "b" + upstream_names = [for v in data.test.a : v.name] +} + +output "from_data" { + value = [for v in data.test.a : v.output] +} + +output "from_resource" { + value = test.b.output +} +`, + }, + stages: []deferredActionsTestStage{ + // Stage 0. Unknown count in data source. The resource and + // outputs get transitively deferred. + { + inputs: map[string]cty.Value{ + "data_count": cty.DynamicVal, + }, + wantPlanned: map[string]cty.Value{ + "b": cty.ObjectVal(map[string]cty.Value{ + "name": cty.StringVal("b"), + "output": cty.UnknownVal(cty.String), + "upstream_names": cty.UnknownVal(cty.Set(cty.String)), + }), + }, + wantActions: map[string]plans.Action{}, + wantDeferred: map[string]ExpectedDeferred{ + "test.b": {Reason: providers.DeferredReasonDeferredPrereq, Action: plans.Create}, + }, + wantApplied: map[string]cty.Value{}, + // TODO: These deferred output values are wrong, but outputs are a separate ticket. + wantOutputs: map[string]cty.Value{ + "from_data": cty.EmptyTupleVal, + "from_resource": cty.NullVal(cty.DynamicPseudoType), + }, + complete: false, + allowWarnings: false, + }, + // Stage 1. Everything's known now, so it converges. + { + inputs: map[string]cty.Value{ + "data_count": cty.NumberIntVal(3), + }, + wantPlanned: map[string]cty.Value{ + "b": cty.ObjectVal(map[string]cty.Value{ + "name": cty.StringVal("b"), + "output": cty.UnknownVal(cty.String), + "upstream_names": cty.SetVal([]cty.Value{cty.StringVal("a:0"), cty.StringVal("a:1"), cty.StringVal("a:2")}), + }), + }, + wantActions: map[string]plans.Action{ + "test.b": plans.Create, + }, + wantDeferred: map[string]ExpectedDeferred{}, + wantApplied: map[string]cty.Value{ + "b": cty.ObjectVal(map[string]cty.Value{ + "name": cty.StringVal("b"), + "output": cty.StringVal("b"), + "upstream_names": cty.SetVal([]cty.Value{cty.StringVal("a:0"), cty.StringVal("a:1"), cty.StringVal("a:2")}), + }), + }, + wantOutputs: map[string]cty.Value{ + "from_data": cty.TupleVal([]cty.Value{cty.StringVal("a:0"), cty.StringVal("a:1"), cty.StringVal("a:2")}), + "from_resource": cty.StringVal("b"), + }, + complete: true, + allowWarnings: false, + }, + }, + } + // resourceForEachTest is a test that exercises the deferred actions // mechanism with a configuration that has a resource with an unknown // for_each attribute. @@ -2101,6 +2283,8 @@ func TestContextApply_deferredActions(t *testing.T) { "custom_conditions_with_orphans": customConditionsWithOrphansTest, "resource_read": resourceReadTest, "data_read": readDataSourceTest, + "data_for_each": dataForEachTest, + "data_count": dataCountTest, "plan_create_resource_change": planCreateResourceChange, "plan_update_resource_change": planUpdateResourceChange, "plan_noop_resource_change": planNoOpResourceChange, From e4721b268b59911f7fd36b08dbc3c1032ec707bc Mon Sep 17 00:00:00 2001 From: James Bardin Date: Tue, 7 May 2024 14:16:59 -0400 Subject: [PATCH 052/161] remove macos runners from buildworkflow --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b23d4b27b7..ce7692640b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -119,8 +119,8 @@ jobs: - {goos: "solaris", goarch: "amd64", runson: "ubuntu-latest", cgo-enabled: "0"} - {goos: "windows", goarch: "386", runson: "ubuntu-latest", cgo-enabled: "0"} - {goos: "windows", goarch: "amd64", runson: "ubuntu-latest", cgo-enabled: "0"} - - {goos: "darwin", goarch: "amd64", runson: "macos-latest", cgo-enabled: "1"} - - {goos: "darwin", goarch: "arm64", runson: "macos-latest", cgo-enabled: "1"} + - {goos: "darwin", goarch: "amd64", runson: "ubuntu-latest", cgo-enabled: "0"} + - {goos: "darwin", goarch: "arm64", runson: "ubuntu-latest", cgo-enabled: "0"} fail-fast: false package-docker: @@ -170,8 +170,8 @@ jobs: - {goos: "windows", goarch: "386"} - {goos: "linux", goarch: "386"} - {goos: "linux", goarch: "amd64"} - - {goos: linux, goarch: "arm"} - - {goos: linux, goarch: "arm64"} + - {goos: "linux", goarch: "arm"} + - {goos: "linux", goarch: "arm64"} fail-fast: false env: From 8db0330bd1b2f53ecddbf09e02fb908780440573 Mon Sep 17 00:00:00 2001 From: Bandhan Majumder <133476557+bandhan-majumder@users.noreply.github.com> Date: Wed, 8 May 2024 00:45:04 +0530 Subject: [PATCH 053/161] Update website/docs/language/syntax/configuration.mdx Fixed grammar and style issues. Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> --- website/docs/language/syntax/configuration.mdx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/website/docs/language/syntax/configuration.mdx b/website/docs/language/syntax/configuration.mdx index f7a8473d89..2ca57fe5bd 100644 --- a/website/docs/language/syntax/configuration.mdx +++ b/website/docs/language/syntax/configuration.mdx @@ -76,10 +76,7 @@ resource "aws_instance" "example" { A block has a _type_ (`resource` in this example). Each block type defines how many _labels_ must follow the type keyword. The `resource` block type expects two labels, which are `aws_instance` and `example` in the example above. -First label `aws_instance` is the `resource` type provided by AWS provider in Terraform and -second label `example` is an arbitrary name given to this particular instance of the `aws_instance` of block `resource`. -In Terraform, we can have multiple instances of the same block type (`resource`). And we differentiate -them by giving each instance a unique name. +The `aws_instance` label is specific to the AWS provider. It specifies the `resource` type that Terraform provisions when you apply the configuration. The second label is an arbitrary name that you can add to the particular instance of the resource. You can create multiple instances of the same block type and differentiate them by giving each instance a unique name. In this example, the Terraform configuration author assigned the `example` label to this instance of the `aws_instance` resource. A particular block type may have any number of required labels, or it may require none as with the nested `network_interface` block type. From 664bb21738b03797dc3642c44fa85a4be8ed780d Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Wed, 8 May 2024 09:54:39 +0200 Subject: [PATCH 054/161] stacks: add comment Co-authored-by: Nick Fagerlund --- .../stacks/stackruntime/internal/stackeval/stack_call_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/internal/stacks/stackruntime/internal/stackeval/stack_call_test.go b/internal/stacks/stackruntime/internal/stackeval/stack_call_test.go index 5557a94477..b50663e471 100644 --- a/internal/stacks/stackruntime/internal/stackeval/stack_call_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/stack_call_test.go @@ -214,6 +214,8 @@ func TestStackCallCheckInstances(t *testing.T) { t.Errorf("wrong result\ngot: %#v\nwant: %#v", gotVal, wantVal) } + // When for_each is unknown, CheckInstances returns a single instance + // whose key is `*` to represent the unknown number of instances. gotInsts, diags := call.CheckInstances(ctx, InspectPhase) assertNoDiags(t, diags) if got, want := len(gotInsts), 1; got != want { From b1e50d0475cc038d51a03afbcc0d4e031e18cfa3 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Wed, 8 May 2024 09:55:21 +0200 Subject: [PATCH 055/161] chore: fix comment Co-authored-by: Nick Fagerlund --- .../stacks/stackruntime/internal/stackeval/stack_call_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/stacks/stackruntime/internal/stackeval/stack_call_test.go b/internal/stacks/stackruntime/internal/stackeval/stack_call_test.go index b50663e471..82e2cf61df 100644 --- a/internal/stacks/stackruntime/internal/stackeval/stack_call_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/stack_call_test.go @@ -390,8 +390,8 @@ func TestStackCallResultValue(t *testing.T) { call := getStackCall(ctx, main) got := call.ResultValue(ctx, InspectPhase) // When the for_each expression is unknown, the result value - // is unknown too so we can use it as a placeholder for partial - // downstream checking. + // is a placeholder instance, with a wildcard key and potentially + // unknown attributes. want := cty.MapVal( map[string]cty.Value{ "*": cty.ObjectVal(map[string]cty.Value{ From 2c65affe05e812ca6a6184303be30c1f30edf13e Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Wed, 8 May 2024 10:31:45 +0200 Subject: [PATCH 056/161] stacks: add comments to tests --- internal/stacks/stackruntime/plan_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/internal/stacks/stackruntime/plan_test.go b/internal/stacks/stackruntime/plan_test.go index 74d723b565..c61385a795 100644 --- a/internal/stacks/stackruntime/plan_test.go +++ b/internal/stacks/stackruntime/plan_test.go @@ -1705,6 +1705,9 @@ func TestPlanWithDeferredComponentForEach(t *testing.T) { } } +// This test verifies that if an embedded stack is configured with a for_each value that is unknown / deferred +// that the plan will use the wildcard key for the embedded stack and that the components within are planned with +// unknown values. func TestPlanWithDeferredEmbeddedStackForEach(t *testing.T) { ctx := context.Background() cfg := loadMainBundleConfigForTest(t, path.Join("with-single-input", "deferred-embedded-stack-for-each")) @@ -1834,6 +1837,9 @@ func TestPlanWithDeferredEmbeddedStackForEach(t *testing.T) { } } +// This test checks that a stack with an embedded stack with unknown for-each value +// and within the embedded stack a component with a for-each value that is deferred +// will plan successfully. func TestPlanWithDeferredEmbeddedStackAndComponentForEach(t *testing.T) { ctx := context.Background() cfg := loadMainBundleConfigForTest(t, path.Join("with-single-input", "deferred-embedded-stack-and-component-for-each")) From c1a356cc9fd22e7a22dc509a227aa7d7bdbe867d Mon Sep 17 00:00:00 2001 From: Nara Kasbergen Kwon <855115+xiehan@users.noreply.github.com> Date: Wed, 8 May 2024 12:09:53 +0200 Subject: [PATCH 057/161] build: Set up Dependabot to manage HashiCorp-owned GitHub Actions versioning (#35124) --- .github/dependabot.yml | 23 +++++++++++++++++++++++ .github/workflows/build-terraform-cli.yml | 2 +- .github/workflows/build.yml | 6 +++--- 3 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..546a004d46 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,23 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: monthly + labels: + - dependencies + - build + - security + reviewers: + - hashicorp/terraform-core + # only update HashiCorp actions, external actions managed by TSCCR + allow: + - dependency-name: hashicorp/* + groups: + github-actions-breaking: + update-types: + - major + github-actions-backward-compatible: + update-types: + - minor + - patch diff --git a/.github/workflows/build-terraform-cli.yml b/.github/workflows/build-terraform-cli.yml index 3fc3dc2703..cd3ef63b5a 100644 --- a/.github/workflows/build-terraform-cli.yml +++ b/.github/workflows/build-terraform-cli.yml @@ -67,7 +67,7 @@ jobs: run: | mkdir -p "$LICENSE_DIR" && cp LICENSE "$LICENSE_DIR/LICENSE.txt" - if: ${{ inputs.goos == 'linux' }} - uses: hashicorp/actions-packaging-linux@v1 + uses: hashicorp/actions-packaging-linux@0596d94121d44bd00463ac9d245efea64ee282d0 # v1.7 with: name: "terraform" description: "Terraform enables you to safely and predictably create, change, and improve infrastructure. It is a tool that codifies APIs into declarative configuration files that can be shared amongst team members, treated as code, edited, reviewed, and versioned." diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b23d4b27b7..a0256f3c5c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -43,7 +43,7 @@ jobs: echo "pkg-name=${pkg_name}" | tee -a "${GITHUB_OUTPUT}" - name: Decide version number id: get-product-version - uses: hashicorp/actions-set-product-version@v1 + uses: hashicorp/actions-set-product-version@e2c49d61aff17b1280ddfe7bb031331d02ca0140 # v1.0.1 - name: Determine experiments id: get-ldflags env: @@ -78,7 +78,7 @@ jobs: - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Generate package metadata id: generate-metadata-file - uses: hashicorp/actions-generate-metadata@v1 + uses: hashicorp/actions-generate-metadata@fdbc8803a0e53bcbb912ddeee3808329033d6357 # v1.1.1 with: version: ${{ needs.get-product-version.outputs.product-version }} product: ${{ env.PKG_NAME }} @@ -139,7 +139,7 @@ jobs: steps: - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Build Docker images - uses: hashicorp/actions-docker-build@v1 + uses: hashicorp/actions-docker-build@f6278ea21555b4b4737e4cf366e808ba2bb59146 # v1.6.1 with: pkg_name: "terraform_${{env.version}}" version: ${{env.version}} From 1b51f1a89b05b4e020f74e853e0feebf2f8a9f32 Mon Sep 17 00:00:00 2001 From: "hashicorp-tsccr[bot]" Date: Wed, 8 May 2024 10:22:03 +0000 Subject: [PATCH 058/161] Result of tsccr-helper -log-level=info gha update -latest . --- .github/workflows/build-terraform-cli.yml | 8 ++--- .github/workflows/build.yml | 30 +++++++++---------- .github/workflows/checks.yml | 26 ++++++++-------- .../workflows/crt-hook-equivalence-tests.yml | 2 +- .../workflows/manual-equivalence-tests.yml | 2 +- .github/workflows/merged-pr.yml | 2 +- 6 files changed, 35 insertions(+), 35 deletions(-) diff --git a/.github/workflows/build-terraform-cli.yml b/.github/workflows/build-terraform-cli.yml index cd3ef63b5a..cb4873c56e 100644 --- a/.github/workflows/build-terraform-cli.yml +++ b/.github/workflows/build-terraform-cli.yml @@ -38,8 +38,8 @@ jobs: runs-on: ${{ inputs.runson }} name: Terraform ${{ inputs.goos }} ${{ inputs.goarch }} v${{ inputs.product-version }} steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 with: go-version: ${{ inputs.go-version }} - name: Build Terraform @@ -86,13 +86,13 @@ jobs: echo "RPM_PACKAGE=$(basename out/*.rpm)" >> $GITHUB_ENV echo "DEB_PACKAGE=$(basename out/*.deb)" >> $GITHUB_ENV - if: ${{ inputs.goos == 'linux' }} - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: ${{ env.RPM_PACKAGE }} path: out/${{ env.RPM_PACKAGE }} if-no-files-found: error - if: ${{ inputs.goos == 'linux' }} - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: ${{ env.DEB_PACKAGE }} path: out/${{ env.DEB_PACKAGE }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a0256f3c5c..ad61fe7db6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -35,7 +35,7 @@ jobs: pkg-name: ${{ steps.get-pkg-name.outputs.pkg-name }} steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Get Package Name id: get-pkg-name run: | @@ -62,7 +62,7 @@ jobs: go-version: ${{ steps.get-go-version.outputs.version }} steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Determine Go version id: get-go-version uses: ./.github/actions/go-version @@ -75,7 +75,7 @@ jobs: filepath: ${{ steps.generate-metadata-file.outputs.filepath }} steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Generate package metadata id: generate-metadata-file uses: hashicorp/actions-generate-metadata@fdbc8803a0e53bcbb912ddeee3808329033d6357 # v1.1.1 @@ -83,7 +83,7 @@ jobs: version: ${{ needs.get-product-version.outputs.product-version }} product: ${{ env.PKG_NAME }} - - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: metadata.json path: ${{ steps.generate-metadata-file.outputs.filepath }} @@ -137,7 +137,7 @@ jobs: repo: "terraform" version: ${{needs.get-product-version.outputs.product-version}} steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Build Docker images uses: hashicorp/actions-docker-build@f6278ea21555b4b4737e4cf366e808ba2bb59146 # v1.6.1 with: @@ -185,10 +185,10 @@ jobs: cache_path=internal/command/e2etest/build echo "e2e-cache-key=${cache_key}" | tee -a "${GITHUB_OUTPUT}" echo "e2e-cache-path=${cache_path}" | tee -a "${GITHUB_OUTPUT}" - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Install Go toolchain - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 + uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 with: go-version: ${{ needs.get-go-version.outputs.go-version }} @@ -205,7 +205,7 @@ jobs: bash ./internal/command/e2etest/make-archive.sh - name: Save test harness to cache - uses: actions/cache/save@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache/save@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: ${{ steps.set-cache-values.outputs.e2e-cache-path }} key: ${{ steps.set-cache-values.outputs.e2e-cache-key }}_${{ matrix.goos }}_${{ matrix.goarch }} @@ -243,9 +243,9 @@ jobs: # fresh build from source.) - name: Checkout repo if: ${{ (matrix.goos == 'linux') || (matrix.goos == 'darwin') }} - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: "Restore cache" - uses: actions/cache/restore@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 id: e2etestpkg with: path: ${{ needs.e2etest-build.outputs.e2e-cache-path }} @@ -253,7 +253,7 @@ jobs: fail-on-cache-miss: true enableCrossOsArchive: true - name: "Download Terraform CLI package" - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 id: clipkg with: name: terraform_${{env.version}}_${{ env.os }}_${{ env.arch }}.zip @@ -264,7 +264,7 @@ jobs: unzip "${{ needs.e2etest-build.outputs.e2e-cache-path }}/terraform-e2etest_${{ env.os }}_${{ env.arch }}.zip" unzip "./terraform_${{env.version}}_${{ env.os }}_${{ env.arch }}.zip" - name: Set up QEMU - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 + uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 if: ${{ contains(matrix.goarch, 'arm') }} with: platforms: all @@ -298,17 +298,17 @@ jobs: steps: - name: Install Go toolchain - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 + uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 with: go-version: ${{ needs.get-go-version.outputs.go-version }} - name: Download Terraform CLI package - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 id: clipkg with: name: terraform_${{ env.version }}_linux_amd64.zip path: . - name: Checkout terraform-exec repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 with: repository: hashicorp/terraform-exec path: terraform-exec diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 4e22e03377..1d298b78c9 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -36,14 +36,14 @@ jobs: steps: - name: "Fetch source code" - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Determine Go version id: go uses: ./.github/actions/go-version - name: Install Go toolchain - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 + uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 with: go-version: ${{ steps.go.outputs.version }} @@ -51,7 +51,7 @@ jobs: # identical across the unit-tests, e2e-tests, and consistency-checks # jobs, or else weird things could happen. - name: Cache Go modules - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: "~/go/pkg" key: go-mod-${{ hashFiles('go.sum') }} @@ -71,14 +71,14 @@ jobs: steps: - name: "Fetch source code" - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Determine Go version id: go uses: ./.github/actions/go-version - name: Install Go toolchain - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 + uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 with: go-version: ${{ steps.go.outputs.version }} @@ -86,7 +86,7 @@ jobs: # identical across the unit-tests, e2e-tests, and consistency-checks # jobs, or else weird things could happen. - name: Cache Go modules - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: "~/go/pkg" key: go-mod-${{ hashFiles('go.sum') }} @@ -109,14 +109,14 @@ jobs: steps: - name: "Fetch source code" - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Determine Go version id: go uses: ./.github/actions/go-version - name: Install Go toolchain - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 + uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 with: go-version: ${{ steps.go.outputs.version }} @@ -124,7 +124,7 @@ jobs: # identical across the unit-tests, e2e-tests, and consistency-checks # jobs, or else weird things could happen. - name: Cache Go modules - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: "~/go/pkg" key: go-mod-${{ hashFiles('go.sum') }} @@ -141,7 +141,7 @@ jobs: steps: - name: "Fetch source code" - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 with: fetch-depth: 0 # We need to do comparisons against the main branch. @@ -150,7 +150,7 @@ jobs: uses: ./.github/actions/go-version - name: Install Go toolchain - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 + uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 with: go-version: ${{ steps.go.outputs.version }} @@ -158,7 +158,7 @@ jobs: # identical across the unit-tests, e2e-tests, and consistency-checks # jobs, or else weird things could happen. - name: Cache Go modules - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: "~/go/pkg" key: go-mod-${{ hashFiles('go.sum') }} @@ -177,7 +177,7 @@ jobs: fi - name: Cache protobuf tools - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: "tools/protobuf-compile/.workdir" key: protobuf-tools-${{ hashFiles('tools/protobuf-compile/protobuf-compile.go') }} diff --git a/.github/workflows/crt-hook-equivalence-tests.yml b/.github/workflows/crt-hook-equivalence-tests.yml index 3bffd2cd13..f675d8bfca 100644 --- a/.github/workflows/crt-hook-equivalence-tests.yml +++ b/.github/workflows/crt-hook-equivalence-tests.yml @@ -33,7 +33,7 @@ jobs: needs: - parse-metadata steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 with: ref: ${{ needs.parse-metadata.outputs.target-branch }} - uses: ./.github/actions/equivalence-test diff --git a/.github/workflows/manual-equivalence-tests.yml b/.github/workflows/manual-equivalence-tests.yml index 648aac8044..5a66b375eb 100644 --- a/.github/workflows/manual-equivalence-tests.yml +++ b/.github/workflows/manual-equivalence-tests.yml @@ -25,7 +25,7 @@ jobs: name: "Run equivalence tests" runs-on: ubuntu-latest steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 with: ref: ${{ inputs.target-branch }} - uses: ./.github/actions/equivalence-test diff --git a/.github/workflows/merged-pr.yml b/.github/workflows/merged-pr.yml index a372835840..17a3867307 100644 --- a/.github/workflows/merged-pr.yml +++ b/.github/workflows/merged-pr.yml @@ -13,7 +13,7 @@ jobs: if: github.event.pull_request.merged == true runs-on: ubuntu-latest steps: - - uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1 + - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | github.rest.issues.createComment({ From 27ca7b2ac0d3f75ad27714a2b7cdd203f378f502 Mon Sep 17 00:00:00 2001 From: Nara Kasbergen Kwon <855115+xiehan@users.noreply.github.com> Date: Wed, 8 May 2024 13:22:59 +0200 Subject: [PATCH 059/161] Allow TSCCR and Dependabot PRs to trigger builds Useful to verify that there are no unintended consequences when upgrading dependencies --- .github/workflows/build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ad61fe7db6..2585efacc6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,6 +12,8 @@ on: - main - 'v[0-9]+.[0-9]+' - releng/** + - tsccr-auto-pinning/** + - dependabot/** tags: - 'v[0-9]+.[0-9]+.[0-9]+*' From f764c071c599e233c1a0784270121c186c0e6719 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Wed, 8 May 2024 09:15:52 -0700 Subject: [PATCH 060/161] Update CHANGELOG.md Some of the entries had formatting inconsistencies, and while here I also tried to elaborate some of the change descriptions so that they focus on end-user-visible behavior rather than implementation details. --- CHANGELOG.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 72a11bdf38..90282ccf27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,15 +5,15 @@ ENHANCEMENTS: * `terraform console`: Now has basic support for multi-line input in interactive mode. ([#34822](https://github.com/hashicorp/terraform/pull/34822)) If an entered line contains opening paretheses/etc that are not closed, Terraform will await another line of input to complete the expression. This initial implementation is primarily intended to support pasting in multi-line expressions from elsewhere, rather than for manual multi-line editing, so the interactive editing support is currently limited. -* `cli`: Updates the Terraform CLI output to show logical separation between OPA and Sentinel policy evaluations +* `terraform plan`: Improved presentation of OPA and Sentinel policy evaluations in HCP Terraform remote runs, for logical separation. * `terraform init` now accepts a `-json` option. If specified, enables the machine readable JSON output. ([#34886](https://github.com/hashicorp/terraform/pull/34886)) -* `terraform test:` The test framework will now maintain sensitive metadata between run blocks. ([#35021](https://github.com/hashicorp/terraform/pull/35021)) -* Core: improved performance of `AttachResourceConfigTransformer` (an implementation detail of plans and applies) when the number of resources is extremely large. ([#35088](https://github.com/hashicorp/terraform/pull/35088)) +* `terraform test`: Test runs can now pass sensitive values to input variables while preserving their dynamic sensitivity. Previously sensitivity would be preserved only for variables statically declared as being sensitive, using `sensitive = true`. ([#35021](https://github.com/hashicorp/terraform/pull/35021)) +* Performance improvement during graph building for configurations with an extremely large number of `resource` blocks. ([#35088](https://github.com/hashicorp/terraform/pull/35088)) BUG FIXES: -* `remote-exec`: Each remote connection will be closed immediately after use ([#34137](https://github.com/hashicorp/terraform/issues/34137)) -* `backend/s3`: Fixed the digest value displayed for DynamoDB/S3 state checksum mismatches ([#34387](https://github.com/hashicorp/terraform/issues/34387)) +* `remote-exec`: Each remote connection will now be closed immediately after use. ([#34137](https://github.com/hashicorp/terraform/issues/34137)) +* `backend/s3`: Fixed the digest value displayed for DynamoDB/S3 state checksum mismatches. ([#34387](https://github.com/hashicorp/terraform/issues/34387)) EXPERIMENTS: From 901f2350120b32f3edfcfbd7590eb49262cef17f Mon Sep 17 00:00:00 2001 From: Craig Wright Date: Wed, 8 May 2024 09:55:35 -0700 Subject: [PATCH 061/161] Bump to latest version of backport-assistant Possibly due to recent changes in GitHub Actions, backport-assistant started failing. Hoping that by bumping to latest, it will fix this issue. --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8ac5c1bd30..7c730a1a51 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,7 +10,7 @@ jobs: backport: if: github.event.pull_request.merged runs-on: ubuntu-latest - container: hashicorpdev/backport-assistant:0.3.4@sha256:1fb1e4dde82c28eaf27f4720eaffb2e19d490c8b42df244f834f5a550a703070 + container: hashicorpdev/backport-assistant:0.4.0@sha256:0c0c7e452673de42675d7966bfa1268103ca60c9de30ae4a72b2136d448a54dc steps: - name: Run Backport Assistant run: | From c6bf44d3c59fb1d9d0f83cd1973c3449228c69e7 Mon Sep 17 00:00:00 2001 From: Craig Wright Date: Wed, 8 May 2024 15:16:02 -0700 Subject: [PATCH 062/161] Update website/docs/language/resources/provisioners/syntax.mdx Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> --- website/docs/language/resources/provisioners/syntax.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/language/resources/provisioners/syntax.mdx b/website/docs/language/resources/provisioners/syntax.mdx index 35923611fe..1925a3c94b 100644 --- a/website/docs/language/resources/provisioners/syntax.mdx +++ b/website/docs/language/resources/provisioners/syntax.mdx @@ -246,7 +246,7 @@ can leave a resource in a semi-configured state. Because Terraform cannot reason about what the provisioner does, the only way to ensure proper creation of a resource is to recreate it. This is tainting. -You can change this behavior by setting the `when` attribute, +You can change this behavior by setting the `on_failure` attribute to `continue`. Refer to [Failure Behavior](#failure-behavior) for additional information. which is covered in detail below. ## Destroy-Time Provisioners From 57f7ee129d7fadac73d1c05f2944df172778244a Mon Sep 17 00:00:00 2001 From: Craig Wright Date: Wed, 8 May 2024 15:16:08 -0700 Subject: [PATCH 063/161] Update website/docs/language/resources/provisioners/syntax.mdx Co-authored-by: trujillo-adam <47586768+trujillo-adam@users.noreply.github.com> --- website/docs/language/resources/provisioners/syntax.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/website/docs/language/resources/provisioners/syntax.mdx b/website/docs/language/resources/provisioners/syntax.mdx index 1925a3c94b..d3a042ec70 100644 --- a/website/docs/language/resources/provisioners/syntax.mdx +++ b/website/docs/language/resources/provisioners/syntax.mdx @@ -247,7 +247,6 @@ reason about what the provisioner does, the only way to ensure proper creation of a resource is to recreate it. This is tainting. You can change this behavior by setting the `on_failure` attribute to `continue`. Refer to [Failure Behavior](#failure-behavior) for additional information. -which is covered in detail below. ## Destroy-Time Provisioners From 577c0bbcc7305948c6c53275c1ba17162d80fdf5 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Thu, 9 May 2024 12:01:35 -0400 Subject: [PATCH 064/161] Revert "Result of tsccr-helper -log-level=info gha update -latest ." This reverts commit 1b51f1a89b05b4e020f74e853e0feebf2f8a9f32. --- .github/workflows/build-terraform-cli.yml | 8 ++--- .github/workflows/build.yml | 30 +++++++++---------- .github/workflows/checks.yml | 26 ++++++++-------- .../workflows/crt-hook-equivalence-tests.yml | 2 +- .../workflows/manual-equivalence-tests.yml | 2 +- .github/workflows/merged-pr.yml | 2 +- 6 files changed, 35 insertions(+), 35 deletions(-) diff --git a/.github/workflows/build-terraform-cli.yml b/.github/workflows/build-terraform-cli.yml index cb4873c56e..cd3ef63b5a 100644 --- a/.github/workflows/build-terraform-cli.yml +++ b/.github/workflows/build-terraform-cli.yml @@ -38,8 +38,8 @@ jobs: runs-on: ${{ inputs.runson }} name: Terraform ${{ inputs.goos }} ${{ inputs.goarch }} v${{ inputs.product-version }} steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 with: go-version: ${{ inputs.go-version }} - name: Build Terraform @@ -86,13 +86,13 @@ jobs: echo "RPM_PACKAGE=$(basename out/*.rpm)" >> $GITHUB_ENV echo "DEB_PACKAGE=$(basename out/*.deb)" >> $GITHUB_ENV - if: ${{ inputs.goos == 'linux' }} - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ env.RPM_PACKAGE }} path: out/${{ env.RPM_PACKAGE }} if-no-files-found: error - if: ${{ inputs.goos == 'linux' }} - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: ${{ env.DEB_PACKAGE }} path: out/${{ env.DEB_PACKAGE }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 35b04297da..a91041ce14 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,7 +37,7 @@ jobs: pkg-name: ${{ steps.get-pkg-name.outputs.pkg-name }} steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Get Package Name id: get-pkg-name run: | @@ -64,7 +64,7 @@ jobs: go-version: ${{ steps.get-go-version.outputs.version }} steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Determine Go version id: get-go-version uses: ./.github/actions/go-version @@ -77,7 +77,7 @@ jobs: filepath: ${{ steps.generate-metadata-file.outputs.filepath }} steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Generate package metadata id: generate-metadata-file uses: hashicorp/actions-generate-metadata@fdbc8803a0e53bcbb912ddeee3808329033d6357 # v1.1.1 @@ -85,7 +85,7 @@ jobs: version: ${{ needs.get-product-version.outputs.product-version }} product: ${{ env.PKG_NAME }} - - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 + - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 with: name: metadata.json path: ${{ steps.generate-metadata-file.outputs.filepath }} @@ -139,7 +139,7 @@ jobs: repo: "terraform" version: ${{needs.get-product-version.outputs.product-version}} steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Build Docker images uses: hashicorp/actions-docker-build@f6278ea21555b4b4737e4cf366e808ba2bb59146 # v1.6.1 with: @@ -187,10 +187,10 @@ jobs: cache_path=internal/command/e2etest/build echo "e2e-cache-key=${cache_key}" | tee -a "${GITHUB_OUTPUT}" echo "e2e-cache-path=${cache_path}" | tee -a "${GITHUB_OUTPUT}" - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Install Go toolchain - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 + uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 with: go-version: ${{ needs.get-go-version.outputs.go-version }} @@ -207,7 +207,7 @@ jobs: bash ./internal/command/e2etest/make-archive.sh - name: Save test harness to cache - uses: actions/cache/save@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + uses: actions/cache/save@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: ${{ steps.set-cache-values.outputs.e2e-cache-path }} key: ${{ steps.set-cache-values.outputs.e2e-cache-key }}_${{ matrix.goos }}_${{ matrix.goarch }} @@ -245,9 +245,9 @@ jobs: # fresh build from source.) - name: Checkout repo if: ${{ (matrix.goos == 'linux') || (matrix.goos == 'darwin') }} - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: "Restore cache" - uses: actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + uses: actions/cache/restore@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 id: e2etestpkg with: path: ${{ needs.e2etest-build.outputs.e2e-cache-path }} @@ -255,7 +255,7 @@ jobs: fail-on-cache-miss: true enableCrossOsArchive: true - name: "Download Terraform CLI package" - uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 + uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 id: clipkg with: name: terraform_${{env.version}}_${{ env.os }}_${{ env.arch }}.zip @@ -266,7 +266,7 @@ jobs: unzip "${{ needs.e2etest-build.outputs.e2e-cache-path }}/terraform-e2etest_${{ env.os }}_${{ env.arch }}.zip" unzip "./terraform_${{env.version}}_${{ env.os }}_${{ env.arch }}.zip" - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 + uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 if: ${{ contains(matrix.goarch, 'arm') }} with: platforms: all @@ -300,17 +300,17 @@ jobs: steps: - name: Install Go toolchain - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 + uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 with: go-version: ${{ needs.get-go-version.outputs.go-version }} - name: Download Terraform CLI package - uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 + uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 id: clipkg with: name: terraform_${{ env.version }}_linux_amd64.zip path: . - name: Checkout terraform-exec repo - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: repository: hashicorp/terraform-exec path: terraform-exec diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 1d298b78c9..4e22e03377 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -36,14 +36,14 @@ jobs: steps: - name: "Fetch source code" - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Determine Go version id: go uses: ./.github/actions/go-version - name: Install Go toolchain - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 + uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 with: go-version: ${{ steps.go.outputs.version }} @@ -51,7 +51,7 @@ jobs: # identical across the unit-tests, e2e-tests, and consistency-checks # jobs, or else weird things could happen. - name: Cache Go modules - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: "~/go/pkg" key: go-mod-${{ hashFiles('go.sum') }} @@ -71,14 +71,14 @@ jobs: steps: - name: "Fetch source code" - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Determine Go version id: go uses: ./.github/actions/go-version - name: Install Go toolchain - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 + uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 with: go-version: ${{ steps.go.outputs.version }} @@ -86,7 +86,7 @@ jobs: # identical across the unit-tests, e2e-tests, and consistency-checks # jobs, or else weird things could happen. - name: Cache Go modules - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: "~/go/pkg" key: go-mod-${{ hashFiles('go.sum') }} @@ -109,14 +109,14 @@ jobs: steps: - name: "Fetch source code" - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Determine Go version id: go uses: ./.github/actions/go-version - name: Install Go toolchain - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 + uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 with: go-version: ${{ steps.go.outputs.version }} @@ -124,7 +124,7 @@ jobs: # identical across the unit-tests, e2e-tests, and consistency-checks # jobs, or else weird things could happen. - name: Cache Go modules - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: "~/go/pkg" key: go-mod-${{ hashFiles('go.sum') }} @@ -141,7 +141,7 @@ jobs: steps: - name: "Fetch source code" - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: fetch-depth: 0 # We need to do comparisons against the main branch. @@ -150,7 +150,7 @@ jobs: uses: ./.github/actions/go-version - name: Install Go toolchain - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 + uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 with: go-version: ${{ steps.go.outputs.version }} @@ -158,7 +158,7 @@ jobs: # identical across the unit-tests, e2e-tests, and consistency-checks # jobs, or else weird things could happen. - name: Cache Go modules - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: "~/go/pkg" key: go-mod-${{ hashFiles('go.sum') }} @@ -177,7 +177,7 @@ jobs: fi - name: Cache protobuf tools - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 with: path: "tools/protobuf-compile/.workdir" key: protobuf-tools-${{ hashFiles('tools/protobuf-compile/protobuf-compile.go') }} diff --git a/.github/workflows/crt-hook-equivalence-tests.yml b/.github/workflows/crt-hook-equivalence-tests.yml index f675d8bfca..3bffd2cd13 100644 --- a/.github/workflows/crt-hook-equivalence-tests.yml +++ b/.github/workflows/crt-hook-equivalence-tests.yml @@ -33,7 +33,7 @@ jobs: needs: - parse-metadata steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ needs.parse-metadata.outputs.target-branch }} - uses: ./.github/actions/equivalence-test diff --git a/.github/workflows/manual-equivalence-tests.yml b/.github/workflows/manual-equivalence-tests.yml index 5a66b375eb..648aac8044 100644 --- a/.github/workflows/manual-equivalence-tests.yml +++ b/.github/workflows/manual-equivalence-tests.yml @@ -25,7 +25,7 @@ jobs: name: "Run equivalence tests" runs-on: ubuntu-latest steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 with: ref: ${{ inputs.target-branch }} - uses: ./.github/actions/equivalence-test diff --git a/.github/workflows/merged-pr.yml b/.github/workflows/merged-pr.yml index 17a3867307..a372835840 100644 --- a/.github/workflows/merged-pr.yml +++ b/.github/workflows/merged-pr.yml @@ -13,7 +13,7 @@ jobs: if: github.event.pull_request.merged == true runs-on: ubuntu-latest steps: - - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + - uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1 with: script: | github.rest.issues.createComment({ From 1df01fdd2b95db534b2693c8e2f58bd80e5e917a Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Tue, 7 May 2024 11:09:52 -0700 Subject: [PATCH 065/161] backend/local: Allow experiments when loading config from snapshot If a saved plan is being applied using a Terraform CLI/Core build that allows use of language experiments then that should be allowed when the configuration is being loaded from the snapshot saved in a plan file, in the same way as it would've been handled when preparing to generate that plan file. The local backend doesn't get told directly whether it should allow experiments, and instead its operation comes with a pre-configured configuration loader that may have the experiment flag set internally. When we load from snapshot we can't use the operation's own config loader because that loads from the real filesystem, and so we'll copy over the experiments-allowed flag from the operation's config loader to achieve consistency while still loading the configuration from the snapshot in the plan file. Without this a plan successfully created with experiments would fail with confusing errors during apply, because the snapshot config loader would not accept the same experiments that the plan-time config loader did. --- internal/backend/local/backend_local.go | 1 + internal/configs/configload/loader.go | 7 +++++++ internal/configs/parser.go | 7 +++++++ 3 files changed, 15 insertions(+) diff --git a/internal/backend/local/backend_local.go b/internal/backend/local/backend_local.go index d34d76f769..7ca85f1c05 100644 --- a/internal/backend/local/backend_local.go +++ b/internal/backend/local/backend_local.go @@ -239,6 +239,7 @@ func (b *Local) localRunForPlanFile(op *backendrun.Operation, pf *planfile.Reade return nil, snap, diags } loader := configload.NewLoaderFromSnapshot(snap) + loader.AllowLanguageExperiments(op.ConfigLoader.AllowsLanguageExperiments()) config, configDiags := loader.LoadConfig(snap.Modules[""].Dir) diags = diags.Append(configDiags) if configDiags.HasErrors() { diff --git a/internal/configs/configload/loader.go b/internal/configs/configload/loader.go index 06d92db55e..6ad987b7d1 100644 --- a/internal/configs/configload/loader.go +++ b/internal/configs/configload/loader.go @@ -164,3 +164,10 @@ func (l *Loader) ImportSourcesFromSnapshot(snap *Snapshot) { func (l *Loader) AllowLanguageExperiments(allowed bool) { l.parser.AllowLanguageExperiments(allowed) } + +// AllowsLanguageExperiments returns the value most recently passed to +// [Loader.AllowLanguageExperiments], or false if that method has not been +// called on this object. +func (l *Loader) AllowsLanguageExperiments() bool { + return l.parser.AllowsLanguageExperiments() +} diff --git a/internal/configs/parser.go b/internal/configs/parser.go index 26b9001618..91e1325df8 100644 --- a/internal/configs/parser.go +++ b/internal/configs/parser.go @@ -121,3 +121,10 @@ func (p *Parser) ForceFileSource(filename string, src []byte) { func (p *Parser) AllowLanguageExperiments(allowed bool) { p.allowExperiments = allowed } + +// AllowsLanguageExperiments returns the value most recently passed to +// [Parser.AllowLanguageExperiments], or false if that method has not been +// called on this object. +func (p *Parser) AllowsLanguageExperiments() bool { + return p.allowExperiments +} From c8179dda1b39f12b668d68069d37391d99ce360b Mon Sep 17 00:00:00 2001 From: "hashicorp-tsccr[bot]" Date: Wed, 8 May 2024 10:22:03 +0000 Subject: [PATCH 066/161] Result of tsccr-helper -log-level=info gha update -latest . --- .github/workflows/build-terraform-cli.yml | 8 ++--- .github/workflows/build.yml | 30 +++++++++---------- .github/workflows/checks.yml | 26 ++++++++-------- .../workflows/crt-hook-equivalence-tests.yml | 2 +- .../workflows/manual-equivalence-tests.yml | 2 +- .github/workflows/merged-pr.yml | 2 +- 6 files changed, 35 insertions(+), 35 deletions(-) diff --git a/.github/workflows/build-terraform-cli.yml b/.github/workflows/build-terraform-cli.yml index cd3ef63b5a..cb4873c56e 100644 --- a/.github/workflows/build-terraform-cli.yml +++ b/.github/workflows/build-terraform-cli.yml @@ -38,8 +38,8 @@ jobs: runs-on: ${{ inputs.runson }} name: Terraform ${{ inputs.goos }} ${{ inputs.goarch }} v${{ inputs.product-version }} steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 with: go-version: ${{ inputs.go-version }} - name: Build Terraform @@ -86,13 +86,13 @@ jobs: echo "RPM_PACKAGE=$(basename out/*.rpm)" >> $GITHUB_ENV echo "DEB_PACKAGE=$(basename out/*.deb)" >> $GITHUB_ENV - if: ${{ inputs.goos == 'linux' }} - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: ${{ env.RPM_PACKAGE }} path: out/${{ env.RPM_PACKAGE }} if-no-files-found: error - if: ${{ inputs.goos == 'linux' }} - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: ${{ env.DEB_PACKAGE }} path: out/${{ env.DEB_PACKAGE }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a91041ce14..35b04297da 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,7 +37,7 @@ jobs: pkg-name: ${{ steps.get-pkg-name.outputs.pkg-name }} steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Get Package Name id: get-pkg-name run: | @@ -64,7 +64,7 @@ jobs: go-version: ${{ steps.get-go-version.outputs.version }} steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Determine Go version id: get-go-version uses: ./.github/actions/go-version @@ -77,7 +77,7 @@ jobs: filepath: ${{ steps.generate-metadata-file.outputs.filepath }} steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Generate package metadata id: generate-metadata-file uses: hashicorp/actions-generate-metadata@fdbc8803a0e53bcbb912ddeee3808329033d6357 # v1.1.1 @@ -85,7 +85,7 @@ jobs: version: ${{ needs.get-product-version.outputs.product-version }} product: ${{ env.PKG_NAME }} - - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 with: name: metadata.json path: ${{ steps.generate-metadata-file.outputs.filepath }} @@ -139,7 +139,7 @@ jobs: repo: "terraform" version: ${{needs.get-product-version.outputs.product-version}} steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Build Docker images uses: hashicorp/actions-docker-build@f6278ea21555b4b4737e4cf366e808ba2bb59146 # v1.6.1 with: @@ -187,10 +187,10 @@ jobs: cache_path=internal/command/e2etest/build echo "e2e-cache-key=${cache_key}" | tee -a "${GITHUB_OUTPUT}" echo "e2e-cache-path=${cache_path}" | tee -a "${GITHUB_OUTPUT}" - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Install Go toolchain - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 + uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 with: go-version: ${{ needs.get-go-version.outputs.go-version }} @@ -207,7 +207,7 @@ jobs: bash ./internal/command/e2etest/make-archive.sh - name: Save test harness to cache - uses: actions/cache/save@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache/save@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: ${{ steps.set-cache-values.outputs.e2e-cache-path }} key: ${{ steps.set-cache-values.outputs.e2e-cache-key }}_${{ matrix.goos }}_${{ matrix.goarch }} @@ -245,9 +245,9 @@ jobs: # fresh build from source.) - name: Checkout repo if: ${{ (matrix.goos == 'linux') || (matrix.goos == 'darwin') }} - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: "Restore cache" - uses: actions/cache/restore@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 id: e2etestpkg with: path: ${{ needs.e2etest-build.outputs.e2e-cache-path }} @@ -255,7 +255,7 @@ jobs: fail-on-cache-miss: true enableCrossOsArchive: true - name: "Download Terraform CLI package" - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 id: clipkg with: name: terraform_${{env.version}}_${{ env.os }}_${{ env.arch }}.zip @@ -266,7 +266,7 @@ jobs: unzip "${{ needs.e2etest-build.outputs.e2e-cache-path }}/terraform-e2etest_${{ env.os }}_${{ env.arch }}.zip" unzip "./terraform_${{env.version}}_${{ env.os }}_${{ env.arch }}.zip" - name: Set up QEMU - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2.2.0 + uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 if: ${{ contains(matrix.goarch, 'arm') }} with: platforms: all @@ -300,17 +300,17 @@ jobs: steps: - name: Install Go toolchain - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 + uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 with: go-version: ${{ needs.get-go-version.outputs.go-version }} - name: Download Terraform CLI package - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7 id: clipkg with: name: terraform_${{ env.version }}_linux_amd64.zip path: . - name: Checkout terraform-exec repo - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 with: repository: hashicorp/terraform-exec path: terraform-exec diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 4e22e03377..1d298b78c9 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -36,14 +36,14 @@ jobs: steps: - name: "Fetch source code" - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Determine Go version id: go uses: ./.github/actions/go-version - name: Install Go toolchain - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 + uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 with: go-version: ${{ steps.go.outputs.version }} @@ -51,7 +51,7 @@ jobs: # identical across the unit-tests, e2e-tests, and consistency-checks # jobs, or else weird things could happen. - name: Cache Go modules - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: "~/go/pkg" key: go-mod-${{ hashFiles('go.sum') }} @@ -71,14 +71,14 @@ jobs: steps: - name: "Fetch source code" - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Determine Go version id: go uses: ./.github/actions/go-version - name: Install Go toolchain - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 + uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 with: go-version: ${{ steps.go.outputs.version }} @@ -86,7 +86,7 @@ jobs: # identical across the unit-tests, e2e-tests, and consistency-checks # jobs, or else weird things could happen. - name: Cache Go modules - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: "~/go/pkg" key: go-mod-${{ hashFiles('go.sum') }} @@ -109,14 +109,14 @@ jobs: steps: - name: "Fetch source code" - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Determine Go version id: go uses: ./.github/actions/go-version - name: Install Go toolchain - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 + uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 with: go-version: ${{ steps.go.outputs.version }} @@ -124,7 +124,7 @@ jobs: # identical across the unit-tests, e2e-tests, and consistency-checks # jobs, or else weird things could happen. - name: Cache Go modules - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: "~/go/pkg" key: go-mod-${{ hashFiles('go.sum') }} @@ -141,7 +141,7 @@ jobs: steps: - name: "Fetch source code" - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 with: fetch-depth: 0 # We need to do comparisons against the main branch. @@ -150,7 +150,7 @@ jobs: uses: ./.github/actions/go-version - name: Install Go toolchain - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 + uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 with: go-version: ${{ steps.go.outputs.version }} @@ -158,7 +158,7 @@ jobs: # identical across the unit-tests, e2e-tests, and consistency-checks # jobs, or else weird things could happen. - name: Cache Go modules - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: "~/go/pkg" key: go-mod-${{ hashFiles('go.sum') }} @@ -177,7 +177,7 @@ jobs: fi - name: Cache protobuf tools - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: "tools/protobuf-compile/.workdir" key: protobuf-tools-${{ hashFiles('tools/protobuf-compile/protobuf-compile.go') }} diff --git a/.github/workflows/crt-hook-equivalence-tests.yml b/.github/workflows/crt-hook-equivalence-tests.yml index 3bffd2cd13..f675d8bfca 100644 --- a/.github/workflows/crt-hook-equivalence-tests.yml +++ b/.github/workflows/crt-hook-equivalence-tests.yml @@ -33,7 +33,7 @@ jobs: needs: - parse-metadata steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 with: ref: ${{ needs.parse-metadata.outputs.target-branch }} - uses: ./.github/actions/equivalence-test diff --git a/.github/workflows/manual-equivalence-tests.yml b/.github/workflows/manual-equivalence-tests.yml index 648aac8044..5a66b375eb 100644 --- a/.github/workflows/manual-equivalence-tests.yml +++ b/.github/workflows/manual-equivalence-tests.yml @@ -25,7 +25,7 @@ jobs: name: "Run equivalence tests" runs-on: ubuntu-latest steps: - - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 with: ref: ${{ inputs.target-branch }} - uses: ./.github/actions/equivalence-test diff --git a/.github/workflows/merged-pr.yml b/.github/workflows/merged-pr.yml index a372835840..17a3867307 100644 --- a/.github/workflows/merged-pr.yml +++ b/.github/workflows/merged-pr.yml @@ -13,7 +13,7 @@ jobs: if: github.event.pull_request.merged == true runs-on: ubuntu-latest steps: - - uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1 + - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | github.rest.issues.createComment({ From 6fbe25ba27420751e28a9356eefdcf663328b6c0 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Thu, 9 May 2024 14:35:04 -0400 Subject: [PATCH 067/161] update go-build action to latest --- .github/workflows/build-terraform-cli.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-terraform-cli.yml b/.github/workflows/build-terraform-cli.yml index cb4873c56e..d85349f6d5 100644 --- a/.github/workflows/build-terraform-cli.yml +++ b/.github/workflows/build-terraform-cli.yml @@ -49,7 +49,7 @@ jobs: GO_LDFLAGS: ${{ inputs.ld-flags }} ACTIONSOS: ${{ inputs.runson }} CGO_ENABLED: ${{ inputs.cgo-enabled }} - uses: hashicorp/actions-go-build@e20c6be7bf010e40e930dab20e6da63176725ec1 # v0.1.9 + uses: hashicorp/actions-go-build@37358f6098ef21b09542d84a9814ebb843aa4e3e # v1 with: product_name: ${{ inputs.package-name }} product_version: ${{ inputs.product-version }} From 11bc0bf6dd4e2904693367301d8b9586fe342d2d Mon Sep 17 00:00:00 2001 From: James Bardin Date: Thu, 9 May 2024 14:45:20 -0400 Subject: [PATCH 068/161] update docker-build action --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 35b04297da..f293f1053b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -141,7 +141,7 @@ jobs: steps: - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 - name: Build Docker images - uses: hashicorp/actions-docker-build@f6278ea21555b4b4737e4cf366e808ba2bb59146 # v1.6.1 + uses: hashicorp/actions-docker-build@11d43ef520c65f58683d048ce9b47d6617893c9a # v2 with: pkg_name: "terraform_${{env.version}}" version: ${{env.version}} From 02b267edd03d43f08aa6ca41ccc1196cc201d79b Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Thu, 9 May 2024 17:46:53 -0700 Subject: [PATCH 069/161] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 90282ccf27..be53ae2f2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ ENHANCEMENTS: * `terraform console`: Now has basic support for multi-line input in interactive mode. ([#34822](https://github.com/hashicorp/terraform/pull/34822)) - If an entered line contains opening paretheses/etc that are not closed, Terraform will await another line of input to complete the expression. This initial implementation is primarily intended to support pasting in multi-line expressions from elsewhere, rather than for manual multi-line editing, so the interactive editing support is currently limited. + If an entered line contains opening parentheses/etc that are not closed, Terraform will await another line of input to complete the expression. This initial implementation is primarily intended to support pasting in multi-line expressions from elsewhere, rather than for manual multi-line editing, so the interactive editing support is currently limited. * `terraform plan`: Improved presentation of OPA and Sentinel policy evaluations in HCP Terraform remote runs, for logical separation. * `terraform init` now accepts a `-json` option. If specified, enables the machine readable JSON output. ([#34886](https://github.com/hashicorp/terraform/pull/34886)) * `terraform test`: Test runs can now pass sensitive values to input variables while preserving their dynamic sensitivity. Previously sensitivity would be preserved only for variables statically declared as being sensitive, using `sensitive = true`. ([#35021](https://github.com/hashicorp/terraform/pull/35021)) From bba161ce6bb179294d6c8793a690851a5a185bfa Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Mon, 13 May 2024 09:19:40 +0200 Subject: [PATCH 070/161] terraform test: remove planned state from plan (#35049) --- internal/backend/local/test.go | 8 +-- internal/plans/plan.go | 22 ++------- internal/terraform/context_eval_test.go | 14 ------ internal/terraform/context_plan.go | 1 - internal/terraform/context_plan2_test.go | 62 ------------------------ 5 files changed, 9 insertions(+), 98 deletions(-) diff --git a/internal/backend/local/test.go b/internal/backend/local/test.go index 2adba1ecda..aff0f90229 100644 --- a/internal/backend/local/test.go +++ b/internal/backend/local/test.go @@ -463,7 +463,7 @@ func (runner *TestFileRunner) run(run *moduletest.Run, file *moduletest.File, st defer resetVariables() if runner.Suite.Verbose { - schemas, diags := tfCtx.Schemas(config, plan.PlannedState) + schemas, diags := tfCtx.Schemas(config, plan.PriorState) // If we're going to fail to render the plan, let's not fail the overall // test. It can still have succeeded. So we'll add the diagnostics, but @@ -477,7 +477,7 @@ func (runner *TestFileRunner) run(run *moduletest.Run, file *moduletest.File, st } else { run.Verbose = &moduletest.Verbose{ Plan: plan, - State: plan.PlannedState, + State: nil, // We don't have a state to show in plan mode. Config: config, Providers: schemas.Providers, Provisioners: schemas.Provisioners, @@ -551,7 +551,7 @@ func (runner *TestFileRunner) run(run *moduletest.Run, file *moduletest.File, st } if runner.Suite.Verbose { - schemas, diags := tfCtx.Schemas(config, plan.PlannedState) + schemas, diags := tfCtx.Schemas(config, updated) // If we're going to fail to render the plan, let's not fail the overall // test. It can still have succeeded. So we'll add the diagnostics, but @@ -564,7 +564,7 @@ func (runner *TestFileRunner) run(run *moduletest.Run, file *moduletest.File, st fmt.Sprintf("Terraform failed to print the verbose output for %s, other diagnostics will contain more details as to why.", filepath.Join(file.Name, run.Name)))) } else { run.Verbose = &moduletest.Verbose{ - Plan: plan, + Plan: nil, // We don't have a plan to show in apply mode. State: updated, Config: config, Providers: schemas.Providers, diff --git a/internal/plans/plan.go b/internal/plans/plan.go index e31ab65e72..d4529cc896 100644 --- a/internal/plans/plan.go +++ b/internal/plans/plan.go @@ -118,14 +118,8 @@ type Plan struct { PrevRunState *states.State PriorState *states.State - // PlannedState is the temporary planned state that was created during the - // graph walk that generated this plan. - // - // This is required by the testing framework when evaluating run blocks - // executing in plan mode. The graph updates the state with certain values - // that are difficult to retrieve later, such as local values that reference - // updated resources. It is easier to build the testing scope with access - // to same temporary state the plan used/built. + // ExternalReferences are references that are being made to resources within + // the plan from external sources. // // This is never recorded outside of Terraform. It is not written into the // binary plan file, and it is not written into the JSON structured outputs. @@ -133,19 +127,13 @@ type Plan struct { // memory as it executes, so there is no need to add any kind of // serialization for this field. This does mean that you shouldn't rely on // this field existing unless you have just generated the plan. - PlannedState *states.State - - // ExternalReferences are references that are being made to resources within - // the plan from external sources. As with PlannedState this is used by the - // terraform testing framework, and so isn't written into any external - // representation of the plan. ExternalReferences []*addrs.Reference // Overrides contains the set of overrides that were applied while making // this plan. We need to provide the same set of overrides when applying - // the plan so we preserve them here. As with PlannedState and - // ExternalReferences, this is only used by the testing framework and so - // isn't written into any external representation of the plan. + // the plan so we preserve them here. As with ExternalReferences, this is + // only used by the testing framework and so isn't written into any external + // representation of the plan. Overrides *mocking.Overrides // Timestamp is the record of truth for when the plan happened. diff --git a/internal/terraform/context_eval_test.go b/internal/terraform/context_eval_test.go index 02852039c4..2309f3f37e 100644 --- a/internal/terraform/context_eval_test.go +++ b/internal/terraform/context_eval_test.go @@ -195,13 +195,6 @@ func TestContextPlanAndEval(t *testing.T) { } else { t.Fatalf("plan has no Changes") } - if plan.PlannedState != nil { - if rs := plan.PlannedState.ResourceInstance(riAddr); rs == nil { - t.Errorf("planned satte does not include test_thing.a") - } - } else { - t.Fatalf("plan has no PlannedState") - } if plan.PriorState == nil { t.Fatalf("plan has no PriorState") } @@ -297,13 +290,6 @@ func TestContextApplyAndEval(t *testing.T) { } else { t.Fatalf("plan has no Changes") } - if plan.PlannedState != nil { - if rs := plan.PlannedState.ResourceInstance(riAddr); rs == nil { - t.Errorf("planned satte does not include test_thing.a") - } - } else { - t.Fatalf("plan has no PlannedState") - } if plan.PriorState == nil { t.Fatalf("plan has no PriorState") } diff --git a/internal/terraform/context_plan.go b/internal/terraform/context_plan.go index 71c12b1a6d..9da46a91dc 100644 --- a/internal/terraform/context_plan.go +++ b/internal/terraform/context_plan.go @@ -759,7 +759,6 @@ func (c *Context) planWalk(config *configs.Config, prevRunState *states.State, o DeferredResources: deferredResources, PrevRunState: prevRunState, PriorState: priorState, - PlannedState: walker.State.Close(), ExternalReferences: opts.ExternalReferences, Overrides: opts.Overrides, Checks: states.NewCheckResults(walker.Checks), diff --git a/internal/terraform/context_plan2_test.go b/internal/terraform/context_plan2_test.go index ed14545ecc..d0970fe1f2 100644 --- a/internal/terraform/context_plan2_test.go +++ b/internal/terraform/context_plan2_test.go @@ -4579,61 +4579,6 @@ resource "test_object" "a" { } } -func TestContext2Plan_plannedState(t *testing.T) { - addr := mustResourceInstanceAddr("test_object.a") - m := testModuleInline(t, map[string]string{ - "main.tf": ` -resource "test_object" "a" { - test_string = "foo" -} - -locals { - local_value = test_object.a.test_string -} - -output "from_local_value" { - value = local.local_value -} -`, - }) - - p := simpleMockProvider() - ctx := testContext2(t, &ContextOpts{ - Providers: map[addrs.Provider]providers.Factory{ - addrs.NewDefaultProvider("test"): testProviderFuncFixed(p), - }, - }) - - state := states.NewState() - plan, diags := ctx.Plan(m, state, nil) - if diags.HasErrors() { - t.Errorf("expected no errors, but got %s", diags) - } - - module := state.RootModule() - - // So, the original state shouldn't have been updated at all. - if len(state.RootOutputValues) > 0 { - t.Errorf("expected no root output values in the state but found %d", len(state.RootOutputValues)) - } - - if len(module.Resources) > 0 { - t.Errorf("expected no resources in the state but found %d", len(module.Resources)) - } - - // But, this makes it hard for the testing framework to valid things about - // the returned plan. So, the plan contains the planned state: - module = plan.PlannedState.RootModule() - - if got, want := plan.PlannedState.RootOutputValues["from_local_value"].Value.AsString(), "foo"; got != want { - t.Errorf("expected local value to be %q but was %q", want, got) - } - - if module.ResourceInstance(addr.Resource).Current.Status != states.ObjectPlanned { - t.Errorf("expected resource to be in planned state") - } -} - func TestContext2Plan_externalProviders(t *testing.T) { // This test exercises the option for callers to pass in their own // already-configured provider instances, instead of the modules runtime @@ -5475,13 +5420,6 @@ resource "test_object" "obj" { if len(ch.AfterSensitivePaths) == 0 { t.Fatal("expected marked values in test_object.obj") } - - data := plan.PlannedState.RootModule().ResourceInstance(mustResourceInstanceAddr("data.test_data_source.foo").Resource) - if len(data.Current.AttrSensitivePaths) == 0 { - // we may not always store data source states in the future, but for now - // this is a good indication that the read value was correctly marked. - t.Fatal("data.test_data_source.foo schema contains a sensitive attribute, should be marked in state") - } } // When a schema declares that attributes nested within sets are sensitive, the From e40bb9b0185cdacfd9d496efb3850e0b204e5130 Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Mon, 13 May 2024 09:33:35 +0200 Subject: [PATCH 071/161] deferred actions: add common functionality for evaluating unexpanded and expanded modules (#35009) * deferred actions: add common functionality for evaluating unexpanded and expanded modules * move evaluate_state back into original file --- internal/terraform/eval_context_builtin.go | 10 +- internal/terraform/evaluate.go | 159 +---------------- internal/terraform/evaluate_data.go | 190 +++++++++++++++++++++ internal/terraform/evaluate_placeholder.go | 55 +----- internal/terraform/evaluate_test.go | 28 ++- 5 files changed, 222 insertions(+), 220 deletions(-) create mode 100644 internal/terraform/evaluate_data.go diff --git a/internal/terraform/eval_context_builtin.go b/internal/terraform/eval_context_builtin.go index d13b385512..d5c3df9ee5 100644 --- a/internal/terraform/eval_context_builtin.go +++ b/internal/terraform/eval_context_builtin.go @@ -443,7 +443,10 @@ func (ctx *BuiltinEvalContext) EvaluationScope(self addrs.Referenceable, source switch scope := ctx.scope.(type) { case evalContextModuleInstance: data := &evaluationStateData{ - Evaluator: ctx.Evaluator, + evaluationData: &evaluationData{ + Evaluator: ctx.Evaluator, + Module: scope.Addr.Module(), + }, ModulePath: scope.Addr, InstanceKeyData: keyData, Operation: ctx.Evaluator.Operation, @@ -463,7 +466,10 @@ func (ctx *BuiltinEvalContext) EvaluationScope(self addrs.Referenceable, source return evalScope case evalContextPartialExpandedModule: data := &evaluationPlaceholderData{ - Evaluator: ctx.Evaluator, + evaluationData: &evaluationData{ + Evaluator: ctx.Evaluator, + Module: scope.Addr.Module(), + }, ModulePath: scope.Addr, CountAvailable: keyData.CountIndex != cty.NilVal, EachAvailable: keyData.EachKey != cty.NilVal, diff --git a/internal/terraform/evaluate.go b/internal/terraform/evaluate.go index dc76b9988d..6e59436af7 100644 --- a/internal/terraform/evaluate.go +++ b/internal/terraform/evaluate.go @@ -6,8 +6,6 @@ package terraform import ( "fmt" "log" - "os" - "path/filepath" "time" "github.com/hashicorp/hcl/v2" @@ -98,7 +96,7 @@ func (e *Evaluator) Scope(data lang.Data, self addrs.Referenceable, source addrs // evaluationStateData is an implementation of lang.Data that resolves // references primarily (but not exclusively) using information from a State. type evaluationStateData struct { - Evaluator *Evaluator + *evaluationData // ModulePath is the path through the dynamic module tree to the module // that references will be resolved relative to. @@ -482,75 +480,6 @@ func (d *evaluationStateData) GetModule(addr addrs.ModuleCall, rng tfdiags.Sourc } } -func (d *evaluationStateData) GetPathAttr(addr addrs.PathAttr, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { - var diags tfdiags.Diagnostics - switch addr.Name { - - case "cwd": - var err error - var wd string - if d.Evaluator.Meta != nil { - // Meta is always non-nil in the normal case, but some test cases - // are not so realistic. - wd = d.Evaluator.Meta.OriginalWorkingDir - } - if wd == "" { - wd, err = os.Getwd() - if err != nil { - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: `Failed to get working directory`, - Detail: fmt.Sprintf(`The value for path.cwd cannot be determined due to a system error: %s`, err), - Subject: rng.ToHCL().Ptr(), - }) - return cty.DynamicVal, diags - } - } - // The current working directory should always be absolute, whether we - // just looked it up or whether we were relying on ContextMeta's - // (possibly non-normalized) path. - wd, err = filepath.Abs(wd) - if err != nil { - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: `Failed to get working directory`, - Detail: fmt.Sprintf(`The value for path.cwd cannot be determined due to a system error: %s`, err), - Subject: rng.ToHCL().Ptr(), - }) - return cty.DynamicVal, diags - } - - return cty.StringVal(filepath.ToSlash(wd)), diags - - case "module": - moduleConfig := d.Evaluator.Config.DescendentForInstance(d.ModulePath) - if moduleConfig == nil { - // should never happen, since we can't be evaluating in a module - // that wasn't mentioned in configuration. - panic(fmt.Sprintf("module.path read from module %s, which has no configuration", d.ModulePath)) - } - sourceDir := moduleConfig.Module.SourceDir - return cty.StringVal(filepath.ToSlash(sourceDir)), diags - - case "root": - sourceDir := d.Evaluator.Config.Module.SourceDir - return cty.StringVal(filepath.ToSlash(sourceDir)), diags - - default: - suggestion := didyoumean.NameSuggestion(addr.Name, []string{"cwd", "module", "root"}) - if suggestion != "" { - suggestion = fmt.Sprintf(" Did you mean %q?", suggestion) - } - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: `Invalid "path" attribute`, - Detail: fmt.Sprintf(`The "path" object does not have an attribute named %q.%s`, addr.Name, suggestion), - Subject: rng.ToHCL().Ptr(), - }) - return cty.DynamicVal, diags - } -} - func (d *evaluationStateData) GetResource(addr addrs.Resource, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { var diags tfdiags.Diagnostics // First we'll consult the configuration to see if an resource of this @@ -840,68 +769,6 @@ func (d *evaluationStateData) getResourceSchema(addr addrs.Resource, providerAdd return schema } -func (d *evaluationStateData) GetTerraformAttr(addr addrs.TerraformAttr, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { - var diags tfdiags.Diagnostics - - if d.Evaluator.Meta == nil || d.Evaluator.Meta.Env == "" { - // The absense of an "env" (really: workspace) name suggests that - // we're running in a non-workspace context, such as in a component - // of a stack. terraform.workspace -- and the terraform symbol in - // general -- is a legacy thing from workspaces mode that isn't - // carried forward to stacks, because stack configurations can instead - // vary their behavior based on input variables provided in the - // deployment configuration. - switch addr.Name { - case "workspace": - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: `Invalid reference`, - Detail: `The terraform.workspace attribute is only available for modules used in Terraform workspaces. Use input variables instead to create variations between different instances of this module.`, - Subject: rng.ToHCL().Ptr(), - }) - default: - // A more generic error for any other attribute name, since no - // others are valid anyway but it would be confusing to mention - // terraform.workspace here. - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: `Invalid reference`, - Detail: `The "terraform" object is only available for modules used in Terraform workspaces.`, - Subject: rng.ToHCL().Ptr(), - }) - } - return cty.DynamicVal, diags - } - - switch addr.Name { - - case "workspace": - workspaceName := d.Evaluator.Meta.Env - return cty.StringVal(workspaceName), diags - - case "env": - // Prior to Terraform 0.12 there was an attribute "env", which was - // an alias name for "workspace". This was deprecated and is now - // removed. - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: `Invalid "terraform" attribute`, - Detail: `The terraform.env attribute was deprecated in v0.10 and removed in v0.12. The "state environment" concept was renamed to "workspace" in v0.12, and so the workspace name can now be accessed using the terraform.workspace attribute.`, - Subject: rng.ToHCL().Ptr(), - }) - return cty.DynamicVal, diags - - default: - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: `Invalid "terraform" attribute`, - Detail: fmt.Sprintf(`The "terraform" object does not have an attribute named %q. The only supported attribute is terraform.workspace, the name of the currently-selected workspace.`, addr.Name), - Subject: rng.ToHCL().Ptr(), - }) - return cty.DynamicVal, diags - } -} - func (d *evaluationStateData) GetOutput(addr addrs.OutputValue, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { var diags tfdiags.Diagnostics @@ -957,30 +824,6 @@ func (d *evaluationStateData) GetOutput(addr addrs.OutputValue, rng tfdiags.Sour return val, diags } -func (d *evaluationStateData) GetCheckBlock(addr addrs.Check, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { - // For now, check blocks don't contain any meaningful data and can only - // be referenced from the testing scope within an expect_failures attribute. - // - // We've added them into the scope explicitly since they are referencable, - // but we'll actually just return an error message saying they can't be - // referenced in this context. - var diags tfdiags.Diagnostics - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: "Reference to \"check\" in invalid context", - Detail: "The \"check\" object can only be referenced from an \"expect_failures\" attribute within a Terraform testing \"run\" block.", - Subject: rng.ToHCL().Ptr(), - }) - return cty.NilVal, diags -} - -func (d *evaluationStateData) GetRunBlock(run addrs.Run, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { - // We should not get here because any scope that has an [evaluationStateData] - // as its Data should have a reference parser that doesn't accept addrs.Run - // addresses. - panic("GetRunBlock called on non-test evaluation dataset") -} - // moduleDisplayAddr returns a string describing the given module instance // address that is appropriate for returning to users in situations where the // root module is possible. Specifically, it returns "the root module" if the diff --git a/internal/terraform/evaluate_data.go b/internal/terraform/evaluate_data.go new file mode 100644 index 0000000000..8fd58d8dd9 --- /dev/null +++ b/internal/terraform/evaluate_data.go @@ -0,0 +1,190 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: BUSL-1.1 + +package terraform + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/hashicorp/hcl/v2" + "github.com/zclconf/go-cty/cty" + + "github.com/hashicorp/terraform/internal/addrs" + "github.com/hashicorp/terraform/internal/didyoumean" + "github.com/hashicorp/terraform/internal/tfdiags" +) + +// evaluationData is the base struct for evaluating data from within Terraform +// Core. It contains some common data and functions shared by the various +// implemented evaluators. +type evaluationData struct { + Evaluator *Evaluator + + // Module is the unexpanded module that this data is being evaluated within. + Module addrs.Module +} + +// GetPathAttr implements lang.Data. +func (d *evaluationData) GetPathAttr(addr addrs.PathAttr, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { + var diags tfdiags.Diagnostics + switch addr.Name { + + case "cwd": + var err error + var wd string + if d.Evaluator.Meta != nil { + // Meta is always non-nil in the normal case, but some test cases + // are not so realistic. + wd = d.Evaluator.Meta.OriginalWorkingDir + } + if wd == "" { + wd, err = os.Getwd() + if err != nil { + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: `Failed to get working directory`, + Detail: fmt.Sprintf(`The value for path.cwd cannot be determined due to a system error: %s`, err), + Subject: rng.ToHCL().Ptr(), + }) + return cty.DynamicVal, diags + } + } + // The current working directory should always be absolute, whether we + // just looked it up or whether we were relying on ContextMeta's + // (possibly non-normalized) path. + wd, err = filepath.Abs(wd) + if err != nil { + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: `Failed to get working directory`, + Detail: fmt.Sprintf(`The value for path.cwd cannot be determined due to a system error: %s`, err), + Subject: rng.ToHCL().Ptr(), + }) + return cty.DynamicVal, diags + } + + return cty.StringVal(filepath.ToSlash(wd)), diags + + case "module": + moduleConfig := d.Evaluator.Config.Descendent(d.Module) + if moduleConfig == nil { + // should never happen, since we can't be evaluating in a module + // that wasn't mentioned in configuration. + panic(fmt.Sprintf("module.path read from module %s, which has no configuration", d.Module)) + } + sourceDir := moduleConfig.Module.SourceDir + return cty.StringVal(filepath.ToSlash(sourceDir)), diags + + case "root": + sourceDir := d.Evaluator.Config.Module.SourceDir + return cty.StringVal(filepath.ToSlash(sourceDir)), diags + + default: + suggestion := didyoumean.NameSuggestion(addr.Name, []string{"cwd", "module", "root"}) + if suggestion != "" { + suggestion = fmt.Sprintf(" Did you mean %q?", suggestion) + } + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: `Invalid "path" attribute`, + Detail: fmt.Sprintf(`The "path" object does not have an attribute named %q.%s`, addr.Name, suggestion), + Subject: rng.ToHCL().Ptr(), + }) + return cty.DynamicVal, diags + } +} + +// GetTerraformAttr implements lang.Data. +func (d *evaluationData) GetTerraformAttr(addr addrs.TerraformAttr, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { + var diags tfdiags.Diagnostics + + if d.Evaluator.Meta == nil || d.Evaluator.Meta.Env == "" { + // The absense of an "env" (really: workspace) name suggests that + // we're running in a non-workspace context, such as in a component + // of a stack. terraform.workspace -- and the terraform symbol in + // general -- is a legacy thing from workspaces mode that isn't + // carried forward to stacks, because stack configurations can instead + // vary their behavior based on input variables provided in the + // deployment configuration. + switch addr.Name { + case "workspace": + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: `Invalid reference`, + Detail: `The terraform.workspace attribute is only available for modules used in Terraform workspaces. Use input variables instead to create variations between different instances of this module.`, + Subject: rng.ToHCL().Ptr(), + }) + default: + // A more generic error for any other attribute name, since no + // others are valid anyway but it would be confusing to mention + // terraform.workspace here. + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: `Invalid reference`, + Detail: `The "terraform" object is only available for modules used in Terraform workspaces.`, + Subject: rng.ToHCL().Ptr(), + }) + } + return cty.DynamicVal, diags + } + + switch addr.Name { + + case "workspace": + workspaceName := d.Evaluator.Meta.Env + return cty.StringVal(workspaceName), diags + + case "env": + // Prior to Terraform 0.12 there was an attribute "env", which was + // an alias name for "workspace". This was deprecated and is now + // removed. + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: `Invalid "terraform" attribute`, + Detail: `The terraform.env attribute was deprecated in v0.10 and removed in v0.12. The "state environment" concept was renamed to "workspace" in v0.12, and so the workspace name can now be accessed using the terraform.workspace attribute.`, + Subject: rng.ToHCL().Ptr(), + }) + return cty.DynamicVal, diags + + default: + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: `Invalid "terraform" attribute`, + Detail: fmt.Sprintf(`The "terraform" object does not have an attribute named %q. The only supported attribute is terraform.workspace, the name of the currently-selected workspace.`, addr.Name), + Subject: rng.ToHCL().Ptr(), + }) + return cty.DynamicVal, diags + } +} + +// StaticValidateReferences implements lang.Data. +func (d *evaluationData) StaticValidateReferences(refs []*addrs.Reference, self addrs.Referenceable, source addrs.Referenceable) tfdiags.Diagnostics { + return d.Evaluator.StaticValidateReferences(refs, d.Module, self, source) +} + +// GetRunBlock implements lang.Data. +func (d *evaluationData) GetRunBlock(addrs.Run, tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { + // We should not get here because any scope that has an [evaluationPlaceholderData] + // as its Data should have a reference parser that doesn't accept addrs.Run + // addresses. + panic("GetRunBlock called on non-test evaluation dataset") +} + +func (d *evaluationData) GetCheckBlock(addr addrs.Check, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { + // For now, check blocks don't contain any meaningful data and can only + // be referenced from the testing scope within an expect_failures attribute. + // + // We've added them into the scope explicitly since they are referencable, + // but we'll actually just return an error message saying they can't be + // referenced in this context. + var diags tfdiags.Diagnostics + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Reference to \"check\" in invalid context", + Detail: "The \"check\" object can only be referenced from an \"expect_failures\" attribute within a Terraform testing \"run\" block.", + Subject: rng.ToHCL().Ptr(), + }) + return cty.NilVal, diags +} diff --git a/internal/terraform/evaluate_placeholder.go b/internal/terraform/evaluate_placeholder.go index 70359bf6dc..d087665b26 100644 --- a/internal/terraform/evaluate_placeholder.go +++ b/internal/terraform/evaluate_placeholder.go @@ -9,6 +9,7 @@ import ( "github.com/zclconf/go-cty/cty" "github.com/hashicorp/hcl/v2" + "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/lang" "github.com/hashicorp/terraform/internal/tfdiags" @@ -20,7 +21,7 @@ import ( // only what we know to be true for all possible final module instances // that could exist for the prefix. type evaluationPlaceholderData struct { - Evaluator *Evaluator + *evaluationData // ModulePath is the partially-expanded path through the dynamic module // tree to a set of possible module instances that share a common known @@ -55,21 +56,6 @@ type evaluationPlaceholderData struct { var _ lang.Data = (*evaluationPlaceholderData)(nil) -// GetCheckBlock implements lang.Data. -func (d *evaluationPlaceholderData) GetCheckBlock(addr addrs.Check, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { - // check blocks don't produce any useful data and can only be referred - // to within an expect_failures attribute in the test language. - var diags tfdiags.Diagnostics - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: "Reference to \"check\" in invalid context", - Detail: "The \"check\" object can only be used from an \"expect_failures\" attribute within a Terraform testing \"run\" block.", - Subject: rng.ToHCL().Ptr(), - }) - return cty.NilVal, diags - -} - // GetCountAttr implements lang.Data. func (d *evaluationPlaceholderData) GetCountAttr(addr addrs.CountAttr, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { var diags tfdiags.Diagnostics @@ -224,21 +210,6 @@ func (d *evaluationPlaceholderData) GetOutput(addr addrs.OutputValue, rng tfdiag } -// GetPathAttr implements lang.Data. -func (d *evaluationPlaceholderData) GetPathAttr(addrs.PathAttr, tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { - // TODO: It would be helpful to perform the same logic here as we do - // in the full-evaluation case, since the paths we'd return here cannot - // vary based on dynamic data, but we'll need to factor out the logic - // into a common location we can call from both places first. For now, - // we'll just leave these all as unknown value placeholders. - // - // What we _do_ know is that all valid attributes of "path" are strings - // that are definitely not null, so we can at least catch situations - // where someone tries to use them in a place where a string is - // unacceptable. - return cty.UnknownVal(cty.String).RefineNotNull(), nil -} - // GetResource implements lang.Data. func (d *evaluationPlaceholderData) GetResource(addrs.Resource, tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { // TODO: Once we've implemented the evaluation of placeholders for @@ -251,25 +222,3 @@ func (d *evaluationPlaceholderData) GetResource(addrs.Resource, tfdiags.SourceRa // really help references to single-instance resources. return cty.DynamicVal, nil } - -// GetRunBlock implements lang.Data. -func (d *evaluationPlaceholderData) GetRunBlock(addrs.Run, tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { - // We should not get here because any scope that has an [evaluationPlaceholderData] - // as its Data should have a reference parser that doesn't accept addrs.Run - // addresses. - panic("GetRunBlock called on non-test evaluation dataset") -} - -// GetTerraformAttr implements lang.Data. -func (d *evaluationPlaceholderData) GetTerraformAttr(addrs.TerraformAttr, tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { - // TODO: It would be helpful to perform the same validation checks that - // occur in evaluationStateData.GetTerraformAttr, so authors can catch - // invalid usage of the "terraform" object even when under an unexpanded - // module prefix. - return cty.DynamicVal, nil -} - -// StaticValidateReferences implements lang.Data. -func (d *evaluationPlaceholderData) StaticValidateReferences(refs []*addrs.Reference, self addrs.Referenceable, source addrs.Referenceable) tfdiags.Diagnostics { - return d.Evaluator.StaticValidateReferences(refs, d.ModulePath.Module(), self, source) -} diff --git a/internal/terraform/evaluate_test.go b/internal/terraform/evaluate_test.go index 7b3dd176b1..7dbabb4672 100644 --- a/internal/terraform/evaluate_test.go +++ b/internal/terraform/evaluate_test.go @@ -30,7 +30,9 @@ func TestEvaluatorGetTerraformAttr(t *testing.T) { NamedValues: namedvals.NewState(), } data := &evaluationStateData{ - Evaluator: evaluator, + evaluationData: &evaluationData{ + Evaluator: evaluator, + }, } scope := evaluator.Scope(data, nil, nil, lang.ExternalFuncs{}) @@ -61,7 +63,9 @@ func TestEvaluatorGetPathAttr(t *testing.T) { NamedValues: namedvals.NewState(), } data := &evaluationStateData{ - Evaluator: evaluator, + evaluationData: &evaluationData{ + Evaluator: evaluator, + }, } scope := evaluator.Scope(data, nil, nil, lang.ExternalFuncs{}) @@ -127,7 +131,9 @@ func TestEvaluatorGetOutputValue(t *testing.T) { } data := &evaluationStateData{ - Evaluator: evaluator, + evaluationData: &evaluationData{ + Evaluator: evaluator, + }, } scope := evaluator.Scope(data, nil, nil, lang.ExternalFuncs{}) @@ -196,7 +202,9 @@ func TestEvaluatorGetInputVariable(t *testing.T) { } data := &evaluationStateData{ - Evaluator: evaluator, + evaluationData: &evaluationData{ + Evaluator: evaluator, + }, } scope := evaluator.Scope(data, nil, nil, lang.ExternalFuncs{}) @@ -355,7 +363,9 @@ func TestEvaluatorGetResource(t *testing.T) { } data := &evaluationStateData{ - Evaluator: evaluator, + evaluationData: &evaluationData{ + Evaluator: evaluator, + }, } scope := evaluator.Scope(data, nil, nil, lang.ExternalFuncs{}) @@ -522,7 +532,9 @@ func TestEvaluatorGetResource_changes(t *testing.T) { } data := &evaluationStateData{ - Evaluator: evaluator, + evaluationData: &evaluationData{ + Evaluator: evaluator, + }, } scope := evaluator.Scope(data, nil, nil, lang.ExternalFuncs{}) @@ -554,7 +566,9 @@ func TestEvaluatorGetModule(t *testing.T) { cty.StringVal("bar").Mark(marks.Sensitive), ) data := &evaluationStateData{ - Evaluator: evaluator, + evaluationData: &evaluationData{ + Evaluator: evaluator, + }, } scope := evaluator.Scope(data, nil, nil, lang.ExternalFuncs{}) want := cty.ObjectVal(map[string]cty.Value{"out": cty.StringVal("bar").Mark(marks.Sensitive)}) From 716fcce2397c996893eff7cfa6d02a9f944e1bc0 Mon Sep 17 00:00:00 2001 From: Brandon Croft Date: Mon, 6 May 2024 11:02:01 -0600 Subject: [PATCH 072/161] chore: add command ctx to GetRootOutputValues --- internal/backend/local/backend_local_test.go | 3 ++- internal/cloud/state.go | 3 +-- internal/cloud/state_test.go | 2 +- internal/command/output.go | 6 +++++- internal/states/remote/state.go | 3 ++- internal/states/remote/state_test.go | 3 ++- internal/states/statemgr/filesystem.go | 3 ++- internal/states/statemgr/filesystem_test.go | 3 ++- internal/states/statemgr/lock.go | 6 ++++-- internal/states/statemgr/persistent.go | 3 ++- internal/states/statemgr/statemgr_fake.go | 5 +++-- 11 files changed, 26 insertions(+), 14 deletions(-) diff --git a/internal/backend/local/backend_local_test.go b/internal/backend/local/backend_local_test.go index 3b9a315cd4..f929d79eaa 100644 --- a/internal/backend/local/backend_local_test.go +++ b/internal/backend/local/backend_local_test.go @@ -4,6 +4,7 @@ package local import ( + "context" "fmt" "os" "path/filepath" @@ -261,7 +262,7 @@ func (s *stateStorageThatFailsRefresh) State() *states.State { return nil } -func (s *stateStorageThatFailsRefresh) GetRootOutputValues() (map[string]*states.OutputValue, error) { +func (s *stateStorageThatFailsRefresh) GetRootOutputValues(ctx context.Context) (map[string]*states.OutputValue, error) { return nil, fmt.Errorf("unimplemented") } diff --git a/internal/cloud/state.go b/internal/cloud/state.go index cb41aac86f..c886bf445a 100644 --- a/internal/cloud/state.go +++ b/internal/cloud/state.go @@ -515,8 +515,7 @@ func (s *State) Delete(force bool) error { } // GetRootOutputValues fetches output values from HCP Terraform -func (s *State) GetRootOutputValues() (map[string]*states.OutputValue, error) { - ctx := context.Background() +func (s *State) GetRootOutputValues(ctx context.Context) (map[string]*states.OutputValue, error) { so, err := s.tfeClient.StateVersionOutputs.ReadCurrent(ctx, s.workspace.ID) diff --git a/internal/cloud/state_test.go b/internal/cloud/state_test.go index 417c9a7776..61919e0b1e 100644 --- a/internal/cloud/state_test.go +++ b/internal/cloud/state_test.go @@ -40,7 +40,7 @@ func TestState_GetRootOutputValues(t *testing.T) { state := &State{tfeClient: b.client, organization: b.Organization, workspace: &tfe.Workspace{ ID: "ws-abcd", }} - outputs, err := state.GetRootOutputValues() + outputs, err := state.GetRootOutputValues(context.Background()) if err != nil { t.Fatalf("error returned from GetRootOutputValues: %s", err) diff --git a/internal/command/output.go b/internal/command/output.go index 4519d280c0..9b4bf9d7c3 100644 --- a/internal/command/output.go +++ b/internal/command/output.go @@ -69,6 +69,10 @@ func (c *OutputCommand) Outputs(statePath string) (map[string]*states.OutputValu return nil, diags } + // Command can be aborted by interruption signals + ctx, done := c.InterruptibleContext(c.CommandContext()) + defer done() + // This is a read-only command c.ignoreRemoteVersionConflict(b) @@ -85,7 +89,7 @@ func (c *OutputCommand) Outputs(statePath string) (map[string]*states.OutputValu return nil, diags } - output, err := stateStore.GetRootOutputValues() + output, err := stateStore.GetRootOutputValues(ctx) if err != nil { return nil, diags.Append(err) } diff --git a/internal/states/remote/state.go b/internal/states/remote/state.go index 2c6edc1b0d..34fbbc638c 100644 --- a/internal/states/remote/state.go +++ b/internal/states/remote/state.go @@ -5,6 +5,7 @@ package remote import ( "bytes" + "context" "fmt" "log" "sync" @@ -59,7 +60,7 @@ func (s *State) State() *states.State { return s.state.DeepCopy() } -func (s *State) GetRootOutputValues() (map[string]*states.OutputValue, error) { +func (s *State) GetRootOutputValues(ctx context.Context) (map[string]*states.OutputValue, error) { if err := s.RefreshState(); err != nil { return nil, fmt.Errorf("Failed to load state: %s", err) } diff --git a/internal/states/remote/state_test.go b/internal/states/remote/state_test.go index ce34ff7bad..cbb6a6219f 100644 --- a/internal/states/remote/state_test.go +++ b/internal/states/remote/state_test.go @@ -4,6 +4,7 @@ package remote import ( + "context" "log" "sync" "testing" @@ -408,7 +409,7 @@ func TestState_GetRootOutputValues(t *testing.T) { }, } - outputs, err := mgr.GetRootOutputValues() + outputs, err := mgr.GetRootOutputValues(context.Background()) if err != nil { t.Errorf("Expected GetRootOutputValues to not return an error, but it returned %v", err) } diff --git a/internal/states/statemgr/filesystem.go b/internal/states/statemgr/filesystem.go index 908a552b0a..7a7a63e3ca 100644 --- a/internal/states/statemgr/filesystem.go +++ b/internal/states/statemgr/filesystem.go @@ -5,6 +5,7 @@ package statemgr import ( "bytes" + "context" "encoding/json" "errors" "fmt" @@ -236,7 +237,7 @@ func (s *Filesystem) RefreshState() error { return s.refreshState() } -func (s *Filesystem) GetRootOutputValues() (map[string]*states.OutputValue, error) { +func (s *Filesystem) GetRootOutputValues(ctx context.Context) (map[string]*states.OutputValue, error) { err := s.RefreshState() if err != nil { return nil, err diff --git a/internal/states/statemgr/filesystem_test.go b/internal/states/statemgr/filesystem_test.go index 8add434e46..ea180275c5 100644 --- a/internal/states/statemgr/filesystem_test.go +++ b/internal/states/statemgr/filesystem_test.go @@ -4,6 +4,7 @@ package statemgr import ( + "context" "io/ioutil" "os" "os/exec" @@ -417,7 +418,7 @@ func TestFilesystem_refreshWhileLocked(t *testing.T) { func TestFilesystem_GetRootOutputValues(t *testing.T) { fs := testFilesystem(t) - outputs, err := fs.GetRootOutputValues() + outputs, err := fs.GetRootOutputValues(context.Background()) if err != nil { t.Errorf("Expected GetRootOutputValues to not return an error, but it returned %v", err) } diff --git a/internal/states/statemgr/lock.go b/internal/states/statemgr/lock.go index 07b3121ede..9d34c20415 100644 --- a/internal/states/statemgr/lock.go +++ b/internal/states/statemgr/lock.go @@ -4,6 +4,8 @@ package statemgr import ( + "context" + "github.com/hashicorp/terraform/internal/schemarepo" "github.com/hashicorp/terraform/internal/states" ) @@ -21,8 +23,8 @@ func (s *LockDisabled) State() *states.State { return s.Inner.State() } -func (s *LockDisabled) GetRootOutputValues() (map[string]*states.OutputValue, error) { - return s.Inner.GetRootOutputValues() +func (s *LockDisabled) GetRootOutputValues(ctx context.Context) (map[string]*states.OutputValue, error) { + return s.Inner.GetRootOutputValues(ctx) } func (s *LockDisabled) WriteState(v *states.State) error { diff --git a/internal/states/statemgr/persistent.go b/internal/states/statemgr/persistent.go index e2fa88b295..1e2c82a735 100644 --- a/internal/states/statemgr/persistent.go +++ b/internal/states/statemgr/persistent.go @@ -4,6 +4,7 @@ package statemgr import ( + "context" "time" version "github.com/hashicorp/go-version" @@ -33,7 +34,7 @@ type Persistent interface { // to differentiate reading the state and reading the outputs within the state. type OutputReader interface { // GetRootOutputValues fetches the root module output values from state or another source - GetRootOutputValues() (map[string]*states.OutputValue, error) + GetRootOutputValues(ctx context.Context) (map[string]*states.OutputValue, error) } // Refresher is the interface for managers that can read snapshots from diff --git a/internal/states/statemgr/statemgr_fake.go b/internal/states/statemgr/statemgr_fake.go index 29e1bf7bc1..25800fdbbd 100644 --- a/internal/states/statemgr/statemgr_fake.go +++ b/internal/states/statemgr/statemgr_fake.go @@ -4,6 +4,7 @@ package statemgr import ( + "context" "errors" "sync" @@ -69,7 +70,7 @@ func (m *fakeFull) PersistState(schemas *schemarepo.Schemas) error { return m.fakeP.WriteState(m.t.State()) } -func (m *fakeFull) GetRootOutputValues() (map[string]*states.OutputValue, error) { +func (m *fakeFull) GetRootOutputValues(ctx context.Context) (map[string]*states.OutputValue, error) { return m.State().RootOutputValues, nil } @@ -119,7 +120,7 @@ func (m *fakeErrorFull) State() *states.State { return nil } -func (m *fakeErrorFull) GetRootOutputValues() (map[string]*states.OutputValue, error) { +func (m *fakeErrorFull) GetRootOutputValues(ctx context.Context) (map[string]*states.OutputValue, error) { return nil, errors.New("fake state manager error") } From 0efd586490cd84aa735517c291c2b5ad63e0b009 Mon Sep 17 00:00:00 2001 From: Brandon Croft Date: Mon, 6 May 2024 16:53:27 -0600 Subject: [PATCH 073/161] cloud: retry output if current state outputs are not available --- internal/cloud/retry.go | 101 +++++++++++++++++++++++++++++++++++ internal/cloud/retry_test.go | 100 ++++++++++++++++++++++++++++++++++ internal/cloud/state.go | 28 +++++++++- 3 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 internal/cloud/retry.go create mode 100644 internal/cloud/retry_test.go diff --git a/internal/cloud/retry.go b/internal/cloud/retry.go new file mode 100644 index 0000000000..ab784f5964 --- /dev/null +++ b/internal/cloud/retry.go @@ -0,0 +1,101 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: BUSL-1.1 + +package cloud + +import ( + "context" + "log" + "sync/atomic" + "time" +) + +// Fatal implements a RetryBackoff func return value that, if encountered, +// signals that the func should not be retried. In that case, the error +// returned by the interface method will be returned by RetryBackoff +type Fatal interface { + FatalError() error +} + +// NonRetryableError is a simple implementation of Fatal that wraps an error +type NonRetryableError struct { + InnerError error +} + +// FatalError returns the inner error, but also implements Fatal, which +// signals to RetryBackoff that a non-retryable error occurred. +func (e NonRetryableError) FatalError() error { + return e.InnerError +} + +// Error returns the inner error string +func (e NonRetryableError) Error() string { + return e.InnerError.Error() +} + +var ( + initialBackoffDelay = time.Second + maxBackoffDelay = 3 * time.Second +) + +// RetryBackoff retries function f until nil or a FatalError is returned. +// RetryBackoff only returns an error if the context is in error or if a +// FatalError was encountered. +func RetryBackoff(ctx context.Context, f func() error) error { + // doneCh signals that the routine is done and sends the last error + var doneCh = make(chan struct{}) + var errVal atomic.Value + type errWrap struct { + E error + } + + go func() { + // the retry delay between each attempt + var delay time.Duration = 0 + defer close(doneCh) + + for { + select { + case <-ctx.Done(): + return + case <-time.After(delay): + } + + err := f() + switch e := err.(type) { + case nil: + return + case Fatal: + errVal.Store(errWrap{e.FatalError()}) + return + } + + delay *= 2 + if delay == 0 { + delay = initialBackoffDelay + } + + delay = min(delay, maxBackoffDelay) + + log.Printf("[WARN] retryable error: %q, delaying for %s", err, delay) + } + }() + + // Wait until done or deadline + select { + case <-doneCh: + case <-ctx.Done(): + } + + err, hadErr := errVal.Load().(errWrap) + var lastErr error + if hadErr { + lastErr = err.E + } + + if ctx.Err() != nil { + return ctx.Err() + } + + return lastErr +} diff --git a/internal/cloud/retry_test.go b/internal/cloud/retry_test.go new file mode 100644 index 0000000000..3c8c8f989a --- /dev/null +++ b/internal/cloud/retry_test.go @@ -0,0 +1,100 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: BUSL-1.1 + +package cloud + +import ( + "context" + "errors" + "testing" + "time" +) + +type fatalError struct{} + +var fe = errors.New("this was a fatal error") + +func (f fatalError) FatalError() error { + return fe +} + +func (f fatalError) Error() string { + return f.FatalError().Error() +} + +func Test_RetryBackoff_canceled(t *testing.T) { + t.Parallel() + ctx, cancel := context.WithCancel(context.Background()) + + cancel() + + err := RetryBackoff(ctx, func() error { + return nil + }) + + if !errors.Is(err, context.Canceled) { + t.Errorf("expected canceled error, got %q", err) + } +} + +func Test_RetryBackoff_deadline(t *testing.T) { + t.Parallel() + ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Millisecond)) + + defer cancel() + + err := RetryBackoff(ctx, func() error { + time.Sleep(10 * time.Millisecond) + return nil + }) + + if !errors.Is(err, context.DeadlineExceeded) { + t.Errorf("expected timeout error, got %q", err) + } +} + +func Test_RetryBackoff_happy(t *testing.T) { + t.Parallel() + + err := RetryBackoff(context.Background(), func() error { + return nil + }) + + if err != nil { + t.Errorf("expected nil err, got %q", err) + } +} + +func Test_RetryBackoff_fatal(t *testing.T) { + t.Parallel() + + err := RetryBackoff(context.Background(), func() error { + return fatalError{} + }) + + if !errors.Is(fe, err) { + t.Errorf("expected fatal error, got %q", err) + } +} + +func Test_RetryBackoff_non_fatal(t *testing.T) { + t.Parallel() + + var retriedCount = 0 + + err := RetryBackoff(context.Background(), func() error { + retriedCount += 1 + if retriedCount == 2 { + return nil + } + return errors.New("retryable error") + }) + + if err != nil { + t.Errorf("expected no error, got %q", err) + } + + if retriedCount != 2 { + t.Errorf("expected 2 retries, got %d", retriedCount) + } +} diff --git a/internal/cloud/state.go b/internal/cloud/state.go index c886bf445a..36fa4dcf2f 100644 --- a/internal/cloud/state.go +++ b/internal/cloud/state.go @@ -516,10 +516,36 @@ func (s *State) Delete(force bool) error { // GetRootOutputValues fetches output values from HCP Terraform func (s *State) GetRootOutputValues(ctx context.Context) (map[string]*states.OutputValue, error) { + // The cloud backend initializes this value to true, but we want to implement + // some custom retry logic. This code presumes that the tfeClient doesn't need + // to be shared with other goroutines by the caller. + s.tfeClient.RetryServerErrors(false) + defer s.tfeClient.RetryServerErrors(true) - so, err := s.tfeClient.StateVersionOutputs.ReadCurrent(ctx, s.workspace.ID) + ctx, cancel := context.WithTimeout(ctx, time.Minute) + defer cancel() + + var so *tfe.StateVersionOutputsList + err := RetryBackoff(ctx, func() error { + var err error + so, err = s.tfeClient.StateVersionOutputs.ReadCurrent(ctx, s.workspace.ID) + + if err != nil { + if strings.Contains(err.Error(), "service unavailable") { + return err + } + return NonRetryableError{err} + } + return nil + }) if err != nil { + switch err { + case context.DeadlineExceeded: + return nil, fmt.Errorf("current outputs were not ready to be read within the deadline. Please try again") + case context.Canceled: + return nil, fmt.Errorf("canceled reading current outputs") + } return nil, fmt.Errorf("could not read state version outputs: %w", err) } From d3b1586572eff52cf5b3902390bd9b64e657ec11 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Tue, 14 May 2024 14:13:33 -0400 Subject: [PATCH 074/161] make Ancestors and Descendents variadic A walk can start from multiple roots, so making the Ancestors and Descendents methods variadic is the easiest way to add access to that via the API with no changes in existing callers. We can use this from terraform to avoid repeatedly walking overlapping sets of nodes. --- internal/dag/dag.go | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/internal/dag/dag.go b/internal/dag/dag.go index 6fdf1dcd91..7323b4ffba 100644 --- a/internal/dag/dag.go +++ b/internal/dag/dag.go @@ -30,14 +30,21 @@ func (g *AcyclicGraph) DirectedGraph() Grapher { // Returns a Set that includes every Vertex yielded by walking down from the // provided starting Vertex v. -func (g *AcyclicGraph) Ancestors(v Vertex) (Set, error) { +func (g *AcyclicGraph) Ancestors(vs ...Vertex) (Set, error) { s := make(Set) memoFunc := func(v Vertex, d int) error { s.Add(v) return nil } - if err := g.DepthFirstWalk(g.downEdgesNoCopy(v), memoFunc); err != nil { + start := make(Set) + for _, v := range vs { + for _, dep := range g.downEdgesNoCopy(v) { + start.Add(dep) + } + } + + if err := g.DepthFirstWalk(start, memoFunc); err != nil { return nil, err } @@ -46,14 +53,21 @@ func (g *AcyclicGraph) Ancestors(v Vertex) (Set, error) { // Returns a Set that includes every Vertex yielded by walking up from the // provided starting Vertex v. -func (g *AcyclicGraph) Descendents(v Vertex) (Set, error) { +func (g *AcyclicGraph) Descendents(vs ...Vertex) (Set, error) { s := make(Set) memoFunc := func(v Vertex, d int) error { s.Add(v) return nil } - if err := g.ReverseDepthFirstWalk(g.upEdgesNoCopy(v), memoFunc); err != nil { + start := make(Set) + for _, v := range vs { + for _, dep := range g.upEdgesNoCopy(v) { + start.Add(dep) + } + } + + if err := g.ReverseDepthFirstWalk(start, memoFunc); err != nil { return nil, err } From f41a1fb3a402b53395924c2e47e218700b8adba4 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Tue, 14 May 2024 14:34:19 -0400 Subject: [PATCH 075/161] walk multiple ancestors at once in ReferenceMap The existing implementation of parentModuleDependsOn would walk each reference separately, but if there were many dependencies which were all interconnected, that would end up walking over the same nodes multiple times, and storing many duplicate results. Since a graph walk can start at multiple nodes, we use the extended version of Ancestors to start at all dependencies simultaneously, reducing the time spend traversing the graph as well as automatically removing duplicates. --- internal/terraform/transform_reference.go | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/internal/terraform/transform_reference.go b/internal/terraform/transform_reference.go index a22715627d..5e5f9e0651 100644 --- a/internal/terraform/transform_reference.go +++ b/internal/terraform/transform_reference.go @@ -437,17 +437,18 @@ func (m ReferenceMap) parentModuleDependsOn(g *Graph, depender graphNodeDependsO deps, fromParentModule := m.dependsOn(g, mod) for _, dep := range deps { - // add the dependency - res = append(res, dep) - - // and check any transitive resource dependencies for more resources - ans, _ := g.Ancestors(dep) - for _, v := range ans { - if isDependableResource(v) { - res = append(res, v) - } + if isDependableResource(dep) { + res = append(res, dep) } } + + ans, _ := g.Ancestors(deps...) + for _, v := range ans { + if isDependableResource(v) { + res = append(res, v) + } + } + fromModule = fromModule || fromParentModule } From e8119cced39bdd9edf0944f35a8c980336c2c6d1 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Wed, 15 May 2024 14:08:57 -0400 Subject: [PATCH 076/161] remove extra state.DeepCopy from updateStateHook All production state implementations copy the given state when storing it to temporary or permanent storage, either explicitly with DeepCopy, or implicitly by serializing the state. Since `updateStateHook` is called with every state change, a second call to `DeepCopy` with that hook doubles the overhead of `PostStateUpdate`. Since all Hook implementations which handle `PostStateUpdate` (which is exactly 1 in non-test code) only call state methods that eventually copy the state, we can remove the extra copy from the `updateStateHook` itself. The state was already locked for the duration of the `PostStateUpdate` call previously, so no additional delay should result. For consistency this also updates the documentation for `PostStateUpdate` to record the new caller and callee expectations based on the existing implementation. The Hook interface predated the `statemgr` which provides a better interface for synchronizing state access and therefor required extra copying at that time, while now we can more easily declare that the method requires concurrent access be locked for the duration of the call. --- internal/terraform/hook.go | 8 +++++--- internal/terraform/update_state_hook.go | 9 +++------ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/internal/terraform/hook.go b/internal/terraform/hook.go index 2e457f2814..f7dbd6af04 100644 --- a/internal/terraform/hook.go +++ b/internal/terraform/hook.go @@ -114,9 +114,11 @@ type Hook interface { // function is called. Stopping() - // PostStateUpdate is called each time the state is updated. It receives - // a deep copy of the state, which it may therefore access freely without - // any need for locks to protect from concurrent writes from the caller. + // PostStateUpdate is called each time the state is updated. The caller must + // coordinate a lock for the state if necessary, such that the Hook may + // access it freely without any need for additional locks to protect from + // concurrent writes. Implementations which modify or retain the state after + // the call has returned must copy the state. PostStateUpdate(new *states.State) (HookAction, error) } diff --git a/internal/terraform/update_state_hook.go b/internal/terraform/update_state_hook.go index 3aa551df50..35dc4d82cd 100644 --- a/internal/terraform/update_state_hook.go +++ b/internal/terraform/update_state_hook.go @@ -5,13 +5,10 @@ package terraform // updateStateHook calls the PostStateUpdate hook with the current state. func updateStateHook(ctx EvalContext) error { - // In principle we could grab the lock here just long enough to take a - // deep copy and then pass that to our hooks below, but we'll instead - // hold the hook for the duration to avoid the potential confusing - // situation of us racing to call PostStateUpdate concurrently with - // different state snapshots. + // PostStateUpdate requires that the state be locked and safe to read for + // the duration of the call. stateSync := ctx.State() - state := stateSync.Lock().DeepCopy() + state := stateSync.Lock() defer stateSync.Unlock() // Call the hook From f9172bc2b5a61ab17647c00d3f55845b07770a53 Mon Sep 17 00:00:00 2001 From: Jamie Finnigan Date: Wed, 15 May 2024 16:02:08 -0700 Subject: [PATCH 077/161] go get golang.org/x/net@v0.23.0 && go mod tidy --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9e4dafd192..ec4402ad2e 100644 --- a/go.mod +++ b/go.mod @@ -72,7 +72,7 @@ require ( go.opentelemetry.io/otel/trace v1.24.0 golang.org/x/crypto v0.21.0 golang.org/x/mod v0.16.0 - golang.org/x/net v0.22.0 + golang.org/x/net v0.23.0 golang.org/x/oauth2 v0.18.0 golang.org/x/sys v0.19.0 golang.org/x/term v0.18.0 diff --git a/go.sum b/go.sum index 841efe4197..3e97d6c83c 100644 --- a/go.sum +++ b/go.sum @@ -1208,8 +1208,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= From 368ccbf63a9294313435b3b3ffa48076e2b7a554 Mon Sep 17 00:00:00 2001 From: Jamie Finnigan Date: Wed, 15 May 2024 16:04:48 -0700 Subject: [PATCH 078/161] make syncdeps --- internal/backend/remote-state/azure/go.mod | 2 +- internal/backend/remote-state/azure/go.sum | 4 ++-- internal/backend/remote-state/consul/go.mod | 2 +- internal/backend/remote-state/consul/go.sum | 4 ++-- internal/backend/remote-state/cos/go.mod | 2 +- internal/backend/remote-state/cos/go.sum | 4 ++-- internal/backend/remote-state/gcs/go.mod | 2 +- internal/backend/remote-state/gcs/go.sum | 4 ++-- internal/backend/remote-state/kubernetes/go.mod | 2 +- internal/backend/remote-state/kubernetes/go.sum | 4 ++-- internal/backend/remote-state/oss/go.mod | 2 +- internal/backend/remote-state/oss/go.sum | 4 ++-- internal/backend/remote-state/pg/go.mod | 2 +- internal/backend/remote-state/pg/go.sum | 4 ++-- internal/backend/remote-state/s3/go.mod | 2 +- internal/backend/remote-state/s3/go.sum | 4 ++-- internal/legacy/go.mod | 2 +- internal/legacy/go.sum | 4 ++-- 18 files changed, 27 insertions(+), 27 deletions(-) diff --git a/internal/backend/remote-state/azure/go.mod b/internal/backend/remote-state/azure/go.mod index 5062259855..4d2a8ecbd6 100644 --- a/internal/backend/remote-state/azure/go.mod +++ b/internal/backend/remote-state/azure/go.mod @@ -55,7 +55,7 @@ require ( github.com/zclconf/go-cty v1.14.4 // indirect golang.org/x/crypto v0.21.0 // indirect golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.22.0 // indirect + golang.org/x/net v0.23.0 // indirect golang.org/x/oauth2 v0.18.0 // indirect golang.org/x/sys v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect diff --git a/internal/backend/remote-state/azure/go.sum b/internal/backend/remote-state/azure/go.sum index 3e5ed94b07..87c5e7e0bb 100644 --- a/internal/backend/remote-state/azure/go.sum +++ b/internal/backend/remote-state/azure/go.sum @@ -409,8 +409,8 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/internal/backend/remote-state/consul/go.mod b/internal/backend/remote-state/consul/go.mod index b04655a3f6..da1c255bc7 100644 --- a/internal/backend/remote-state/consul/go.mod +++ b/internal/backend/remote-state/consul/go.mod @@ -46,7 +46,7 @@ require ( github.com/spf13/afero v1.9.3 // indirect github.com/stretchr/testify v1.8.4 // indirect golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.22.0 // indirect + golang.org/x/net v0.23.0 // indirect golang.org/x/sys v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.19.0 // indirect diff --git a/internal/backend/remote-state/consul/go.sum b/internal/backend/remote-state/consul/go.sum index 4420ee50aa..c3cb85599f 100644 --- a/internal/backend/remote-state/consul/go.sum +++ b/internal/backend/remote-state/consul/go.sum @@ -407,8 +407,8 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/internal/backend/remote-state/cos/go.mod b/internal/backend/remote-state/cos/go.mod index 1c575f6d7e..74a2c545f3 100644 --- a/internal/backend/remote-state/cos/go.mod +++ b/internal/backend/remote-state/cos/go.mod @@ -36,7 +36,7 @@ require ( github.com/spf13/afero v1.9.3 // indirect github.com/zclconf/go-cty v1.14.4 // indirect golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.22.0 // indirect + golang.org/x/net v0.23.0 // indirect golang.org/x/sys v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.19.0 // indirect diff --git a/internal/backend/remote-state/cos/go.sum b/internal/backend/remote-state/cos/go.sum index 8688c72a94..0f7898843b 100644 --- a/internal/backend/remote-state/cos/go.sum +++ b/internal/backend/remote-state/cos/go.sum @@ -345,8 +345,8 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/internal/backend/remote-state/gcs/go.mod b/internal/backend/remote-state/gcs/go.mod index 6e8bc79d45..d8a68da74e 100644 --- a/internal/backend/remote-state/gcs/go.mod +++ b/internal/backend/remote-state/gcs/go.mod @@ -44,7 +44,7 @@ require ( go.opencensus.io v0.24.0 // indirect golang.org/x/crypto v0.21.0 // indirect golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.22.0 // indirect + golang.org/x/net v0.23.0 // indirect golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect diff --git a/internal/backend/remote-state/gcs/go.sum b/internal/backend/remote-state/gcs/go.sum index f5da658ad0..bf7bb6a9a6 100644 --- a/internal/backend/remote-state/gcs/go.sum +++ b/internal/backend/remote-state/gcs/go.sum @@ -349,8 +349,8 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/internal/backend/remote-state/kubernetes/go.mod b/internal/backend/remote-state/kubernetes/go.mod index f4104ffeec..dbce729294 100644 --- a/internal/backend/remote-state/kubernetes/go.mod +++ b/internal/backend/remote-state/kubernetes/go.mod @@ -64,7 +64,7 @@ require ( github.com/zclconf/go-cty v1.14.4 // indirect golang.org/x/crypto v0.21.0 // indirect golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.22.0 // indirect + golang.org/x/net v0.23.0 // indirect golang.org/x/oauth2 v0.18.0 // indirect golang.org/x/sys v0.19.0 // indirect golang.org/x/term v0.18.0 // indirect diff --git a/internal/backend/remote-state/kubernetes/go.sum b/internal/backend/remote-state/kubernetes/go.sum index 73b0af0dc6..155e5d465a 100644 --- a/internal/backend/remote-state/kubernetes/go.sum +++ b/internal/backend/remote-state/kubernetes/go.sum @@ -410,8 +410,8 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/internal/backend/remote-state/oss/go.mod b/internal/backend/remote-state/oss/go.mod index 65c5503e41..135bfc57d2 100644 --- a/internal/backend/remote-state/oss/go.mod +++ b/internal/backend/remote-state/oss/go.mod @@ -42,7 +42,7 @@ require ( github.com/stretchr/testify v1.8.4 // indirect github.com/zclconf/go-cty v1.14.4 // indirect golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.22.0 // indirect + golang.org/x/net v0.23.0 // indirect golang.org/x/sys v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.19.0 // indirect diff --git a/internal/backend/remote-state/oss/go.sum b/internal/backend/remote-state/oss/go.sum index b8c598c218..ff88a5c99a 100644 --- a/internal/backend/remote-state/oss/go.sum +++ b/internal/backend/remote-state/oss/go.sum @@ -354,8 +354,8 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/internal/backend/remote-state/pg/go.mod b/internal/backend/remote-state/pg/go.mod index 74604365ca..f95e30fb03 100644 --- a/internal/backend/remote-state/pg/go.mod +++ b/internal/backend/remote-state/pg/go.mod @@ -30,7 +30,7 @@ require ( github.com/spf13/afero v1.9.3 // indirect github.com/zclconf/go-cty v1.14.4 // indirect golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.22.0 // indirect + golang.org/x/net v0.23.0 // indirect golang.org/x/sys v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.19.0 // indirect diff --git a/internal/backend/remote-state/pg/go.sum b/internal/backend/remote-state/pg/go.sum index 6aaa55355a..f15dc34dd2 100644 --- a/internal/backend/remote-state/pg/go.sum +++ b/internal/backend/remote-state/pg/go.sum @@ -325,8 +325,8 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/internal/backend/remote-state/s3/go.mod b/internal/backend/remote-state/s3/go.mod index 25c2daf19d..27d818247b 100644 --- a/internal/backend/remote-state/s3/go.mod +++ b/internal/backend/remote-state/s3/go.mod @@ -63,7 +63,7 @@ require ( go.opentelemetry.io/otel/trace v1.24.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.22.0 // indirect + golang.org/x/net v0.23.0 // indirect golang.org/x/sys v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.19.0 // indirect diff --git a/internal/backend/remote-state/s3/go.sum b/internal/backend/remote-state/s3/go.sum index 688dd87176..fb911e9d87 100644 --- a/internal/backend/remote-state/s3/go.sum +++ b/internal/backend/remote-state/s3/go.sum @@ -397,8 +397,8 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/internal/legacy/go.mod b/internal/legacy/go.mod index c611bf8b96..d814862288 100644 --- a/internal/legacy/go.mod +++ b/internal/legacy/go.mod @@ -26,7 +26,7 @@ require ( github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/spf13/afero v1.9.3 // indirect golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.22.0 // indirect + golang.org/x/net v0.23.0 // indirect golang.org/x/sys v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.19.0 // indirect diff --git a/internal/legacy/go.sum b/internal/legacy/go.sum index df3b3567ed..73abb4f142 100644 --- a/internal/legacy/go.sum +++ b/internal/legacy/go.sum @@ -314,8 +314,8 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= From 7a8ffff66ee026dc425311d494fc9fb4bcdb5add Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Thu, 16 May 2024 13:06:13 +0200 Subject: [PATCH 079/161] stacks: Fix unknown provider values crashing validation phase (#35155) * test to reproduce * stacks: Fix unknown provider values crashing validation phase * remove extra type information --------- Co-authored-by: CJ Horton --- .../internal/stackeval/component_config.go | 6 ++++ .../provider-for-each.tfstack.hcl | 32 +++++++++++++++++++ internal/stacks/stackruntime/validate_test.go | 5 +++ 3 files changed, 43 insertions(+) create mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/provider-for-each/provider-for-each.tfstack.hcl diff --git a/internal/stacks/stackruntime/internal/stackeval/component_config.go b/internal/stacks/stackruntime/internal/stackeval/component_config.go index 3a4007e55c..d717a38c4b 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_config.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_config.go @@ -336,6 +336,12 @@ func (c *ComponentConfig) CheckProviders(ctx context.Context, phase EvalPhase) ( }) continue } + } else if result.Value == cty.DynamicVal { + // Then we don't know the concrete type of this reference at this + // time, so we'll just have to accept it. This is somewhat expected + // during the validation phase, and even during the planning phase + // if we have deferred attributes. We'll get an error later (ie. + // during the plan phase) if the type doesn't match up then. } else { // We got something that isn't a provider reference at all. diags = diags.Append(&hcl.Diagnostic{ diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/provider-for-each/provider-for-each.tfstack.hcl b/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/provider-for-each/provider-for-each.tfstack.hcl new file mode 100644 index 0000000000..09b6b482bf --- /dev/null +++ b/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/provider-for-each/provider-for-each.tfstack.hcl @@ -0,0 +1,32 @@ +required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } +} + +variable "provider_set" { + type = set(string) + default = ["a", "b"] +} + +provider "testing" "configurations" { + for_each = var.provider_set +} + +variable "input" { + type = string +} + +component "self" { + source = "../" + for_each = var.provider_set + + providers = { + testing = provider.testing.configurations[each.value] + } + + inputs = { + input = var.input + } +} \ No newline at end of file diff --git a/internal/stacks/stackruntime/validate_test.go b/internal/stacks/stackruntime/validate_test.go index 63564a6770..1c687065d2 100644 --- a/internal/stacks/stackruntime/validate_test.go +++ b/internal/stacks/stackruntime/validate_test.go @@ -61,6 +61,11 @@ var ( "input": cty.StringVal("input"), }, }, + filepath.Join("with-single-input", "provider-for-each"): { + planInputVars: map[string]cty.Value{ + "input": cty.StringVal("input"), + }, + }, } // invalidConfigurations are shared between the validate and plan tests. From 48fc2d3ac7c24cb9e29a54b370de858e0c98f0cc Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Thu, 16 May 2024 13:15:20 +0200 Subject: [PATCH 080/161] terraform test: Disallow version constraints within test files (#35161) --- internal/command/init_test.go | 40 +++++++++++++++++++ internal/command/providers_test.go | 1 - .../main.tf | 3 ++ .../main.tftest.hcl | 25 ++++++++++++ .../setup/main.tf | 11 +++++ .../testdata/providers/tests/main.tftest.hcl | 2 + internal/configs/config.go | 23 +++-------- internal/configs/config_test.go | 40 +++++-------------- internal/configs/parser_config.go | 2 +- internal/configs/provider.go | 29 +++++++++----- internal/configs/test_file.go | 2 +- .../provider-reqs-root.tftest.hcl | 8 ++-- .../provider-reqs-with-tests/setup/setup.tf | 2 + internal/moduletest/config/config.go | 2 - 14 files changed, 124 insertions(+), 66 deletions(-) create mode 100644 internal/command/testdata/init-with-tests-external-providers/main.tf create mode 100644 internal/command/testdata/init-with-tests-external-providers/main.tftest.hcl create mode 100644 internal/command/testdata/init-with-tests-external-providers/setup/main.tf diff --git a/internal/command/init_test.go b/internal/command/init_test.go index 01b35ba5fd..5f51b1bc45 100644 --- a/internal/command/init_test.go +++ b/internal/command/init_test.go @@ -25,6 +25,8 @@ import ( "github.com/hashicorp/terraform/internal/depsfile" "github.com/hashicorp/terraform/internal/getproviders" "github.com/hashicorp/terraform/internal/providercache" + "github.com/hashicorp/terraform/internal/providers" + testing_provider "github.com/hashicorp/terraform/internal/providers/testing" "github.com/hashicorp/terraform/internal/states" "github.com/hashicorp/terraform/internal/states/statefile" "github.com/hashicorp/terraform/internal/states/statemgr" @@ -2831,6 +2833,44 @@ func TestInit_invalidSyntaxBackendAttribute(t *testing.T) { } } +func TestInit_testsWithExternalProviders(t *testing.T) { + td := t.TempDir() + testCopyDir(t, testFixturePath("init-with-tests-external-providers"), td) + defer testChdir(t, td)() + + providerSource, close := newMockProviderSource(t, map[string][]string{ + "hashicorp/testing": {"1.0.0"}, + "testing/configure": {"1.0.0"}, + }) + defer close() + + hashicorpTestingProviderAddress := addrs.NewDefaultProvider("testing") + hashicorpTestingProvider := new(testing_provider.MockProvider) + testingConfigureProviderAddress := addrs.NewProvider(addrs.DefaultProviderRegistryHost, "testing", "configure") + testingConfigureProvider := new(testing_provider.MockProvider) + + ui := new(cli.MockUi) + view, done := testView(t) + c := &InitCommand{ + Meta: Meta{ + testingOverrides: &testingOverrides{ + Providers: map[addrs.Provider]providers.Factory{ + hashicorpTestingProviderAddress: providers.FactoryFixed(hashicorpTestingProvider), + testingConfigureProviderAddress: providers.FactoryFixed(testingConfigureProvider), + }, + }, + Ui: ui, + View: view, + ProviderSource: providerSource, + }, + } + + var args []string + if code := c.Run(args); code != 0 { + t.Fatalf("bad: \n%s", done(t).All()) + } +} + func TestInit_tests(t *testing.T) { // Create a temporary working directory that is empty td := t.TempDir() diff --git a/internal/command/providers_test.go b/internal/command/providers_test.go index 98c0c1fe19..8335d92120 100644 --- a/internal/command/providers_test.go +++ b/internal/command/providers_test.go @@ -192,7 +192,6 @@ func TestProviders_tests(t *testing.T) { } wantOutput := []string{ - "provider[registry.terraform.io/hashicorp/foo]", "test.main", "provider[registry.terraform.io/hashicorp/bar]", } diff --git a/internal/command/testdata/init-with-tests-external-providers/main.tf b/internal/command/testdata/init-with-tests-external-providers/main.tf new file mode 100644 index 0000000000..0bc133ee12 --- /dev/null +++ b/internal/command/testdata/init-with-tests-external-providers/main.tf @@ -0,0 +1,3 @@ +resource "testing_instance" "baz" { + ami = "baz" +} diff --git a/internal/command/testdata/init-with-tests-external-providers/main.tftest.hcl b/internal/command/testdata/init-with-tests-external-providers/main.tftest.hcl new file mode 100644 index 0000000000..3ba7e33205 --- /dev/null +++ b/internal/command/testdata/init-with-tests-external-providers/main.tftest.hcl @@ -0,0 +1,25 @@ + +// configure is not a "hashicorp" provider, so it won't be able to load +// this using the default behaviour. Terraform will need to look into the setup +// module to find the provider configuration. +provider "configure" {} + +// testing is a "hashicorp" provider, so it can load this using the defaults +// even though not required provider block providers a definition for it. +provider "testing" {} + +run "setup" { + module { + source = "./setup" + } + + providers = { + configure = configure + } +} + +run "test" { + providers = { + testing = testing + } +} diff --git a/internal/command/testdata/init-with-tests-external-providers/setup/main.tf b/internal/command/testdata/init-with-tests-external-providers/setup/main.tf new file mode 100644 index 0000000000..607cfe131a --- /dev/null +++ b/internal/command/testdata/init-with-tests-external-providers/setup/main.tf @@ -0,0 +1,11 @@ +terraform { + required_providers { + configure = { + source = "testing/configure" + } + } +} + +resource "configure_instance" "baz" { + ami = "baz" +} diff --git a/internal/command/testdata/providers/tests/main.tftest.hcl b/internal/command/testdata/providers/tests/main.tftest.hcl index 08de6964a1..17b46b3340 100644 --- a/internal/command/testdata/providers/tests/main.tftest.hcl +++ b/internal/command/testdata/providers/tests/main.tftest.hcl @@ -1,3 +1,5 @@ +// This won't actually show up in the providers list, as nothing is actually +// using it. provider "foo" { } diff --git a/internal/configs/config.go b/internal/configs/config.go index 86a8118665..25c0e292fb 100644 --- a/internal/configs/config.go +++ b/internal/configs/config.go @@ -384,10 +384,6 @@ func (c *Config) ProviderRequirementsByModule() (*ModuleRequirements, hcl.Diagno Runs: make(map[string]*ModuleRequirements), } - for _, provider := range test.Providers { - diags = append(diags, c.addProviderRequirementsFromProviderBlock(testReqs.Requirements, provider)...) - } - for _, run := range test.Runs { if run.ConfigUnderTest == nil { continue @@ -556,20 +552,13 @@ func (c *Config) addProviderRequirements(reqs providerreqs.Requirements, recurse // We may have provider blocks and required_providers set in some testing // files. - if tests { + if tests && recurse { for _, file := range c.Module.Tests { - for _, provider := range file.Providers { - moreDiags := c.addProviderRequirementsFromProviderBlock(reqs, provider) - diags = append(diags, moreDiags...) - } - - if recurse { - // Then we'll also look for requirements in testing modules. - for _, run := range file.Runs { - if run.ConfigUnderTest != nil { - moreDiags := run.ConfigUnderTest.addProviderRequirements(reqs, true, false) - diags = append(diags, moreDiags...) - } + // Then we'll also look for requirements in testing modules. + for _, run := range file.Runs { + if run.ConfigUnderTest != nil { + moreDiags := run.ConfigUnderTest.addProviderRequirements(reqs, true, false) + diags = append(diags, moreDiags...) } } } diff --git a/internal/configs/config_test.go b/internal/configs/config_test.go index 9441861286..b8e374d72e 100644 --- a/internal/configs/config_test.go +++ b/internal/configs/config_test.go @@ -165,12 +165,7 @@ func TestConfigProviderRequirements(t *testing.T) { func TestConfigProviderRequirementsInclTests(t *testing.T) { cfg, diags := testNestedModuleConfigFromDirWithTests(t, "testdata/provider-reqs-with-tests") - // TODO: Version Constraint Deprecation. - // Once we've removed the version argument from provider configuration - // blocks, this can go back to expected 0 diagnostics. - // assertNoDiagnostics(t, diags) - assertDiagnosticCount(t, diags, 1) - assertDiagnosticSummary(t, diags, "Version constraints inside provider configuration blocks are deprecated") + assertDiagnosticCount(t, diags, 0) tlsProvider := addrs.NewProvider( addrs.DefaultProviderRegistryHost, @@ -189,7 +184,7 @@ func TestConfigProviderRequirementsInclTests(t *testing.T) { nullProvider: providerreqs.MustParseVersionConstraints("~> 2.0.0"), randomProvider: providerreqs.MustParseVersionConstraints("~> 1.2.0"), tlsProvider: providerreqs.MustParseVersionConstraints("~> 3.0"), - configuredProvider: providerreqs.MustParseVersionConstraints("~> 1.4"), + configuredProvider: nil, impliedProvider: nil, terraformProvider: nil, } @@ -243,12 +238,7 @@ func TestConfigProviderRequirementsShallow(t *testing.T) { func TestConfigProviderRequirementsShallowInclTests(t *testing.T) { cfg, diags := testNestedModuleConfigFromDirWithTests(t, "testdata/provider-reqs-with-tests") - // TODO: Version Constraint Deprecation. - // Once we've removed the version argument from provider configuration - // blocks, this can go back to expected 0 diagnostics. - // assertNoDiagnostics(t, diags) - assertDiagnosticCount(t, diags, 1) - assertDiagnosticSummary(t, diags, "Version constraints inside provider configuration blocks are deprecated") + assertDiagnosticCount(t, diags, 0) tlsProvider := addrs.NewProvider( addrs.DefaultProviderRegistryHost, @@ -256,15 +246,13 @@ func TestConfigProviderRequirementsShallowInclTests(t *testing.T) { ) impliedProvider := addrs.NewDefaultProvider("implied") terraformProvider := addrs.NewBuiltInProvider("terraform") - configuredProvider := addrs.NewDefaultProvider("configured") got, diags := cfg.ProviderRequirementsShallow() assertNoDiagnostics(t, diags) want := providerreqs.Requirements{ - tlsProvider: providerreqs.MustParseVersionConstraints("~> 3.0"), - configuredProvider: providerreqs.MustParseVersionConstraints("~> 1.4"), - impliedProvider: nil, - terraformProvider: nil, + tlsProvider: providerreqs.MustParseVersionConstraints("~> 3.0"), + impliedProvider: nil, + terraformProvider: nil, } if diff := cmp.Diff(want, got); diff != "" { @@ -346,12 +334,7 @@ func TestConfigProviderRequirementsByModule(t *testing.T) { func TestConfigProviderRequirementsByModuleInclTests(t *testing.T) { cfg, diags := testNestedModuleConfigFromDirWithTests(t, "testdata/provider-reqs-with-tests") - // TODO: Version Constraint Deprecation. - // Once we've removed the version argument from provider configuration - // blocks, this can go back to expected 0 diagnostics. - // assertNoDiagnostics(t, diags) - assertDiagnosticCount(t, diags, 1) - assertDiagnosticSummary(t, diags, "Version constraints inside provider configuration blocks are deprecated") + assertDiagnosticCount(t, diags, 0) tlsProvider := addrs.NewProvider( addrs.DefaultProviderRegistryHost, @@ -378,17 +361,16 @@ func TestConfigProviderRequirementsByModuleInclTests(t *testing.T) { Children: make(map[string]*ModuleRequirements), Tests: map[string]*TestFileModuleRequirements{ "provider-reqs-root.tftest.hcl": { - Requirements: providerreqs.Requirements{ - configuredProvider: providerreqs.MustParseVersionConstraints("~> 1.4"), - }, + Requirements: providerreqs.Requirements{}, Runs: map[string]*ModuleRequirements{ "setup": { Name: "setup", SourceAddr: addrs.ModuleSourceLocal("./setup"), SourceDir: "testdata/provider-reqs-with-tests/setup", Requirements: providerreqs.Requirements{ - nullProvider: providerreqs.MustParseVersionConstraints("~> 2.0.0"), - randomProvider: providerreqs.MustParseVersionConstraints("~> 1.2.0"), + nullProvider: providerreqs.MustParseVersionConstraints("~> 2.0.0"), + randomProvider: providerreqs.MustParseVersionConstraints("~> 1.2.0"), + configuredProvider: nil, }, Children: make(map[string]*ModuleRequirements), Tests: make(map[string]*TestFileModuleRequirements), diff --git a/internal/configs/parser_config.go b/internal/configs/parser_config.go index 09fe677df5..83148bfe31 100644 --- a/internal/configs/parser_config.go +++ b/internal/configs/parser_config.go @@ -147,7 +147,7 @@ func parseConfigFile(body hcl.Body, diags hcl.Diagnostics, override, allowExperi }) case "provider": - cfg, cfgDiags := decodeProviderBlock(block) + cfg, cfgDiags := decodeProviderBlock(block, false) diags = append(diags, cfgDiags...) if cfg != nil { file.ProviderConfigs = append(file.ProviderConfigs, cfg) diff --git a/internal/configs/provider.go b/internal/configs/provider.go index 49d51d6a2f..9bea8c4cd9 100644 --- a/internal/configs/provider.go +++ b/internal/configs/provider.go @@ -48,7 +48,7 @@ type Provider struct { MockDataExternalSource string } -func decodeProviderBlock(block *hcl.Block) (*Provider, hcl.Diagnostics) { +func decodeProviderBlock(block *hcl.Block, testFile bool) (*Provider, hcl.Diagnostics) { var diags hcl.Diagnostics content, config, moreDiags := block.Body.PartialContent(providerBlockSchema) @@ -92,15 +92,24 @@ func decodeProviderBlock(block *hcl.Block) (*Provider, hcl.Diagnostics) { } if attr, exists := content.Attributes["version"]; exists { - diags = append(diags, &hcl.Diagnostic{ - Severity: hcl.DiagWarning, - Summary: "Version constraints inside provider configuration blocks are deprecated", - Detail: "Terraform 0.13 and earlier allowed provider version constraints inside the provider configuration block, but that is now deprecated and will be removed in a future version of Terraform. To silence this warning, move the provider version constraint into the required_providers block.", - Subject: attr.Expr.Range().Ptr(), - }) - var versionDiags hcl.Diagnostics - provider.Version, versionDiags = decodeVersionConstraint(attr) - diags = append(diags, versionDiags...) + if testFile { + diags = append(diags, &hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Version constraints are not allowed in test files", + Detail: "Version constraints inside provider configuration blocks are not allowed in test files. To silence this error, move the provider version constraint into the required_providers block of the configuration that uses this provider.", + Subject: attr.Expr.Range().Ptr(), + }) + } else { + diags = append(diags, &hcl.Diagnostic{ + Severity: hcl.DiagWarning, + Summary: "Version constraints inside provider configuration blocks are deprecated", + Detail: "Terraform 0.13 and earlier allowed provider version constraints inside the provider configuration block, but that is now deprecated and will be removed in a future version of Terraform. To silence this warning, move the provider version constraint into the required_providers block.", + Subject: attr.Expr.Range().Ptr(), + }) + var versionDiags hcl.Diagnostics + provider.Version, versionDiags = decodeVersionConstraint(attr) + diags = append(diags, versionDiags...) + } } // Reserved attribute names diff --git a/internal/configs/test_file.go b/internal/configs/test_file.go index 5558490d69..0a9cd7bca3 100644 --- a/internal/configs/test_file.go +++ b/internal/configs/test_file.go @@ -337,7 +337,7 @@ func loadTestFile(body hcl.Body) (*TestFile, hcl.Diagnostics) { tf.Variables[v.Name] = v.Expr } case "provider": - provider, providerDiags := decodeProviderBlock(block) + provider, providerDiags := decodeProviderBlock(block, true) diags = append(diags, providerDiags...) if provider != nil { key := provider.moduleUniqueKey() diff --git a/internal/configs/testdata/provider-reqs-with-tests/provider-reqs-root.tftest.hcl b/internal/configs/testdata/provider-reqs-with-tests/provider-reqs-root.tftest.hcl index e368ef00da..5f52a23a70 100644 --- a/internal/configs/testdata/provider-reqs-with-tests/provider-reqs-root.tftest.hcl +++ b/internal/configs/testdata/provider-reqs-with-tests/provider-reqs-root.tftest.hcl @@ -1,8 +1,6 @@ -# There is no provider in required_providers called "configured", so the version -# constraint should come from this configuration block. -provider "configured" { - version = "~> 1.4" -} +# There is no provider in required_providers called "configured", so we won't +# have a version constraint for it. +provider "configured" {} run "setup" { module { diff --git a/internal/configs/testdata/provider-reqs-with-tests/setup/setup.tf b/internal/configs/testdata/provider-reqs-with-tests/setup/setup.tf index 7341d6af93..ce7f37e4d8 100644 --- a/internal/configs/testdata/provider-reqs-with-tests/setup/setup.tf +++ b/internal/configs/testdata/provider-reqs-with-tests/setup/setup.tf @@ -6,3 +6,5 @@ terraform { } } } + +resource "configured_resource" "resource" {} diff --git a/internal/moduletest/config/config.go b/internal/moduletest/config/config.go index 71c6527d46..292582aac1 100644 --- a/internal/moduletest/config/config.go +++ b/internal/moduletest/config/config.go @@ -87,7 +87,6 @@ func TransformConfigForTest(config *configs.Config, run *moduletest.Run, file *m NameRange: ref.InChild.NameRange, Alias: ref.InChild.Alias, AliasRange: ref.InChild.AliasRange, - Version: testProvider.Version, Config: &hcltest.ProviderConfig{ Original: testProvider.Config, VariableCache: variableCaches.GetCache(run.Name, config), @@ -114,7 +113,6 @@ func TransformConfigForTest(config *configs.Config, run *moduletest.Run, file *m NameRange: provider.NameRange, Alias: provider.Alias, AliasRange: provider.AliasRange, - Version: provider.Version, Config: &hcltest.ProviderConfig{ Original: provider.Config, VariableCache: variableCaches.GetCache(run.Name, config), From 5956767627c78597e665765f793ee9de01acfd57 Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Thu, 16 May 2024 13:17:48 +0200 Subject: [PATCH 081/161] Update CHANGELOG.md --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index be53ae2f2d..8a5903f04a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,11 @@ BUG FIXES: * `remote-exec`: Each remote connection will now be closed immediately after use. ([#34137](https://github.com/hashicorp/terraform/issues/34137)) * `backend/s3`: Fixed the digest value displayed for DynamoDB/S3 state checksum mismatches. ([#34387](https://github.com/hashicorp/terraform/issues/34387)) +* `terraform test`: Fix bug in which non-Hashicorp providers required by testing modules and initialised within the test files were assigned incorrect registry addresses. ([#35161](https://github.com/hashicorp/terraform/issues/35161)) + +UPGRADE NOTES: + +* `terraform test`: It is no longer valid to specify version constraints within provider blocks within .tftest.hcl files. Instead, version constraints must be supplied within the main configuration where the provider is in use. EXPERIMENTS: From 619c5f172044a89c121e15ba6f772ea5e71e7c9e Mon Sep 17 00:00:00 2001 From: Mutahhir Hayat Date: Thu, 16 May 2024 14:38:47 +0200 Subject: [PATCH 082/161] version: Prepare for 1.9.0-alpha20240516 release --- CHANGELOG.md | 2 +- version/VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a5903f04a..05a9ae0489 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## 1.9.0 (Unreleased) +## 1.9.0-alpha20240516 (May 16, 2024) ENHANCEMENTS: diff --git a/version/VERSION b/version/VERSION index 27167ba29c..40bc69b4de 100644 --- a/version/VERSION +++ b/version/VERSION @@ -1 +1 @@ -1.9.0-alpha +1.9.0-alpha20240516 From 94ab59c5b6bd70ce702fc3bc9937e6fcb7c5b370 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Thu, 16 May 2024 08:51:34 -0400 Subject: [PATCH 083/161] update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05a9ae0489..b50f107bdc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,12 +3,12 @@ ENHANCEMENTS: * `terraform console`: Now has basic support for multi-line input in interactive mode. ([#34822](https://github.com/hashicorp/terraform/pull/34822)) - If an entered line contains opening parentheses/etc that are not closed, Terraform will await another line of input to complete the expression. This initial implementation is primarily intended to support pasting in multi-line expressions from elsewhere, rather than for manual multi-line editing, so the interactive editing support is currently limited. * `terraform plan`: Improved presentation of OPA and Sentinel policy evaluations in HCP Terraform remote runs, for logical separation. * `terraform init` now accepts a `-json` option. If specified, enables the machine readable JSON output. ([#34886](https://github.com/hashicorp/terraform/pull/34886)) * `terraform test`: Test runs can now pass sensitive values to input variables while preserving their dynamic sensitivity. Previously sensitivity would be preserved only for variables statically declared as being sensitive, using `sensitive = true`. ([#35021](https://github.com/hashicorp/terraform/pull/35021)) * Performance improvement during graph building for configurations with an extremely large number of `resource` blocks. ([#35088](https://github.com/hashicorp/terraform/pull/35088)) +* Reduced copying of state to improve performance with larges numbers of resources. [GH-35164] BUG FIXES: From d346432dd0dd6f20dcd4ce0645e0f16ca2c31cb7 Mon Sep 17 00:00:00 2001 From: Mutahhir Hayat Date: Thu, 16 May 2024 16:45:48 +0200 Subject: [PATCH 084/161] version: Clean up after 1.9.0-alpha20240516 release --- CHANGELOG.md | 2 +- version/VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b50f107bdc..b35524dd6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## 1.9.0-alpha20240516 (May 16, 2024) +## 1.9.0 (Unreleased) ENHANCEMENTS: diff --git a/version/VERSION b/version/VERSION index 40bc69b4de..27167ba29c 100644 --- a/version/VERSION +++ b/version/VERSION @@ -1 +1 @@ -1.9.0-alpha20240516 +1.9.0-alpha From 0cbab0f06ab234bee42cde039c42ebe2ea1ce6b4 Mon Sep 17 00:00:00 2001 From: Brian Flad Date: Thu, 16 May 2024 15:54:33 -0400 Subject: [PATCH 085/161] Support moving from null_resource to terraform_data (#35163) This change enables the built-in provider's `terraform_data` managed resource to work with the `moved` configuration block where the `from` address is a `null_resource` managed resource type from the official `hashicorp/null` provider. It produces no plan differences for typical configurations and specifically helps practitioners from re-running provisioners while moving resource types. In addition to the unit testing, this was manually tested with the following configurations and outputs: Initial configuration (no `triggers`): ```terraform terraform { required_providers { null = { source = "hashicorp/null" version = "3.2.2" } } } resource "null_resource" "example" { provisioner "local-exec" { command = "echo 'Hello, World!'" } } ``` Moved configuration (no `triggers`): ```terraform resource "terraform_data" "example" { provisioner "local-exec" { command = "echo 'Hello, World!'" } } moved { from = null_resource.example to = terraform_data.example } ``` Moved output (no `triggers`): ```console $ terraform apply terraform_data.example: Refreshing state... [id=892002337455008838] Terraform will perform the following actions: # null_resource.example has moved to terraform_data.example resource "terraform_data" "example" { id = "892002337455008838" } Plan: 0 to add, 0 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes Apply complete! Resources: 0 added, 0 changed, 0 destroyed. ``` Initial configuration (with `triggers`): ```terraform terraform { required_providers { null = { source = "hashicorp/null" version = "3.2.2" } } } resource "null_resource" "example" { triggers = { examplekey = "examplevalue" } provisioner "local-exec" { command = "echo 'Hello, World!'" } } ``` Moved configuration (with `triggers`): ```terraform resource "terraform_data" "example" { triggers_replace = { examplekey = "examplevalue" } provisioner "local-exec" { command = "echo 'Hello, World!'" } } moved { from = null_resource.example to = terraform_data.example } ``` Moved output (with `triggers`): ```console $ terraform apply terraform_data.example: Refreshing state... [id=1651348367769440250] Terraform will perform the following actions: # null_resource.example has moved to terraform_data.example resource "terraform_data" "example" { id = "1651348367769440250" # (1 unchanged attribute hidden) } Plan: 0 to add, 0 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes Apply complete! Resources: 0 added, 0 changed, 0 destroyed. ``` --- .../builtin/providers/terraform/provider.go | 19 +++- .../providers/terraform/provider_test.go | 56 ++++++++++ .../providers/terraform/resource_data.go | 82 ++++++++++++++ .../providers/terraform/resource_data_test.go | 105 ++++++++++++++++++ 4 files changed, 258 insertions(+), 4 deletions(-) diff --git a/internal/builtin/providers/terraform/provider.go b/internal/builtin/providers/terraform/provider.go index 545e6537ec..9c6af32402 100644 --- a/internal/builtin/providers/terraform/provider.go +++ b/internal/builtin/providers/terraform/provider.go @@ -23,6 +23,9 @@ func NewProvider() providers.Interface { // GetSchema returns the complete schema for the provider. func (p *Provider) GetProviderSchema() providers.GetProviderSchemaResponse { return providers.GetProviderSchemaResponse{ + ServerCapabilities: providers.ServerCapabilities{ + MoveResourceState: true, + }, DataSources: map[string]providers.Schema{ "terraform_remote_state": dataSourceRemoteStateGetSchema(), }, @@ -169,10 +172,18 @@ func (p *Provider) ImportResourceState(req providers.ImportResourceStateRequest) panic("unimplemented - terraform_remote_state has no resources") } -func (p *Provider) MoveResourceState(providers.MoveResourceStateRequest) providers.MoveResourceStateResponse { - // We don't expose the move_resource_state capability, so this should never - // be called. - panic("unimplemented - terraform.io/builtin/terraform does not support cross-resource moves") +// MoveResourceState requests that the given resource be moved. +func (p *Provider) MoveResourceState(req providers.MoveResourceStateRequest) providers.MoveResourceStateResponse { + switch req.TargetTypeName { + case "terraform_data": + return moveDataStoreResourceState(req) + default: + var resp providers.MoveResourceStateResponse + + resp.Diagnostics = resp.Diagnostics.Append(fmt.Errorf("Error: unsupported resource %s", req.TargetTypeName)) + + return resp + } } // ValidateResourceConfig is used to to validate the resource configuration values. diff --git a/internal/builtin/providers/terraform/provider_test.go b/internal/builtin/providers/terraform/provider_test.go index 58a4b7d46f..555e796b28 100644 --- a/internal/builtin/providers/terraform/provider_test.go +++ b/internal/builtin/providers/terraform/provider_test.go @@ -4,10 +4,66 @@ package terraform import ( + "testing" + backendInit "github.com/hashicorp/terraform/internal/backend/init" + "github.com/hashicorp/terraform/internal/providers" + "github.com/zclconf/go-cty/cty" + ctyjson "github.com/zclconf/go-cty/cty/json" ) func init() { // Initialize the backends backendInit.Init(nil) } + +func TestMoveResourceState_DataStore(t *testing.T) { + t.Parallel() + + nullResourceStateValue := cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("test"), + }) + nullResourceStateJSON, err := ctyjson.Marshal(nullResourceStateValue, nullResourceStateValue.Type()) + + if err != nil { + t.Fatalf("failed to marshal null resource state: %s", err) + } + + provider := &Provider{} + req := providers.MoveResourceStateRequest{ + SourceProviderAddress: "registry.terraform.io/hashicorp/null", + SourceStateJSON: nullResourceStateJSON, + SourceTypeName: "null_resource", + TargetTypeName: "terraform_data", + } + resp := provider.MoveResourceState(req) + + if resp.Diagnostics.HasErrors() { + t.Errorf("unexpected diagnostics: %s", resp.Diagnostics.Err()) + } + + expectedTargetState := cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("test"), + "input": cty.NullVal(cty.DynamicPseudoType), + "output": cty.NullVal(cty.DynamicPseudoType), + "triggers_replace": cty.NullVal(cty.DynamicPseudoType), + }) + + if !resp.TargetState.RawEquals(expectedTargetState) { + t.Errorf("expected state was:\n%#v\ngot state is:\n%#v\n", expectedTargetState, resp.TargetState) + } +} + +func TestMoveResourceState_NonExistentResource(t *testing.T) { + t.Parallel() + + provider := &Provider{} + req := providers.MoveResourceStateRequest{ + TargetTypeName: "nonexistent_resource", + } + resp := provider.MoveResourceState(req) + + if !resp.Diagnostics.HasErrors() { + t.Fatal("expected diagnostics") + } +} diff --git a/internal/builtin/providers/terraform/resource_data.go b/internal/builtin/providers/terraform/resource_data.go index d5c9ce6ee3..3490009136 100644 --- a/internal/builtin/providers/terraform/resource_data.go +++ b/internal/builtin/providers/terraform/resource_data.go @@ -5,6 +5,7 @@ package terraform import ( "fmt" + "strings" "github.com/hashicorp/go-uuid" "github.com/hashicorp/terraform/internal/configs/configschema" @@ -170,3 +171,84 @@ func importDataStore(req providers.ImportResourceStateRequest) (resp providers.I } return resp } + +// moveDataStoreResourceState enables moving from the official null_resource +// managed resource to the terraform_data managed resource. +func moveDataStoreResourceState(req providers.MoveResourceStateRequest) (resp providers.MoveResourceStateResponse) { + // Verify that the source provider is an official hashicorp/null provider, + // but ignore the hostname for mirrors. + if !strings.HasSuffix(req.SourceProviderAddress, "hashicorp/null") { + diag := tfdiags.Sourceless( + tfdiags.Error, + "Unsupported source provider for move operation", + "Only moving from the official hashicorp/null provider to terraform_data is supported.", + ) + resp.Diagnostics = resp.Diagnostics.Append(diag) + + return resp + } + + // Verify that the source resource type name is null_resource. + if req.SourceTypeName != "null_resource" { + diag := tfdiags.Sourceless( + tfdiags.Error, + "Unsupported source resource type for move operation", + "Only moving from the null_resource managed resource to terraform_data is supported.", + ) + resp.Diagnostics = resp.Diagnostics.Append(diag) + + return resp + } + + nullResourceSchemaType := nullResourceSchema().Block.ImpliedType() + nullResourceValue, err := ctyjson.Unmarshal(req.SourceStateJSON, nullResourceSchemaType) + + if err != nil { + resp.Diagnostics = resp.Diagnostics.Append(err) + + return resp + } + + triggersReplace := nullResourceValue.GetAttr("triggers") + + // PlanResourceChange uses RawEquals comparison, which will show a + // difference between cty.NullVal(cty.Map(cty.String)) and + // cty.NullVal(cty.DynamicPseudoType). + if triggersReplace.IsNull() { + triggersReplace = cty.NullVal(cty.DynamicPseudoType) + } else { + // PlanResourceChange uses RawEquals comparison, which will show a + // difference between cty.MapVal(...) and cty.ObjectVal(...). Given that + // triggers is typically configured using direct configuration syntax of + // {...}, which is a cty.ObjectVal, over a map typed variable or + // explicitly type converted map, this pragmatically chooses to convert + // the triggers value to cty.ObjectVal to prevent an immediate plan + // difference for the more typical case. + triggersReplace = cty.ObjectVal(triggersReplace.AsValueMap()) + } + + schema := dataStoreResourceSchema() + v := cty.ObjectVal(map[string]cty.Value{ + "id": nullResourceValue.GetAttr("id"), + "triggers_replace": triggersReplace, + }) + + state, err := schema.Block.CoerceValue(v) + + // null_resource did not use private state, so it is unnecessary to move. + resp.Diagnostics = resp.Diagnostics.Append(err) + resp.TargetState = state + + return resp +} + +func nullResourceSchema() providers.Schema { + return providers.Schema{ + Block: &configschema.Block{ + Attributes: map[string]*configschema.Attribute{ + "id": {Type: cty.String, Computed: true}, + "triggers": {Type: cty.Map(cty.String), Optional: true}, + }, + }, + } +} diff --git a/internal/builtin/providers/terraform/resource_data_test.go b/internal/builtin/providers/terraform/resource_data_test.go index 5bd9935111..4b52bb524f 100644 --- a/internal/builtin/providers/terraform/resource_data_test.go +++ b/internal/builtin/providers/terraform/resource_data_test.go @@ -383,3 +383,108 @@ func TestManagedDataApply(t *testing.T) { }) } } + +func TestMoveDataStoreResourceState_Id(t *testing.T) { + t.Parallel() + + nullResourceStateValue := cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("test"), + "triggers": cty.NullVal(cty.Map(cty.String)), + }) + nullResourceStateJSON, err := ctyjson.Marshal(nullResourceStateValue, nullResourceStateValue.Type()) + + if err != nil { + t.Fatalf("failed to marshal null resource state: %s", err) + } + + req := providers.MoveResourceStateRequest{ + SourceProviderAddress: "registry.terraform.io/hashicorp/null", + SourceStateJSON: nullResourceStateJSON, + SourceTypeName: "null_resource", + TargetTypeName: "terraform_data", + } + resp := moveDataStoreResourceState(req) + + if resp.Diagnostics.HasErrors() { + t.Errorf("unexpected diagnostics: %s", resp.Diagnostics.Err()) + } + + expectedTargetState := cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("test"), + "input": cty.NullVal(cty.DynamicPseudoType), + "output": cty.NullVal(cty.DynamicPseudoType), + "triggers_replace": cty.NullVal(cty.DynamicPseudoType), + }) + + if !resp.TargetState.RawEquals(expectedTargetState) { + t.Errorf("expected state was:\n%#v\ngot state is:\n%#v\n", expectedTargetState, resp.TargetState) + } +} + +func TestMoveResourceState_SourceProviderAddress(t *testing.T) { + t.Parallel() + + req := providers.MoveResourceStateRequest{ + SourceProviderAddress: "registry.terraform.io/examplecorp/null", + } + resp := moveDataStoreResourceState(req) + + if !resp.Diagnostics.HasErrors() { + t.Fatal("expected diagnostics") + } +} + +func TestMoveResourceState_SourceTypeName(t *testing.T) { + t.Parallel() + + req := providers.MoveResourceStateRequest{ + SourceProviderAddress: "registry.terraform.io/hashicorp/null", + SourceTypeName: "null_data_source", + } + resp := moveDataStoreResourceState(req) + + if !resp.Diagnostics.HasErrors() { + t.Fatal("expected diagnostics") + } +} + +func TestMoveDataStoreResourceState_Triggers(t *testing.T) { + t.Parallel() + + nullResourceStateValue := cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("test"), + "triggers": cty.MapVal(map[string]cty.Value{ + "testkey": cty.StringVal("testvalue"), + }), + }) + nullResourceStateJSON, err := ctyjson.Marshal(nullResourceStateValue, nullResourceStateValue.Type()) + + if err != nil { + t.Fatalf("failed to marshal null resource state: %s", err) + } + + req := providers.MoveResourceStateRequest{ + SourceProviderAddress: "registry.terraform.io/hashicorp/null", + SourceStateJSON: nullResourceStateJSON, + SourceTypeName: "null_resource", + TargetTypeName: "terraform_data", + } + resp := moveDataStoreResourceState(req) + + if resp.Diagnostics.HasErrors() { + t.Errorf("unexpected diagnostics: %s", resp.Diagnostics.Err()) + } + + expectedTargetState := cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("test"), + "input": cty.NullVal(cty.DynamicPseudoType), + "output": cty.NullVal(cty.DynamicPseudoType), + "triggers_replace": cty.ObjectVal(map[string]cty.Value{ + "testkey": cty.StringVal("testvalue"), + }), + }) + + if !resp.TargetState.RawEquals(expectedTargetState) { + t.Errorf("expected state was:\n%#v\ngot state is:\n%#v\n", expectedTargetState, resp.TargetState) + } +} From 43ba8a147c638dd8338e14f4b0c16060a032ff1e Mon Sep 17 00:00:00 2001 From: Brian Flad Date: Thu, 16 May 2024 17:15:19 -0400 Subject: [PATCH 086/161] Update CHANGELOG.md (#35171) --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b35524dd6f..090c760520 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ ENHANCEMENTS: * `terraform test`: Test runs can now pass sensitive values to input variables while preserving their dynamic sensitivity. Previously sensitivity would be preserved only for variables statically declared as being sensitive, using `sensitive = true`. ([#35021](https://github.com/hashicorp/terraform/pull/35021)) * Performance improvement during graph building for configurations with an extremely large number of `resource` blocks. ([#35088](https://github.com/hashicorp/terraform/pull/35088)) * Reduced copying of state to improve performance with larges numbers of resources. [GH-35164] +* `terraform_data`: Enabled `moved` configuration refactoring from the `hashicorp/null` provider `null_resource` managed resource ([#35163](https://github.com/hashicorp/terraform/pull/35163)) BUG FIXES: From a4d19a8d1315851232c017c0673695aeb9b65097 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Mon, 13 May 2024 09:44:31 -0700 Subject: [PATCH 087/161] stackeval: Stack.ProviderByLocalAddr must memoize its results A Provider object owns promises for related work, so we need to make sure we treat these as singletons to ensure that the associated work gets done only once and all callers end up sharing the same result. We've got away with this so far because the "related work" for providers is all deterministic based on the configuration anyway, and so without this we're just inefficient (doing the same work multiple times) rather than incorrect (producing inconsistent results). However, we should preserve the typical contract that objects containing promises are always treated as singletons, because otherwise this inconsistency will be a maintenance hazard for anyone who (reasonably) expects objects of this type to be treated the same as objects of other promise-owning types. --- .../stackruntime/internal/stackeval/stack.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/internal/stacks/stackruntime/internal/stackeval/stack.go b/internal/stacks/stackruntime/internal/stackeval/stack.go index ea0c53bd72..abedfa897d 100644 --- a/internal/stacks/stackruntime/internal/stackeval/stack.go +++ b/internal/stacks/stackruntime/internal/stackeval/stack.go @@ -45,6 +45,7 @@ type Stack struct { stackCalls map[stackaddrs.StackCall]*StackCall outputValues map[stackaddrs.OutputValue]*OutputValue components map[stackaddrs.Component]*Component + providers map[stackaddrs.ProviderConfigRef]*Provider } var _ ExpressionScope = (*Stack)(nil) @@ -286,6 +287,16 @@ func (s *Stack) Component(ctx context.Context, addr stackaddrs.Component) *Compo } func (s *Stack) ProviderByLocalAddr(ctx context.Context, localAddr stackaddrs.ProviderConfigRef) *Provider { + s.mu.Lock() + defer s.mu.Unlock() + + if existing, ok := s.providers[localAddr]; ok { + return existing + } + if s.providers == nil { + s.providers = make(map[stackaddrs.ProviderConfigRef]*Provider) + } + decls := s.ConfigDeclarations(ctx) sourceAddr, ok := decls.RequiredProviders.ProviderForLocalName(localAddr.ProviderLocalName) @@ -313,7 +324,9 @@ func (s *Stack) ProviderByLocalAddr(ctx context.Context, localAddr stackaddrs.Pr return nil } - return newProvider(s.main, configAddr, decl) + provider := newProvider(s.main, configAddr, decl) + s.providers[localAddr] = provider + return provider } func (s *Stack) Provider(ctx context.Context, addr stackaddrs.ProviderConfig) *Provider { From 9448845e911fc51390dbd3d3d8f540b2abe13beb Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Mon, 13 May 2024 09:51:28 -0700 Subject: [PATCH 088/161] stackeval: Improve coverage of namedPromiseReporter impls The "namedPromiseReporter" interface is a helper we use to collect user-friendly names for promises when we need to report a promise self-reference error to the user. We collect names for promises reactively on error, rather than proactively in the normal course of work, because proactively maintaining a suitable data structure for this cross-cutting concern would be both expensive and complicated due to it being a cross-cutting concern. This compromise therefore allows us to pay the cost of walking over all of the promise-owning objects only in the exceptional case where we need to report a self-reference error, but it does come at the expense of it being possible for us to forget to implement this interface for certain types and thus be unable to name a subset of the affected promises. This commit implements reportNamedPromises for all promise-owning types that are reachable from a stackeval.Main, although there is a notable gap here where we can't actually report promises from the individual instances of a multi-instance object (e.g. a component) because the promising API doesn't let us peek into a promising.Once to see if it's resolved without blocking until it becomes resolved. There are FIXME comments for that limitation in all of the places where it's relevant, and so hopefully in a future commit we'll devise a suitable way to perform a fallible non-blocking peek of a promise so that we can report promises nested in its result only if they are already present. --- .../internal/stackeval/component.go | 21 ++ .../internal/stackeval/component_config.go | 6 + .../internal/stackeval/component_instance.go | 5 + .../internal/stackeval/diagnostics_test.go | 179 ++++++++++++++++++ .../internal/stackeval/input_variable.go | 8 + .../stackruntime/internal/stackeval/main.go | 6 + .../internal/stackeval/output_value.go | 8 + .../internal/stackeval/provider.go | 21 ++ .../internal/stackeval/provider_config.go | 5 + .../internal/stackeval/provider_instance.go | 12 ++ .../internal/stackeval/provider_type.go | 5 + .../stackruntime/internal/stackeval/stack.go | 26 +++ .../internal/stackeval/stack_call.go | 21 ++ .../internal/stackeval/stack_call_instance.go | 6 + .../internal/stackeval/stack_config.go | 6 + .../child/named_promises_child.tfstack.hcl | 11 ++ .../planning/named_promises/named_promises.tf | 13 ++ .../named_promises/named_promises.tfstack.hcl | 35 ++++ 18 files changed, 394 insertions(+) create mode 100644 internal/stacks/stackruntime/internal/stackeval/diagnostics_test.go create mode 100644 internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/named_promises/child/named_promises_child.tfstack.hcl create mode 100644 internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/named_promises/named_promises.tf create mode 100644 internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/named_promises/named_promises.tfstack.hcl diff --git a/internal/stacks/stackruntime/internal/stackeval/component.go b/internal/stacks/stackruntime/internal/stackeval/component.go index 7906ba71e8..c24f1face0 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component.go +++ b/internal/stacks/stackruntime/internal/stackeval/component.go @@ -347,3 +347,24 @@ func (c *Component) ApplySuccessful(ctx context.Context) bool { func (c *Component) tracingName() string { return c.Addr().String() } + +// reportNamedPromises implements namedPromiseReporter. +func (c *Component) reportNamedPromises(cb func(id promising.PromiseID, name string)) { + name := c.Addr().String() + instsName := name + " instances" + forEachName := name + " for_each" + c.instances.Each(func(ep EvalPhase, o *promising.Once[withDiagnostics[map[addrs.InstanceKey]*ComponentInstance]]) { + cb(o.PromiseID(), instsName) + }) + // FIXME: We should call reportNamedPromises on the individual + // ComponentInstance objects too, but promising.Once doesn't allow us + // to peek to see if the Once was already resolved without blocking on + // it, and we don't want to block on any promises in here. + // Without this, any promises belonging to the individual instances will + // not be named in a self-dependency error report, but since references + // to component instances are always indirect through the component this + // shouldn't be a big deal in most cases. + c.forEachValue.Each(func(ep EvalPhase, o *promising.Once[withDiagnostics[cty.Value]]) { + cb(o.PromiseID(), forEachName) + }) +} diff --git a/internal/stacks/stackruntime/internal/stackeval/component_config.go b/internal/stacks/stackruntime/internal/stackeval/component_config.go index d717a38c4b..b4ddf8f46e 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_config.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_config.go @@ -531,6 +531,12 @@ func (c *ComponentConfig) tracingName() string { return c.Addr().String() } +// reportNamedPromises implements namedPromiseReporter. +func (c *ComponentConfig) reportNamedPromises(cb func(id promising.PromiseID, name string)) { + cb(c.validate.PromiseID(), c.Addr().String()) + cb(c.moduleTree.PromiseID(), c.Addr().String()+" modules") +} + // sourceBundleModuleWalker is an implementation of [configs.ModuleWalker] // that loads all modules from a single source bundle. type sourceBundleModuleWalker struct { diff --git a/internal/stacks/stackruntime/internal/stackeval/component_instance.go b/internal/stacks/stackruntime/internal/stackeval/component_instance.go index b4eba207ba..b513129497 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_instance.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_instance.go @@ -1488,3 +1488,8 @@ func (c *ComponentInstance) resourceTypeSchema(ctx context.Context, providerType func (c *ComponentInstance) tracingName() string { return c.Addr().String() } + +// reportNamedPromises implements namedPromiseReporter. +func (c *ComponentInstance) reportNamedPromises(cb func(id promising.PromiseID, name string)) { + cb(c.moduleTreePlan.PromiseID(), c.Addr().String()+" plan") +} diff --git a/internal/stacks/stackruntime/internal/stackeval/diagnostics_test.go b/internal/stacks/stackruntime/internal/stackeval/diagnostics_test.go new file mode 100644 index 0000000000..d9bc3b9778 --- /dev/null +++ b/internal/stacks/stackruntime/internal/stackeval/diagnostics_test.go @@ -0,0 +1,179 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: BUSL-1.1 + +package stackeval + +import ( + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/zclconf/go-cty/cty" + + "github.com/hashicorp/terraform/internal/addrs" + "github.com/hashicorp/terraform/internal/collections" + "github.com/hashicorp/terraform/internal/configs/configschema" + "github.com/hashicorp/terraform/internal/plans" + "github.com/hashicorp/terraform/internal/promising" + "github.com/hashicorp/terraform/internal/providers" + providertest "github.com/hashicorp/terraform/internal/providers/testing" + "github.com/hashicorp/terraform/internal/stacks/stackaddrs" + "github.com/hashicorp/terraform/internal/stacks/stackstate" + "github.com/hashicorp/terraform/internal/tfdiags" +) + +func TestNamedPromisesPlan(t *testing.T) { + // The goal of this test is to make sure we retain namedPromiseReporter + // coverage over various important object types, so that we don't + // accidentally regress the quality of self-reference ("dependency cycle") + // errors under future maintenence. + // + // It isn't totally comprehensive over all implementations of + // namedPromiseReporter, but we do aim to cover the main cases that a + // typical stack configuration might hit. + // + // This is intentionally a test of the namedPromiseReporter implementations + // directly, rather than of the dependency-message-building logic built + // in terms of it, because the goal is for namedPromiseReporter to return + // everything and then the diagnostic reporter to cherry-pick only the + // subset of names it needs, and because this way we can get more test + // coverage without needing fixtures for every possible combination of + // self-references. + + cfg := testStackConfig(t, "planning", "named_promises") + + main := NewForPlanning(cfg, stackstate.NewState(), PlanOpts{ + PlanningMode: plans.NormalMode, + InputVariableValues: map[stackaddrs.InputVariable]ExternalInputValue{ + {Name: "in"}: ExternalInputValue{ + Value: cty.StringVal("hello"), + }, + }, + ProviderFactories: ProviderFactories{ + addrs.MustParseProviderSourceString("example.com/test/happycloud"): providers.FactoryFixed( + &providertest.MockProvider{ + GetProviderSchemaResponse: &providers.GetProviderSchemaResponse{ + Provider: providers.Schema{ + Block: &configschema.Block{}, + }, + ResourceTypes: map[string]providers.Schema{ + "happycloud_thingy": providers.Schema{ + Block: &configschema.Block{}, + }, + }, + }, + }, + ), + }, + }) + + // We don't actually really care about the plan here. We just want the + // side-effect of getting a bunch of promises created inside "main", which + // we'll then ask about below. + _, diags := testPlan(t, main) + assertNoDiagnostics(t, diags) + + wantNames := collections.NewSetCmp[string]( + // Component-related + `component.foo`, + `component.foo modules`, + `component.foo for_each`, + `component.foo instances`, + + // Nested-stack-related + `stack.child collected outputs`, + `stack.child inputs`, + `stack.child for_each`, + `stack.child instances`, + + // Provider-related + `example.com/test/happycloud schema`, + `provider["example.com/test/happycloud"].main`, + `provider["example.com/test/happycloud"].main for_each`, + `provider["example.com/test/happycloud"].main instances`, + + // Output-value-related + `output.out value`, + `stack.child.output.out value`, + `output.out`, + `stack.child.output.out`, + + // Input-variable-related + `var.in`, + `stack.child.var.in`, + ) + gotNames := collections.NewSetCmp[string]() + ids := map[string]promising.PromiseID{} + main.reportNamedPromises(func(id promising.PromiseID, name string) { + gotNames.Add(name) + // We'll also remember the id associated with each name so that + // we can test the diagnostic message rendering below. + ids[name] = id + // NOTE: Some of the names get reused across both a config object + // and its associated dynamic object when there are no dynamic + // instance keys involved, and for those it's unspecified which + // promise ID will "win", but that's fine for our purposes here + // because we're only testing that some specific names get + // included into the error messages and so it doesn't matter which + // of the promise ids we use to achieve that. + }) + + if diff := cmp.Diff(wantNames, gotNames, collections.CmpOptions); diff != "" { + // If you're here because you've seen a failure where some of the + // wanted names seem to have vanished, and you weren't intentionally + // trying to remove them, check to make sure that the type that was + // supposed to report that name is still reachable indirectly from the + // Main.reportNamedPromises implementation. + t.Errorf("wrong promise names\n%s", diff) + } + + // Since we're now holding all of the information required, let's also + // test that we can render some self-dependency diagnostic messages. + t.Run("diagnostics", func(t *testing.T) { + // For this we need to choose some specific promise ids to report. + // It doesn't matter which ones we use but we can only proceed if + // they were ones detected by the reportNamedPromises call earlier. + providerSchemaPromise := ids[`example.com/test/happycloud schema`] + stackCallInstancesPromise := ids[`stack.child instances`] + if providerSchemaPromise == promising.NoPromise || stackCallInstancesPromise == promising.NoPromise { + t.Fatalf("don't have the promise ids required to test diagnostic rendering") + } + + t.Run("just one", func(t *testing.T) { + err := promising.ErrSelfDependent{stackCallInstancesPromise} + diag := taskSelfDependencyDiagnostic{ + err: err, + root: main, + } + got := diag.Description() + want := tfdiags.Description{ + Summary: `Self-dependent item in configuration`, + Detail: `The item "stack.child instances" depends on its own results, so there is no correct order of operations.`, + } + if diff := cmp.Diff(want, got); diff != "" { + t.Errorf("wrong diagnostic description\n%s", diff) + } + }) + t.Run("multiple", func(t *testing.T) { + err := promising.ErrSelfDependent{ + providerSchemaPromise, + stackCallInstancesPromise, + } + diag := taskSelfDependencyDiagnostic{ + err: err, + root: main, + } + got := diag.Description() + want := tfdiags.Description{ + Summary: `Self-dependent items in configuration`, + Detail: `The following items in your configuration form a circular dependency chain through their references: + - example.com/test/happycloud schema + - stack.child instances + +Terraform uses references to decide a suitable order for performing operations, so configuration items may not refer to their own results either directly or indirectly.`, + } + if diff := cmp.Diff(want, got); diff != "" { + t.Errorf("wrong diagnostic description\n%s", diff) + } + }) + }) +} diff --git a/internal/stacks/stackruntime/internal/stackeval/input_variable.go b/internal/stacks/stackruntime/internal/stackeval/input_variable.go index da9c6a4596..7c66cf5648 100644 --- a/internal/stacks/stackruntime/internal/stackeval/input_variable.go +++ b/internal/stacks/stackruntime/internal/stackeval/input_variable.go @@ -259,6 +259,14 @@ func (v *InputVariable) tracingName() string { return v.Addr().String() } +// reportNamedPromises implements namedPromiseReporter. +func (v *InputVariable) reportNamedPromises(cb func(id promising.PromiseID, name string)) { + name := v.Addr().String() + v.value.Each(func(ep EvalPhase, o *promising.Once[withDiagnostics[cty.Value]]) { + cb(o.PromiseID(), name) + }) +} + // ExternalInputValue represents the value of an input variable provided // from outside the stack configuration. type ExternalInputValue struct { diff --git a/internal/stacks/stackruntime/internal/stackeval/main.go b/internal/stacks/stackruntime/internal/stackeval/main.go index bd10ae6ff3..4aab455a81 100644 --- a/internal/stacks/stackruntime/internal/stackeval/main.go +++ b/internal/stacks/stackruntime/internal/stackeval/main.go @@ -596,6 +596,12 @@ func (m *Main) reportNamedPromises(cb func(id promising.PromiseID, name string)) if m.mainStackConfig != nil { m.mainStackConfig.reportNamedPromises(cb) } + if m.mainStack != nil { + m.mainStack.reportNamedPromises(cb) + } + for _, pty := range m.providerTypes { + pty.reportNamedPromises(cb) + } } // availableProvisioners returns the table of provisioner factories that should diff --git a/internal/stacks/stackruntime/internal/stackeval/output_value.go b/internal/stacks/stackruntime/internal/stackeval/output_value.go index fd3978d499..d7ff6a6819 100644 --- a/internal/stacks/stackruntime/internal/stackeval/output_value.go +++ b/internal/stacks/stackruntime/internal/stackeval/output_value.go @@ -190,3 +190,11 @@ func (v *OutputValue) CheckApply(ctx context.Context) ([]stackstate.AppliedChang func (v *OutputValue) tracingName() string { return v.Addr().String() } + +// reportNamedPromises implements namedPromiseReporter. +func (v *OutputValue) reportNamedPromises(cb func(id promising.PromiseID, name string)) { + name := v.Addr().String() + v.resultValue.Each(func(ep EvalPhase, o *promising.Once[withDiagnostics[cty.Value]]) { + cb(o.PromiseID(), name) + }) +} diff --git a/internal/stacks/stackruntime/internal/stackeval/provider.go b/internal/stacks/stackruntime/internal/stackeval/provider.go index c5c9990829..59a29ea468 100644 --- a/internal/stacks/stackruntime/internal/stackeval/provider.go +++ b/internal/stacks/stackruntime/internal/stackeval/provider.go @@ -273,3 +273,24 @@ func (p *Provider) CheckApply(ctx context.Context) ([]stackstate.AppliedChange, func (p *Provider) tracingName() string { return p.Addr().String() } + +// reportNamedPromises implements namedPromiseReporter. +func (p *Provider) reportNamedPromises(cb func(id promising.PromiseID, name string)) { + name := p.Addr().String() + forEachName := name + " for_each" + instsName := name + " instances" + p.forEachValue.Each(func(ep EvalPhase, o *promising.Once[withDiagnostics[cty.Value]]) { + cb(o.PromiseID(), forEachName) + }) + p.instances.Each(func(ep EvalPhase, o *promising.Once[withDiagnostics[map[addrs.InstanceKey]*ProviderInstance]]) { + cb(o.PromiseID(), instsName) + }) + // FIXME: We should call reportNamedPromises on the individual + // ProviderInstance objects too, but promising.Once doesn't allow us + // to peek to see if the Once was already resolved without blocking on + // it, and we don't want to block on any promises in here. + // Without this, any promises belonging to the individual instances will + // not be named in a self-dependency error report, but since references + // to provider instances are always indirect through the provider this + // shouldn't be a big deal in most cases. +} diff --git a/internal/stacks/stackruntime/internal/stackeval/provider_config.go b/internal/stacks/stackruntime/internal/stackeval/provider_config.go index 611d98e2d1..2b4edaf843 100644 --- a/internal/stacks/stackruntime/internal/stackeval/provider_config.go +++ b/internal/stacks/stackruntime/internal/stackeval/provider_config.go @@ -224,3 +224,8 @@ func (p *ProviderConfig) PlanChanges(ctx context.Context) ([]stackplan.PlannedCh func (p *ProviderConfig) tracingName() string { return p.Addr().String() } + +// reportNamedPromises implements namedPromiseReporter. +func (p *ProviderConfig) reportNamedPromises(cb func(id promising.PromiseID, name string)) { + cb(p.providerArgs.PromiseID(), p.Addr().String()) +} diff --git a/internal/stacks/stackruntime/internal/stackeval/provider_instance.go b/internal/stacks/stackruntime/internal/stackeval/provider_instance.go index 6e1ddcf3b5..acd2508644 100644 --- a/internal/stacks/stackruntime/internal/stackeval/provider_instance.go +++ b/internal/stacks/stackruntime/internal/stackeval/provider_instance.go @@ -308,6 +308,18 @@ func (p *ProviderInstance) tracingName() string { return p.Addr().String() } +// reportNamedPromises implements namedPromiseReporter. +func (p *ProviderInstance) reportNamedPromises(cb func(id promising.PromiseID, name string)) { + name := p.Addr().String() + clientName := name + " plugin client" + p.providerArgs.Each(func(ep EvalPhase, o *promising.Once[withDiagnostics[cty.Value]]) { + cb(o.PromiseID(), name) + }) + p.client.Each(func(ep EvalPhase, o *promising.Once[withDiagnostics[providers.Interface]]) { + cb(o.PromiseID(), clientName) + }) +} + // stubConfiguredProvider is a placeholder provider used when ConfigureProvider // on a real provider fails, so that callers can still receieve a usable client // that will just produce placeholder values from its operations. diff --git a/internal/stacks/stackruntime/internal/stackeval/provider_type.go b/internal/stacks/stackruntime/internal/stackeval/provider_type.go index a3f83c2561..4f4c15ee20 100644 --- a/internal/stacks/stackruntime/internal/stackeval/provider_type.go +++ b/internal/stacks/stackruntime/internal/stackeval/provider_type.go @@ -70,3 +70,8 @@ func (pt *ProviderType) Schema(ctx context.Context) (providers.GetProviderSchema return ret, nil }) } + +// reportNamedPromises implements namedPromiseReporter. +func (pt *ProviderType) reportNamedPromises(cb func(id promising.PromiseID, name string)) { + cb(pt.schema.PromiseID(), pt.Addr().String()+" schema") +} diff --git a/internal/stacks/stackruntime/internal/stackeval/stack.go b/internal/stacks/stackruntime/internal/stackeval/stack.go index abedfa897d..5cacadff21 100644 --- a/internal/stacks/stackruntime/internal/stackeval/stack.go +++ b/internal/stacks/stackruntime/internal/stackeval/stack.go @@ -16,6 +16,7 @@ import ( "github.com/hashicorp/terraform/internal/instances" "github.com/hashicorp/terraform/internal/lang/marks" "github.com/hashicorp/terraform/internal/plans" + "github.com/hashicorp/terraform/internal/promising" "github.com/hashicorp/terraform/internal/stacks/stackaddrs" "github.com/hashicorp/terraform/internal/stacks/stackconfig" "github.com/hashicorp/terraform/internal/stacks/stackconfig/typeexpr" @@ -640,3 +641,28 @@ func (s *Stack) tracingName() string { } return addr.String() } + +// reportNamedPromises implements namedPromiseReporter. +func (s *Stack) reportNamedPromises(cb func(id promising.PromiseID, name string)) { + s.mu.Lock() + defer s.mu.Unlock() + + for _, child := range s.childStacks { + child.reportNamedPromises(cb) + } + for _, child := range s.inputVariables { + child.reportNamedPromises(cb) + } + for _, child := range s.outputValues { + child.reportNamedPromises(cb) + } + for _, child := range s.stackCalls { + child.reportNamedPromises(cb) + } + for _, child := range s.components { + child.reportNamedPromises(cb) + } + for _, child := range s.providers { + child.reportNamedPromises(cb) + } +} diff --git a/internal/stacks/stackruntime/internal/stackeval/stack_call.go b/internal/stacks/stackruntime/internal/stackeval/stack_call.go index e2eb7bd6d3..3d914741b1 100644 --- a/internal/stacks/stackruntime/internal/stackeval/stack_call.go +++ b/internal/stacks/stackruntime/internal/stackeval/stack_call.go @@ -269,3 +269,24 @@ func (c *StackCall) CheckApply(ctx context.Context) ([]stackstate.AppliedChange, func (c *StackCall) tracingName() string { return c.Addr().String() } + +// reportNamedPromises implements namedPromiseReporter. +func (c *StackCall) reportNamedPromises(cb func(id promising.PromiseID, name string)) { + name := c.Addr().String() + instsName := name + " instances" + forEachName := name + " for_each" + c.instances.Each(func(ep EvalPhase, o *promising.Once[withDiagnostics[map[addrs.InstanceKey]*StackCallInstance]]) { + cb(o.PromiseID(), instsName) + }) + // FIXME: We should call reportNamedPromises on the individual + // StackCallInstance objects too, but promising.Once doesn't allow us + // to peek to see if the Once was already resolved without blocking on + // it, and we don't want to block on any promises in here. + // Without this, any promises belonging to the individual instances will + // not be named in a self-dependency error report, but since references + // to stack call instances are always indirect through the stack call this + // shouldn't be a big deal in most cases. + c.forEachValue.Each(func(ep EvalPhase, o *promising.Once[withDiagnostics[cty.Value]]) { + cb(o.PromiseID(), forEachName) + }) +} diff --git a/internal/stacks/stackruntime/internal/stackeval/stack_call_instance.go b/internal/stacks/stackruntime/internal/stackeval/stack_call_instance.go index 9f8d000091..9d56e4e6dc 100644 --- a/internal/stacks/stackruntime/internal/stackeval/stack_call_instance.go +++ b/internal/stacks/stackruntime/internal/stackeval/stack_call_instance.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/collections" "github.com/hashicorp/terraform/internal/instances" + "github.com/hashicorp/terraform/internal/promising" "github.com/hashicorp/terraform/internal/stacks/stackaddrs" "github.com/hashicorp/terraform/internal/stacks/stackplan" "github.com/hashicorp/terraform/internal/stacks/stackstate" @@ -204,3 +205,8 @@ func (c *StackCallInstance) CheckApply(ctx context.Context) ([]stackstate.Applie func (c *StackCallInstance) tracingName() string { return fmt.Sprintf("%s call", c.CalledStackAddr()) } + +// reportNamedPromises implements namedPromiseReporter. +func (c *StackCallInstance) reportNamedPromises(cb func(id promising.PromiseID, name string)) { + // StackCallInstance does not currently own any promises +} diff --git a/internal/stacks/stackruntime/internal/stackeval/stack_config.go b/internal/stacks/stackruntime/internal/stackeval/stack_config.go index e170868fb4..3f7324e9d3 100644 --- a/internal/stacks/stackruntime/internal/stackeval/stack_config.go +++ b/internal/stacks/stackruntime/internal/stackeval/stack_config.go @@ -528,4 +528,10 @@ func (s *StackConfig) reportNamedPromises(cb func(id promising.PromiseID, name s for _, child := range s.stackCalls { child.reportNamedPromises(cb) } + for _, child := range s.components { + child.reportNamedPromises(cb) + } + for _, child := range s.providers { + child.reportNamedPromises(cb) + } } diff --git a/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/named_promises/child/named_promises_child.tfstack.hcl b/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/named_promises/child/named_promises_child.tfstack.hcl new file mode 100644 index 0000000000..8da88fe3a2 --- /dev/null +++ b/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/named_promises/child/named_promises_child.tfstack.hcl @@ -0,0 +1,11 @@ +# This is a very minimal stack configuration just to give us something to +# call as a nested stack in the parent stack configuration. + +variable "in" { + type = string +} + +output "out" { + type = string + value = var.in +} diff --git a/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/named_promises/named_promises.tf b/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/named_promises/named_promises.tf new file mode 100644 index 0000000000..d54b6cb567 --- /dev/null +++ b/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/named_promises/named_promises.tf @@ -0,0 +1,13 @@ +# This is an intentionally-minimal module just to give us something to +# point a component block at. + +terraform { + required_providers { + happycloud = { + source = "example.com/test/happycloud" + } + } +} + +resource "happycloud_thingy" "foo" { +} diff --git a/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/named_promises/named_promises.tfstack.hcl b/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/named_promises/named_promises.tfstack.hcl new file mode 100644 index 0000000000..11cc036709 --- /dev/null +++ b/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/named_promises/named_promises.tfstack.hcl @@ -0,0 +1,35 @@ + +required_providers { + happycloud = { + source = "example.com/test/happycloud" + version = "1.0.0" + } +} + +variable "in" { + type = string +} + +provider "happycloud" "main" { +} + +stack "child" { + source = "./child" + + inputs = { + in = var.in + } +} + +component "foo" { + source = "./" + + providers = { + happycloud = provider.happycloud.main + } +} + +output "out" { + type = string + value = var.in +} From a72d02135bd33d6d581d6e0df6e15882c26e8d20 Mon Sep 17 00:00:00 2001 From: Sebastian Rivera Date: Thu, 16 May 2024 18:53:30 -0400 Subject: [PATCH 089/161] Define StatePersistInterval as command meta field --- internal/backend/backendrun/operation.go | 11 ++++++----- internal/backend/local/backend_apply.go | 21 +-------------------- internal/command/apply.go | 1 + internal/command/command.go | 4 ++++ internal/command/meta.go | 22 ++++++++++++++++++++++ 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/internal/backend/backendrun/operation.go b/internal/backend/backendrun/operation.go index 3ce59a9f4f..10ec63e64c 100644 --- a/internal/backend/backendrun/operation.go +++ b/internal/backend/backendrun/operation.go @@ -108,11 +108,12 @@ type Operation struct { // The options below are more self-explanatory and affect the runtime // behavior of the operation. - PlanMode plans.Mode - AutoApprove bool - Targets []addrs.Targetable - ForceReplace []addrs.AbsResourceInstance - Variables map[string]UnparsedVariableValue + PlanMode plans.Mode + AutoApprove bool + Targets []addrs.Targetable + ForceReplace []addrs.AbsResourceInstance + Variables map[string]UnparsedVariableValue + StatePersistInterval int // Some operations use root module variables only opportunistically or // don't need them at all. If this flag is set, the backend must treat diff --git a/internal/backend/local/backend_apply.go b/internal/backend/local/backend_apply.go index c101d5bd4a..2d8c6ec62b 100644 --- a/internal/backend/local/backend_apply.go +++ b/internal/backend/local/backend_apply.go @@ -8,8 +8,6 @@ import ( "errors" "fmt" "log" - "os" - "strconv" "time" "github.com/hashicorp/terraform/internal/addrs" @@ -27,22 +25,6 @@ import ( // test hook called between plan+apply during opApply var testHookStopPlanApply func() -var ( - defaultPersistInterval = 20 // arbitrary interval that's hopefully a sweet spot - persistIntervalEnvironmentVariableName = "TF_BACKEND_PERSIST_INTERVAL_SECONDS" -) - -func getEnvAsInt(envName string, defaultValue int) int { - if val, exists := os.LookupEnv(envName); exists { - parsedVal, err := strconv.Atoi(val) - if err == nil { - return parsedVal - } - log.Printf("[ERROR] Can't parse value '%s' of environment variable '%s'", val, envName) - } - return defaultValue -} - func (b *Local) opApply( stopCtx context.Context, cancelCtx context.Context, @@ -100,8 +82,7 @@ func (b *Local) opApply( // stateHook uses schemas for when it periodically persists state to the // persistent storage backend. stateHook.Schemas = schemas - persistInterval := getEnvAsInt(persistIntervalEnvironmentVariableName, defaultPersistInterval) - stateHook.PersistInterval = time.Duration(persistInterval) * time.Second + stateHook.PersistInterval = time.Duration(op.StatePersistInterval) * time.Second var plan *plans.Plan // If we weren't given a plan, then we refresh/plan diff --git a/internal/command/apply.go b/internal/command/apply.go index 1223e3d3b4..d9b412f90c 100644 --- a/internal/command/apply.go +++ b/internal/command/apply.go @@ -283,6 +283,7 @@ func (c *ApplyCommand) OperationRequest( opReq.ForceReplace = args.ForceReplace opReq.Type = backendrun.OperationTypeApply opReq.View = view.Operation() + opReq.StatePersistInterval = c.Meta.StatePersistInterval() // EXPERIMENTAL: maybe enable deferred actions if c.AllowExperimentalFeatures { diff --git a/internal/command/command.go b/internal/command/command.go index 5181f8bec8..cc277d1a65 100644 --- a/internal/command/command.go +++ b/internal/command/command.go @@ -30,6 +30,10 @@ const DefaultPluginVendorDir = "terraform.d/plugins/" + pluginMachineName // DefaultStateFilename is the default filename used for the state file. const DefaultStateFilename = "terraform.tfstate" +// DefaultStatePersistInterval is the default interval a backend should persist +// Terraform state, if applicable. Backends can set their own custom defaults. +const DefaultStatePersistInterval = 20 + // DefaultVarsFilename is the default filename used for vars const DefaultVarsFilename = "terraform.tfvars" diff --git a/internal/command/meta.go b/internal/command/meta.go index c9dd11a71d..5fc63223ff 100644 --- a/internal/command/meta.go +++ b/internal/command/meta.go @@ -736,6 +736,28 @@ func (m *Meta) showDiagnostics(vals ...interface{}) { } } +const ( + // StatePersistIntervalEnvVar is the environment variable that can be set + // to control the interval at which Terraform persists state. The interval + // itself defaults to 20 seconds. + StatePersistIntervalEnvVar = "TF_STATE_PERSIST_INTERVAL" +) + +// StatePersistInterval returns the configured interval that Terraform should +// persist statefiles to the desired backend. Backends may choose to override +// the default value. +func (m *Meta) StatePersistInterval() int { + if val, ok := os.LookupEnv(StatePersistIntervalEnvVar); ok { + if interval, err := strconv.Atoi(val); err == nil && interval > DefaultStatePersistInterval { + // The user-specified interval must be greater than the default minimum + return interval + } else if err != nil { + log.Printf("[ERROR] Can't parse state persist interval %q of environment variable %q", val, StatePersistIntervalEnvVar) + } + } + return DefaultStatePersistInterval +} + // WorkspaceNameEnvVar is the name of the environment variable that can be used // to set the name of the Terraform workspace, overriding the workspace chosen // by `terraform workspace select`. From 52c7dfceb4466dba89ef01205b880ab3994ff7d0 Mon Sep 17 00:00:00 2001 From: Sebastian Rivera Date: Fri, 17 May 2024 11:58:58 -0400 Subject: [PATCH 090/161] Add unit tests for state persist interval env var --- internal/command/meta_test.go | 54 +++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/internal/command/meta_test.go b/internal/command/meta_test.go index b75b864164..4b448f77a7 100644 --- a/internal/command/meta_test.go +++ b/internal/command/meta_test.go @@ -219,6 +219,60 @@ func TestMeta_Env(t *testing.T) { } } +func TestMeta_StatePersistInterval(t *testing.T) { + m := new(Meta) + t.Run("when the env var is not defined", func(t *testing.T) { + interval := m.StatePersistInterval() + if interval != DefaultStatePersistInterval { + t.Fatalf("expected state persist interval to be %d, got: %d", DefaultStatePersistInterval, interval) + } + }) + t.Run("with valid interval greater than the default", func(t *testing.T) { + os.Setenv(StatePersistIntervalEnvVar, "25") + t.Cleanup(func() { + os.Unsetenv(StatePersistIntervalEnvVar) + }) + + interval := m.StatePersistInterval() + if interval != 25 { + t.Fatalf("expected state persist interval to be 25, got: %d", interval) + } + }) + t.Run("with a valid interval less than the default", func(t *testing.T) { + os.Setenv(StatePersistIntervalEnvVar, "10") + t.Cleanup(func() { + os.Unsetenv(StatePersistIntervalEnvVar) + }) + + interval := m.StatePersistInterval() + if interval != DefaultStatePersistInterval { + t.Fatalf("expected state persist interval to be %d, got: %d", DefaultStatePersistInterval, interval) + } + }) + t.Run("with invalid integer interval", func(t *testing.T) { + os.Setenv(StatePersistIntervalEnvVar, "foo") + t.Cleanup(func() { + os.Unsetenv(StatePersistIntervalEnvVar) + }) + + interval := m.StatePersistInterval() + if interval != DefaultStatePersistInterval { + t.Fatalf("expected state persist interval to be %d, got: %d", DefaultStatePersistInterval, interval) + } + }) + t.Run("with negative integer interval", func(t *testing.T) { + os.Setenv(StatePersistIntervalEnvVar, "-10") + t.Cleanup(func() { + os.Unsetenv(StatePersistIntervalEnvVar) + }) + + interval := m.StatePersistInterval() + if interval != DefaultStatePersistInterval { + t.Fatalf("expected state persist interval to be %d, got: %d", DefaultStatePersistInterval, interval) + } + }) +} + func TestMeta_Workspace_override(t *testing.T) { defer func(value string) { os.Setenv(WorkspaceNameEnvVar, value) From b28c8bff091c3cb0ee0d88cfcba0713aa892a05b Mon Sep 17 00:00:00 2001 From: Sebastian Rivera Date: Fri, 17 May 2024 14:07:20 -0400 Subject: [PATCH 091/161] Document TF_STATE_PERSIST_INTERVAL usage --- website/docs/cli/config/environment-variables.mdx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/website/docs/cli/config/environment-variables.mdx b/website/docs/cli/config/environment-variables.mdx index 508016e6a7..b60fecbbd4 100644 --- a/website/docs/cli/config/environment-variables.mdx +++ b/website/docs/cli/config/environment-variables.mdx @@ -143,6 +143,14 @@ The default client timeout for requests to the remote registry is 10s. `TF_REGIS export TF_REGISTRY_CLIENT_TIMEOUT=15 ``` +## TF_STATE_PERSIST_INTERVAL + +The interval in seconds that Terraform attempts to persist state to a remote backend during an apply operation. The default minimum interval for all remote backends is 20 seconds. Backends may override the default minimum value. If the value of `TF_STATE_PERSIST_INTERVAL` is lower than the default interval specified by a remote backend, the default interval will be used. + +```shell +export TF_STATE_PERSIST_INTERVAL=100 +``` + ## TF_CLI_CONFIG_FILE The location of the [Terraform CLI configuration file](/terraform/cli/config/config-file). From ee5cda700060b823d319a3d9d78d6c72255273be Mon Sep 17 00:00:00 2001 From: Michael Yocca <19916665+mjyocca@users.noreply.github.com> Date: Fri, 17 May 2024 16:59:17 -0700 Subject: [PATCH 092/161] feat(stacks): add CLI config in RPC API handshake (#35146) Adds support for including fields typically found in the Terraform CLI configuration in the RPC API handshake. This allows us to include global configuration arguments that impact the RPC API session without requiring instrumentation for each RPC service. The new Config struct currently supports only service discovery credentials, but it can be expanded in the future. --- internal/rpcapi/credentials_source.go | 40 + internal/rpcapi/internal_client.go | 5 + internal/rpcapi/plugin.go | 27 +- internal/rpcapi/setup.go | 6 +- internal/rpcapi/telemetry_test.go | 2 +- internal/rpcapi/terraform1/terraform1.pb.go | 4554 ++++++++++--------- internal/rpcapi/terraform1/terraform1.proto | 9 + 7 files changed, 2433 insertions(+), 2210 deletions(-) create mode 100644 internal/rpcapi/credentials_source.go diff --git a/internal/rpcapi/credentials_source.go b/internal/rpcapi/credentials_source.go new file mode 100644 index 0000000000..c57d07f450 --- /dev/null +++ b/internal/rpcapi/credentials_source.go @@ -0,0 +1,40 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: BUSL-1.1 + +package rpcapi + +import ( + svchost "github.com/hashicorp/terraform-svchost" + "github.com/hashicorp/terraform-svchost/auth" + "github.com/zclconf/go-cty/cty" +) + +var _ auth.CredentialsSource = &credentialsSource{} + +type credentialsSource struct { + configured map[svchost.Hostname]cty.Value +} + +func newCredentialsSource() *credentialsSource { + return &credentialsSource{ + configured: map[svchost.Hostname]cty.Value{}, + } +} + +func (c *credentialsSource) ForHost(host svchost.Hostname) (auth.HostCredentials, error) { + v, ok := c.configured[host] + if ok { + return auth.HostCredentialsFromObject(v), nil + } + return nil, nil +} + +func (c *credentialsSource) StoreForHost(host svchost.Hostname, credentials auth.HostCredentialsWritable) error { + c.configured[host] = credentials.ToStore() + return nil +} + +func (c *credentialsSource) ForgetForHost(host svchost.Hostname) error { + delete(c.configured, host) + return nil +} diff --git a/internal/rpcapi/internal_client.go b/internal/rpcapi/internal_client.go index ae11a50525..f3c0fc130f 100644 --- a/internal/rpcapi/internal_client.go +++ b/internal/rpcapi/internal_client.go @@ -117,6 +117,11 @@ func (c *Client) Dependencies() terraform1.DependenciesClient { return terraform1.NewDependenciesClient(c.conn) } +// Packages returns a client for the Packages service of the RPC API. +func (c *Client) Packages() terraform1.PackagesClient { + return terraform1.NewPackagesClient(c.conn) +} + // Stacks returns a client for the Stacks service of the RPC API. func (c *Client) Stacks() terraform1.StacksClient { return terraform1.NewStacksClient(c.conn) diff --git a/internal/rpcapi/plugin.go b/internal/rpcapi/plugin.go index 6d57920022..f567c60152 100644 --- a/internal/rpcapi/plugin.go +++ b/internal/rpcapi/plugin.go @@ -8,6 +8,8 @@ import ( "fmt" "github.com/hashicorp/go-plugin" + svchost "github.com/hashicorp/terraform-svchost" + "github.com/hashicorp/terraform-svchost/auth" "github.com/hashicorp/terraform-svchost/disco" "google.golang.org/grpc" @@ -43,7 +45,7 @@ func registerGRPCServices(s *grpc.Server, opts *serviceOpts) { terraform1.RegisterSetupServer(s, setup) } -func serverHandshake(s *grpc.Server, opts *serviceOpts) func(context.Context, *terraform1.ClientCapabilities) (*terraform1.ServerCapabilities, error) { +func serverHandshake(s *grpc.Server, opts *serviceOpts) func(context.Context, *terraform1.Handshake_Request) (*terraform1.ServerCapabilities, error) { dependencies := dynrpcserver.NewDependenciesStub() terraform1.RegisterDependenciesServer(s, dependencies) stacks := dynrpcserver.NewStacksStub() @@ -51,7 +53,7 @@ func serverHandshake(s *grpc.Server, opts *serviceOpts) func(context.Context, *t packages := dynrpcserver.NewPackagesStub() terraform1.RegisterPackagesServer(s, packages) - return func(ctx context.Context, clientCaps *terraform1.ClientCapabilities) (*terraform1.ServerCapabilities, error) { + return func(ctx context.Context, request *terraform1.Handshake_Request) (*terraform1.ServerCapabilities, error) { // All of our servers will share a common handles table so that objects // can be passed from one service to another. handles := newHandleTable() @@ -66,7 +68,10 @@ func serverHandshake(s *grpc.Server, opts *serviceOpts) func(context.Context, *t // this isn't strictly a "capability") so that the RPC caller has // full control without needing to also tinker with the current user's // CLI configuration. - services := disco.New() + services, err := newServiceDisco(request.GetConfig()) + if err != nil { + return &terraform1.ServerCapabilities{}, err + } // If handshaking is successful (which it currently always is, because // we don't have any special capabilities to negotiate yet) then we @@ -91,3 +96,19 @@ func serverHandshake(s *grpc.Server, opts *serviceOpts) func(context.Context, *t type serviceOpts struct { experimentsAllowed bool } + +func newServiceDisco(config *terraform1.Config) (*disco.Disco, error) { + services := disco.New() + credSrc := newCredentialsSource() + + if config != nil { + for host, cred := range config.GetCredentials() { + if err := credSrc.StoreForHost(svchost.Hostname(host), auth.HostCredentialsToken(cred.Token)); err != nil { + return nil, fmt.Errorf("problem storing credential for host %s with: %w", host, err) + } + } + services.SetCredentialsSource(credSrc) + } + + return services, nil +} diff --git a/internal/rpcapi/setup.go b/internal/rpcapi/setup.go index 9aca7a903c..3f3a771aa8 100644 --- a/internal/rpcapi/setup.go +++ b/internal/rpcapi/setup.go @@ -25,11 +25,11 @@ type setupServer struct { // initOthers is the callback used to perform the capability negotiation // step and initialize all of the other API services based on what was // negotiated. - initOthers func(context.Context, *terraform1.ClientCapabilities) (*terraform1.ServerCapabilities, error) + initOthers func(context.Context, *terraform1.Handshake_Request) (*terraform1.ServerCapabilities, error) mu sync.Mutex } -func newSetupServer(initOthers func(context.Context, *terraform1.ClientCapabilities) (*terraform1.ServerCapabilities, error)) terraform1.SetupServer { +func newSetupServer(initOthers func(context.Context, *terraform1.Handshake_Request) (*terraform1.ServerCapabilities, error)) terraform1.SetupServer { return &setupServer{ initOthers: initOthers, } @@ -47,7 +47,7 @@ func (s *setupServer) Handshake(ctx context.Context, req *terraform1.Handshake_R var err error { ctx, span := tracer.Start(ctx, "initialize RPC services") - serverCaps, err = s.initOthers(ctx, req.Capabilities) + serverCaps, err = s.initOthers(ctx, req) span.End() } s.initOthers = nil // cannot handshake again diff --git a/internal/rpcapi/telemetry_test.go b/internal/rpcapi/telemetry_test.go index fa67944c52..4d07b827e8 100644 --- a/internal/rpcapi/telemetry_test.go +++ b/internal/rpcapi/telemetry_test.go @@ -225,7 +225,7 @@ func TestTelemetryInTestsGRPC(t *testing.T) { client, close := grpcClientForTesting(ctx, t, func(srv *grpc.Server) { setup := &setupServer{ - initOthers: func(ctx context.Context, cc *terraform1.ClientCapabilities) (*terraform1.ServerCapabilities, error) { + initOthers: func(ctx context.Context, cc *terraform1.Handshake_Request) (*terraform1.ServerCapabilities, error) { return &terraform1.ServerCapabilities{}, nil }, } diff --git a/internal/rpcapi/terraform1/terraform1.pb.go b/internal/rpcapi/terraform1/terraform1.pb.go index d2b8fc46fb..ccce09029d 100644 --- a/internal/rpcapi/terraform1/terraform1.pb.go +++ b/internal/rpcapi/terraform1/terraform1.pb.go @@ -233,7 +233,7 @@ func (x BuildProviderPluginCache_Event_FetchComplete_AuthResult) Number() protor // Deprecated: Use BuildProviderPluginCache_Event_FetchComplete_AuthResult.Descriptor instead. func (BuildProviderPluginCache_Event_FetchComplete_AuthResult) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{9, 1, 5, 0} + return file_terraform1_proto_rawDescGZIP(), []int{11, 1, 5, 0} } type FindStackConfigurationComponents_Instances int32 @@ -282,7 +282,7 @@ func (x FindStackConfigurationComponents_Instances) Number() protoreflect.EnumNu // Deprecated: Use FindStackConfigurationComponents_Instances.Descriptor instead. func (FindStackConfigurationComponents_Instances) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{20, 0} + return file_terraform1_proto_rawDescGZIP(), []int{22, 0} } type StackChangeProgress_ComponentInstanceStatus_Status int32 @@ -343,7 +343,7 @@ func (x StackChangeProgress_ComponentInstanceStatus_Status) Number() protoreflec // Deprecated: Use StackChangeProgress_ComponentInstanceStatus_Status.Descriptor instead. func (StackChangeProgress_ComponentInstanceStatus_Status) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 0, 0} + return file_terraform1_proto_rawDescGZIP(), []int{37, 0, 0} } type StackChangeProgress_ResourceInstanceStatus_Status int32 @@ -410,7 +410,7 @@ func (x StackChangeProgress_ResourceInstanceStatus_Status) Number() protoreflect // Deprecated: Use StackChangeProgress_ResourceInstanceStatus_Status.Descriptor instead. func (StackChangeProgress_ResourceInstanceStatus_Status) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 1, 0} + return file_terraform1_proto_rawDescGZIP(), []int{37, 1, 0} } type StackChangeProgress_ProvisionerStatus_Status int32 @@ -462,7 +462,7 @@ func (x StackChangeProgress_ProvisionerStatus_Status) Number() protoreflect.Enum // Deprecated: Use StackChangeProgress_ProvisionerStatus_Status.Descriptor instead. func (StackChangeProgress_ProvisionerStatus_Status) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 3, 0} + return file_terraform1_proto_rawDescGZIP(), []int{37, 3, 0} } type Diagnostic_Severity int32 @@ -511,7 +511,7 @@ func (x Diagnostic_Severity) Number() protoreflect.EnumNumber { // Deprecated: Use Diagnostic_Severity.Descriptor instead. func (Diagnostic_Severity) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{36, 0} + return file_terraform1_proto_rawDescGZIP(), []int{38, 0} } type Schema_NestedBlock_NestingMode int32 @@ -569,7 +569,7 @@ func (x Schema_NestedBlock_NestingMode) Number() protoreflect.EnumNumber { // Deprecated: Use Schema_NestedBlock_NestingMode.Descriptor instead. func (Schema_NestedBlock_NestingMode) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{39, 2, 0} + return file_terraform1_proto_rawDescGZIP(), []int{41, 2, 0} } type Schema_Object_NestingMode int32 @@ -624,7 +624,7 @@ func (x Schema_Object_NestingMode) Number() protoreflect.EnumNumber { // Deprecated: Use Schema_Object_NestingMode.Descriptor instead. func (Schema_Object_NestingMode) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{39, 3, 0} + return file_terraform1_proto_rawDescGZIP(), []int{41, 3, 0} } type Schema_DocString_Format int32 @@ -670,7 +670,7 @@ func (x Schema_DocString_Format) Number() protoreflect.EnumNumber { // Deprecated: Use Schema_DocString_Format.Descriptor instead. func (Schema_DocString_Format) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{39, 4, 0} + return file_terraform1_proto_rawDescGZIP(), []int{41, 4, 0} } type Handshake struct { @@ -794,6 +794,100 @@ func (*ServerCapabilities) Descriptor() ([]byte, []int) { return file_terraform1_proto_rawDescGZIP(), []int{2} } +type Config struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Credentials map[string]*HostCredential `protobuf:"bytes,1,rep,name=credentials,proto3" json:"credentials,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Config) Reset() { + *x = Config{} + if protoimpl.UnsafeEnabled { + mi := &file_terraform1_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Config) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Config) ProtoMessage() {} + +func (x *Config) ProtoReflect() protoreflect.Message { + mi := &file_terraform1_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Config.ProtoReflect.Descriptor instead. +func (*Config) Descriptor() ([]byte, []int) { + return file_terraform1_proto_rawDescGZIP(), []int{3} +} + +func (x *Config) GetCredentials() map[string]*HostCredential { + if x != nil { + return x.Credentials + } + return nil +} + +type HostCredential struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` +} + +func (x *HostCredential) Reset() { + *x = HostCredential{} + if protoimpl.UnsafeEnabled { + mi := &file_terraform1_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HostCredential) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HostCredential) ProtoMessage() {} + +func (x *HostCredential) ProtoReflect() protoreflect.Message { + mi := &file_terraform1_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HostCredential.ProtoReflect.Descriptor instead. +func (*HostCredential) Descriptor() ([]byte, []int) { + return file_terraform1_proto_rawDescGZIP(), []int{4} +} + +func (x *HostCredential) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + type OpenSourceBundle struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -803,7 +897,7 @@ type OpenSourceBundle struct { func (x *OpenSourceBundle) Reset() { *x = OpenSourceBundle{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[3] + mi := &file_terraform1_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -816,7 +910,7 @@ func (x *OpenSourceBundle) String() string { func (*OpenSourceBundle) ProtoMessage() {} func (x *OpenSourceBundle) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[3] + mi := &file_terraform1_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -829,7 +923,7 @@ func (x *OpenSourceBundle) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenSourceBundle.ProtoReflect.Descriptor instead. func (*OpenSourceBundle) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{3} + return file_terraform1_proto_rawDescGZIP(), []int{5} } type CloseSourceBundle struct { @@ -841,7 +935,7 @@ type CloseSourceBundle struct { func (x *CloseSourceBundle) Reset() { *x = CloseSourceBundle{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[4] + mi := &file_terraform1_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -854,7 +948,7 @@ func (x *CloseSourceBundle) String() string { func (*CloseSourceBundle) ProtoMessage() {} func (x *CloseSourceBundle) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[4] + mi := &file_terraform1_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -867,7 +961,7 @@ func (x *CloseSourceBundle) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseSourceBundle.ProtoReflect.Descriptor instead. func (*CloseSourceBundle) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{4} + return file_terraform1_proto_rawDescGZIP(), []int{6} } type OpenDependencyLockFile struct { @@ -879,7 +973,7 @@ type OpenDependencyLockFile struct { func (x *OpenDependencyLockFile) Reset() { *x = OpenDependencyLockFile{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[5] + mi := &file_terraform1_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -892,7 +986,7 @@ func (x *OpenDependencyLockFile) String() string { func (*OpenDependencyLockFile) ProtoMessage() {} func (x *OpenDependencyLockFile) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[5] + mi := &file_terraform1_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -905,7 +999,7 @@ func (x *OpenDependencyLockFile) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenDependencyLockFile.ProtoReflect.Descriptor instead. func (*OpenDependencyLockFile) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{5} + return file_terraform1_proto_rawDescGZIP(), []int{7} } type CreateDependencyLocks struct { @@ -917,7 +1011,7 @@ type CreateDependencyLocks struct { func (x *CreateDependencyLocks) Reset() { *x = CreateDependencyLocks{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[6] + mi := &file_terraform1_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -930,7 +1024,7 @@ func (x *CreateDependencyLocks) String() string { func (*CreateDependencyLocks) ProtoMessage() {} func (x *CreateDependencyLocks) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[6] + mi := &file_terraform1_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -943,7 +1037,7 @@ func (x *CreateDependencyLocks) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateDependencyLocks.ProtoReflect.Descriptor instead. func (*CreateDependencyLocks) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{6} + return file_terraform1_proto_rawDescGZIP(), []int{8} } type CloseDependencyLocks struct { @@ -955,7 +1049,7 @@ type CloseDependencyLocks struct { func (x *CloseDependencyLocks) Reset() { *x = CloseDependencyLocks{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[7] + mi := &file_terraform1_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -968,7 +1062,7 @@ func (x *CloseDependencyLocks) String() string { func (*CloseDependencyLocks) ProtoMessage() {} func (x *CloseDependencyLocks) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[7] + mi := &file_terraform1_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -981,7 +1075,7 @@ func (x *CloseDependencyLocks) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseDependencyLocks.ProtoReflect.Descriptor instead. func (*CloseDependencyLocks) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{7} + return file_terraform1_proto_rawDescGZIP(), []int{9} } type GetLockedProviderDependencies struct { @@ -993,7 +1087,7 @@ type GetLockedProviderDependencies struct { func (x *GetLockedProviderDependencies) Reset() { *x = GetLockedProviderDependencies{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[8] + mi := &file_terraform1_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1006,7 +1100,7 @@ func (x *GetLockedProviderDependencies) String() string { func (*GetLockedProviderDependencies) ProtoMessage() {} func (x *GetLockedProviderDependencies) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[8] + mi := &file_terraform1_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1019,7 +1113,7 @@ func (x *GetLockedProviderDependencies) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLockedProviderDependencies.ProtoReflect.Descriptor instead. func (*GetLockedProviderDependencies) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{8} + return file_terraform1_proto_rawDescGZIP(), []int{10} } type BuildProviderPluginCache struct { @@ -1031,7 +1125,7 @@ type BuildProviderPluginCache struct { func (x *BuildProviderPluginCache) Reset() { *x = BuildProviderPluginCache{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[9] + mi := &file_terraform1_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1044,7 +1138,7 @@ func (x *BuildProviderPluginCache) String() string { func (*BuildProviderPluginCache) ProtoMessage() {} func (x *BuildProviderPluginCache) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[9] + mi := &file_terraform1_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1057,7 +1151,7 @@ func (x *BuildProviderPluginCache) ProtoReflect() protoreflect.Message { // Deprecated: Use BuildProviderPluginCache.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{9} + return file_terraform1_proto_rawDescGZIP(), []int{11} } type OpenProviderPluginCache struct { @@ -1069,7 +1163,7 @@ type OpenProviderPluginCache struct { func (x *OpenProviderPluginCache) Reset() { *x = OpenProviderPluginCache{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[10] + mi := &file_terraform1_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1082,7 +1176,7 @@ func (x *OpenProviderPluginCache) String() string { func (*OpenProviderPluginCache) ProtoMessage() {} func (x *OpenProviderPluginCache) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[10] + mi := &file_terraform1_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1095,7 +1189,7 @@ func (x *OpenProviderPluginCache) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenProviderPluginCache.ProtoReflect.Descriptor instead. func (*OpenProviderPluginCache) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{10} + return file_terraform1_proto_rawDescGZIP(), []int{12} } type CloseProviderPluginCache struct { @@ -1107,7 +1201,7 @@ type CloseProviderPluginCache struct { func (x *CloseProviderPluginCache) Reset() { *x = CloseProviderPluginCache{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[11] + mi := &file_terraform1_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1120,7 +1214,7 @@ func (x *CloseProviderPluginCache) String() string { func (*CloseProviderPluginCache) ProtoMessage() {} func (x *CloseProviderPluginCache) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[11] + mi := &file_terraform1_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1133,7 +1227,7 @@ func (x *CloseProviderPluginCache) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseProviderPluginCache.ProtoReflect.Descriptor instead. func (*CloseProviderPluginCache) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{11} + return file_terraform1_proto_rawDescGZIP(), []int{13} } type GetCachedProviders struct { @@ -1145,7 +1239,7 @@ type GetCachedProviders struct { func (x *GetCachedProviders) Reset() { *x = GetCachedProviders{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[12] + mi := &file_terraform1_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1158,7 +1252,7 @@ func (x *GetCachedProviders) String() string { func (*GetCachedProviders) ProtoMessage() {} func (x *GetCachedProviders) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[12] + mi := &file_terraform1_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1171,7 +1265,7 @@ func (x *GetCachedProviders) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCachedProviders.ProtoReflect.Descriptor instead. func (*GetCachedProviders) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{12} + return file_terraform1_proto_rawDescGZIP(), []int{14} } type GetBuiltInProviders struct { @@ -1183,7 +1277,7 @@ type GetBuiltInProviders struct { func (x *GetBuiltInProviders) Reset() { *x = GetBuiltInProviders{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[13] + mi := &file_terraform1_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1196,7 +1290,7 @@ func (x *GetBuiltInProviders) String() string { func (*GetBuiltInProviders) ProtoMessage() {} func (x *GetBuiltInProviders) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[13] + mi := &file_terraform1_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1209,7 +1303,7 @@ func (x *GetBuiltInProviders) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBuiltInProviders.ProtoReflect.Descriptor instead. func (*GetBuiltInProviders) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{13} + return file_terraform1_proto_rawDescGZIP(), []int{15} } type GetProviderSchema struct { @@ -1221,7 +1315,7 @@ type GetProviderSchema struct { func (x *GetProviderSchema) Reset() { *x = GetProviderSchema{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[14] + mi := &file_terraform1_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1234,7 +1328,7 @@ func (x *GetProviderSchema) String() string { func (*GetProviderSchema) ProtoMessage() {} func (x *GetProviderSchema) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[14] + mi := &file_terraform1_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1247,7 +1341,7 @@ func (x *GetProviderSchema) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProviderSchema.ProtoReflect.Descriptor instead. func (*GetProviderSchema) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{14} + return file_terraform1_proto_rawDescGZIP(), []int{16} } // Represents a selected or available version of a provider, from either a @@ -1290,7 +1384,7 @@ type ProviderPackage struct { func (x *ProviderPackage) Reset() { *x = ProviderPackage{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[15] + mi := &file_terraform1_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1303,7 +1397,7 @@ func (x *ProviderPackage) String() string { func (*ProviderPackage) ProtoMessage() {} func (x *ProviderPackage) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[15] + mi := &file_terraform1_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1316,7 +1410,7 @@ func (x *ProviderPackage) ProtoReflect() protoreflect.Message { // Deprecated: Use ProviderPackage.ProtoReflect.Descriptor instead. func (*ProviderPackage) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{15} + return file_terraform1_proto_rawDescGZIP(), []int{17} } func (x *ProviderPackage) GetSourceAddr() string { @@ -1354,7 +1448,7 @@ type ProviderSchema struct { func (x *ProviderSchema) Reset() { *x = ProviderSchema{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[16] + mi := &file_terraform1_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1367,7 +1461,7 @@ func (x *ProviderSchema) String() string { func (*ProviderSchema) ProtoMessage() {} func (x *ProviderSchema) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[16] + mi := &file_terraform1_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1380,7 +1474,7 @@ func (x *ProviderSchema) ProtoReflect() protoreflect.Message { // Deprecated: Use ProviderSchema.ProtoReflect.Descriptor instead. func (*ProviderSchema) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{16} + return file_terraform1_proto_rawDescGZIP(), []int{18} } func (x *ProviderSchema) GetProviderConfig() *Schema { @@ -1413,7 +1507,7 @@ type OpenStackConfiguration struct { func (x *OpenStackConfiguration) Reset() { *x = OpenStackConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[17] + mi := &file_terraform1_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1426,7 +1520,7 @@ func (x *OpenStackConfiguration) String() string { func (*OpenStackConfiguration) ProtoMessage() {} func (x *OpenStackConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[17] + mi := &file_terraform1_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1439,7 +1533,7 @@ func (x *OpenStackConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenStackConfiguration.ProtoReflect.Descriptor instead. func (*OpenStackConfiguration) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{17} + return file_terraform1_proto_rawDescGZIP(), []int{19} } type CloseStackConfiguration struct { @@ -1451,7 +1545,7 @@ type CloseStackConfiguration struct { func (x *CloseStackConfiguration) Reset() { *x = CloseStackConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[18] + mi := &file_terraform1_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1464,7 +1558,7 @@ func (x *CloseStackConfiguration) String() string { func (*CloseStackConfiguration) ProtoMessage() {} func (x *CloseStackConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[18] + mi := &file_terraform1_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1477,7 +1571,7 @@ func (x *CloseStackConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseStackConfiguration.ProtoReflect.Descriptor instead. func (*CloseStackConfiguration) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{18} + return file_terraform1_proto_rawDescGZIP(), []int{20} } type ValidateStackConfiguration struct { @@ -1489,7 +1583,7 @@ type ValidateStackConfiguration struct { func (x *ValidateStackConfiguration) Reset() { *x = ValidateStackConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[19] + mi := &file_terraform1_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1502,7 +1596,7 @@ func (x *ValidateStackConfiguration) String() string { func (*ValidateStackConfiguration) ProtoMessage() {} func (x *ValidateStackConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[19] + mi := &file_terraform1_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1515,7 +1609,7 @@ func (x *ValidateStackConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateStackConfiguration.ProtoReflect.Descriptor instead. func (*ValidateStackConfiguration) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{19} + return file_terraform1_proto_rawDescGZIP(), []int{21} } type FindStackConfigurationComponents struct { @@ -1527,7 +1621,7 @@ type FindStackConfigurationComponents struct { func (x *FindStackConfigurationComponents) Reset() { *x = FindStackConfigurationComponents{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[20] + mi := &file_terraform1_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1540,7 +1634,7 @@ func (x *FindStackConfigurationComponents) String() string { func (*FindStackConfigurationComponents) ProtoMessage() {} func (x *FindStackConfigurationComponents) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[20] + mi := &file_terraform1_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1553,7 +1647,7 @@ func (x *FindStackConfigurationComponents) ProtoReflect() protoreflect.Message { // Deprecated: Use FindStackConfigurationComponents.ProtoReflect.Descriptor instead. func (*FindStackConfigurationComponents) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{20} + return file_terraform1_proto_rawDescGZIP(), []int{22} } type PlanStackChanges struct { @@ -1565,7 +1659,7 @@ type PlanStackChanges struct { func (x *PlanStackChanges) Reset() { *x = PlanStackChanges{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[21] + mi := &file_terraform1_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1578,7 +1672,7 @@ func (x *PlanStackChanges) String() string { func (*PlanStackChanges) ProtoMessage() {} func (x *PlanStackChanges) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[21] + mi := &file_terraform1_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1591,7 +1685,7 @@ func (x *PlanStackChanges) ProtoReflect() protoreflect.Message { // Deprecated: Use PlanStackChanges.ProtoReflect.Descriptor instead. func (*PlanStackChanges) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{21} + return file_terraform1_proto_rawDescGZIP(), []int{23} } type ApplyStackChanges struct { @@ -1603,7 +1697,7 @@ type ApplyStackChanges struct { func (x *ApplyStackChanges) Reset() { *x = ApplyStackChanges{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[22] + mi := &file_terraform1_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1616,7 +1710,7 @@ func (x *ApplyStackChanges) String() string { func (*ApplyStackChanges) ProtoMessage() {} func (x *ApplyStackChanges) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[22] + mi := &file_terraform1_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1629,7 +1723,7 @@ func (x *ApplyStackChanges) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplyStackChanges.ProtoReflect.Descriptor instead. func (*ApplyStackChanges) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{22} + return file_terraform1_proto_rawDescGZIP(), []int{24} } type OpenStackInspector struct { @@ -1641,7 +1735,7 @@ type OpenStackInspector struct { func (x *OpenStackInspector) Reset() { *x = OpenStackInspector{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[23] + mi := &file_terraform1_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1654,7 +1748,7 @@ func (x *OpenStackInspector) String() string { func (*OpenStackInspector) ProtoMessage() {} func (x *OpenStackInspector) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[23] + mi := &file_terraform1_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1667,7 +1761,7 @@ func (x *OpenStackInspector) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenStackInspector.ProtoReflect.Descriptor instead. func (*OpenStackInspector) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{23} + return file_terraform1_proto_rawDescGZIP(), []int{25} } type InspectExpressionResult struct { @@ -1679,7 +1773,7 @@ type InspectExpressionResult struct { func (x *InspectExpressionResult) Reset() { *x = InspectExpressionResult{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[24] + mi := &file_terraform1_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1692,7 +1786,7 @@ func (x *InspectExpressionResult) String() string { func (*InspectExpressionResult) ProtoMessage() {} func (x *InspectExpressionResult) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[24] + mi := &file_terraform1_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1705,7 +1799,7 @@ func (x *InspectExpressionResult) ProtoReflect() protoreflect.Message { // Deprecated: Use InspectExpressionResult.ProtoReflect.Descriptor instead. func (*InspectExpressionResult) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{24} + return file_terraform1_proto_rawDescGZIP(), []int{26} } // Represents dynamically-typed data from within the Terraform language. @@ -1724,7 +1818,7 @@ type DynamicValue struct { func (x *DynamicValue) Reset() { *x = DynamicValue{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[25] + mi := &file_terraform1_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1737,7 +1831,7 @@ func (x *DynamicValue) String() string { func (*DynamicValue) ProtoMessage() {} func (x *DynamicValue) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[25] + mi := &file_terraform1_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1750,7 +1844,7 @@ func (x *DynamicValue) ProtoReflect() protoreflect.Message { // Deprecated: Use DynamicValue.ProtoReflect.Descriptor instead. func (*DynamicValue) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{25} + return file_terraform1_proto_rawDescGZIP(), []int{27} } func (x *DynamicValue) GetMsgpack() []byte { @@ -1780,7 +1874,7 @@ type DynamicValueChange struct { func (x *DynamicValueChange) Reset() { *x = DynamicValueChange{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[26] + mi := &file_terraform1_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1793,7 +1887,7 @@ func (x *DynamicValueChange) String() string { func (*DynamicValueChange) ProtoMessage() {} func (x *DynamicValueChange) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[26] + mi := &file_terraform1_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1806,7 +1900,7 @@ func (x *DynamicValueChange) ProtoReflect() protoreflect.Message { // Deprecated: Use DynamicValueChange.ProtoReflect.Descriptor instead. func (*DynamicValueChange) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{26} + return file_terraform1_proto_rawDescGZIP(), []int{28} } func (x *DynamicValueChange) GetOld() *DynamicValue { @@ -1838,7 +1932,7 @@ type DynamicValueWithSource struct { func (x *DynamicValueWithSource) Reset() { *x = DynamicValueWithSource{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[27] + mi := &file_terraform1_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1851,7 +1945,7 @@ func (x *DynamicValueWithSource) String() string { func (*DynamicValueWithSource) ProtoMessage() {} func (x *DynamicValueWithSource) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[27] + mi := &file_terraform1_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1864,7 +1958,7 @@ func (x *DynamicValueWithSource) ProtoReflect() protoreflect.Message { // Deprecated: Use DynamicValueWithSource.ProtoReflect.Descriptor instead. func (*DynamicValueWithSource) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{27} + return file_terraform1_proto_rawDescGZIP(), []int{29} } func (x *DynamicValueWithSource) GetValue() *DynamicValue { @@ -1892,7 +1986,7 @@ type AttributePath struct { func (x *AttributePath) Reset() { *x = AttributePath{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[28] + mi := &file_terraform1_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1905,7 +1999,7 @@ func (x *AttributePath) String() string { func (*AttributePath) ProtoMessage() {} func (x *AttributePath) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[28] + mi := &file_terraform1_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1918,7 +2012,7 @@ func (x *AttributePath) ProtoReflect() protoreflect.Message { // Deprecated: Use AttributePath.ProtoReflect.Descriptor instead. func (*AttributePath) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{28} + return file_terraform1_proto_rawDescGZIP(), []int{30} } func (x *AttributePath) GetSteps() []*AttributePath_Step { @@ -1946,7 +2040,7 @@ type ComponentInstanceInStackAddr struct { func (x *ComponentInstanceInStackAddr) Reset() { *x = ComponentInstanceInStackAddr{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[29] + mi := &file_terraform1_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1959,7 +2053,7 @@ func (x *ComponentInstanceInStackAddr) String() string { func (*ComponentInstanceInStackAddr) ProtoMessage() {} func (x *ComponentInstanceInStackAddr) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[29] + mi := &file_terraform1_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1972,7 +2066,7 @@ func (x *ComponentInstanceInStackAddr) ProtoReflect() protoreflect.Message { // Deprecated: Use ComponentInstanceInStackAddr.ProtoReflect.Descriptor instead. func (*ComponentInstanceInStackAddr) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{29} + return file_terraform1_proto_rawDescGZIP(), []int{31} } func (x *ComponentInstanceInStackAddr) GetComponentAddr() string { @@ -2009,7 +2103,7 @@ type ResourceInstanceInStackAddr struct { func (x *ResourceInstanceInStackAddr) Reset() { *x = ResourceInstanceInStackAddr{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[30] + mi := &file_terraform1_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2022,7 +2116,7 @@ func (x *ResourceInstanceInStackAddr) String() string { func (*ResourceInstanceInStackAddr) ProtoMessage() {} func (x *ResourceInstanceInStackAddr) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[30] + mi := &file_terraform1_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2035,7 +2129,7 @@ func (x *ResourceInstanceInStackAddr) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceInstanceInStackAddr.ProtoReflect.Descriptor instead. func (*ResourceInstanceInStackAddr) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{30} + return file_terraform1_proto_rawDescGZIP(), []int{32} } func (x *ResourceInstanceInStackAddr) GetComponentInstanceAddr() string { @@ -2077,7 +2171,7 @@ type ResourceInstanceObjectInStackAddr struct { func (x *ResourceInstanceObjectInStackAddr) Reset() { *x = ResourceInstanceObjectInStackAddr{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[31] + mi := &file_terraform1_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2090,7 +2184,7 @@ func (x *ResourceInstanceObjectInStackAddr) String() string { func (*ResourceInstanceObjectInStackAddr) ProtoMessage() {} func (x *ResourceInstanceObjectInStackAddr) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[31] + mi := &file_terraform1_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2103,7 +2197,7 @@ func (x *ResourceInstanceObjectInStackAddr) ProtoReflect() protoreflect.Message // Deprecated: Use ResourceInstanceObjectInStackAddr.ProtoReflect.Descriptor instead. func (*ResourceInstanceObjectInStackAddr) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{31} + return file_terraform1_proto_rawDescGZIP(), []int{33} } func (x *ResourceInstanceObjectInStackAddr) GetComponentInstanceAddr() string { @@ -2146,7 +2240,7 @@ type SourceAddress struct { func (x *SourceAddress) Reset() { *x = SourceAddress{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[32] + mi := &file_terraform1_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2159,7 +2253,7 @@ func (x *SourceAddress) String() string { func (*SourceAddress) ProtoMessage() {} func (x *SourceAddress) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[32] + mi := &file_terraform1_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2172,7 +2266,7 @@ func (x *SourceAddress) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceAddress.ProtoReflect.Descriptor instead. func (*SourceAddress) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{32} + return file_terraform1_proto_rawDescGZIP(), []int{34} } func (x *SourceAddress) GetSource() string { @@ -2235,7 +2329,7 @@ type PlannedChange struct { func (x *PlannedChange) Reset() { *x = PlannedChange{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[33] + mi := &file_terraform1_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2248,7 +2342,7 @@ func (x *PlannedChange) String() string { func (*PlannedChange) ProtoMessage() {} func (x *PlannedChange) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[33] + mi := &file_terraform1_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2261,7 +2355,7 @@ func (x *PlannedChange) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedChange.ProtoReflect.Descriptor instead. func (*PlannedChange) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{33} + return file_terraform1_proto_rawDescGZIP(), []int{35} } func (x *PlannedChange) GetRaw() []*anypb.Any { @@ -2352,7 +2446,7 @@ type AppliedChange struct { func (x *AppliedChange) Reset() { *x = AppliedChange{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[34] + mi := &file_terraform1_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2365,7 +2459,7 @@ func (x *AppliedChange) String() string { func (*AppliedChange) ProtoMessage() {} func (x *AppliedChange) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[34] + mi := &file_terraform1_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2378,7 +2472,7 @@ func (x *AppliedChange) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange.ProtoReflect.Descriptor instead. func (*AppliedChange) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{34} + return file_terraform1_proto_rawDescGZIP(), []int{36} } func (x *AppliedChange) GetRaw() []*AppliedChange_RawChange { @@ -2422,7 +2516,7 @@ type StackChangeProgress struct { func (x *StackChangeProgress) Reset() { *x = StackChangeProgress{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[35] + mi := &file_terraform1_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2435,7 +2529,7 @@ func (x *StackChangeProgress) String() string { func (*StackChangeProgress) ProtoMessage() {} func (x *StackChangeProgress) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[35] + mi := &file_terraform1_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2448,7 +2542,7 @@ func (x *StackChangeProgress) ProtoReflect() protoreflect.Message { // Deprecated: Use StackChangeProgress.ProtoReflect.Descriptor instead. func (*StackChangeProgress) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35} + return file_terraform1_proto_rawDescGZIP(), []int{37} } func (m *StackChangeProgress) GetEvent() isStackChangeProgress_Event { @@ -2568,7 +2662,7 @@ type Diagnostic struct { func (x *Diagnostic) Reset() { *x = Diagnostic{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[36] + mi := &file_terraform1_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2581,7 +2675,7 @@ func (x *Diagnostic) String() string { func (*Diagnostic) ProtoMessage() {} func (x *Diagnostic) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[36] + mi := &file_terraform1_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2594,7 +2688,7 @@ func (x *Diagnostic) ProtoReflect() protoreflect.Message { // Deprecated: Use Diagnostic.ProtoReflect.Descriptor instead. func (*Diagnostic) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{36} + return file_terraform1_proto_rawDescGZIP(), []int{38} } func (x *Diagnostic) GetSeverity() Diagnostic_Severity { @@ -2645,7 +2739,7 @@ type SourceRange struct { func (x *SourceRange) Reset() { *x = SourceRange{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[37] + mi := &file_terraform1_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2658,7 +2752,7 @@ func (x *SourceRange) String() string { func (*SourceRange) ProtoMessage() {} func (x *SourceRange) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[37] + mi := &file_terraform1_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2671,7 +2765,7 @@ func (x *SourceRange) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceRange.ProtoReflect.Descriptor instead. func (*SourceRange) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37} + return file_terraform1_proto_rawDescGZIP(), []int{39} } func (x *SourceRange) GetSourceAddr() string { @@ -2708,7 +2802,7 @@ type SourcePos struct { func (x *SourcePos) Reset() { *x = SourcePos{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[38] + mi := &file_terraform1_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2721,7 +2815,7 @@ func (x *SourcePos) String() string { func (*SourcePos) ProtoMessage() {} func (x *SourcePos) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[38] + mi := &file_terraform1_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2734,7 +2828,7 @@ func (x *SourcePos) ProtoReflect() protoreflect.Message { // Deprecated: Use SourcePos.ProtoReflect.Descriptor instead. func (*SourcePos) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{38} + return file_terraform1_proto_rawDescGZIP(), []int{40} } func (x *SourcePos) GetByte() int64 { @@ -2772,7 +2866,7 @@ type Schema struct { func (x *Schema) Reset() { *x = Schema{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[39] + mi := &file_terraform1_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2785,7 +2879,7 @@ func (x *Schema) String() string { func (*Schema) ProtoMessage() {} func (x *Schema) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[39] + mi := &file_terraform1_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2798,7 +2892,7 @@ func (x *Schema) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema.ProtoReflect.Descriptor instead. func (*Schema) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{39} + return file_terraform1_proto_rawDescGZIP(), []int{41} } func (x *Schema) GetBlock() *Schema_Block { @@ -2817,7 +2911,7 @@ type ProviderPackageVersions struct { func (x *ProviderPackageVersions) Reset() { *x = ProviderPackageVersions{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[40] + mi := &file_terraform1_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2830,7 +2924,7 @@ func (x *ProviderPackageVersions) String() string { func (*ProviderPackageVersions) ProtoMessage() {} func (x *ProviderPackageVersions) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[40] + mi := &file_terraform1_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2843,7 +2937,7 @@ func (x *ProviderPackageVersions) ProtoReflect() protoreflect.Message { // Deprecated: Use ProviderPackageVersions.ProtoReflect.Descriptor instead. func (*ProviderPackageVersions) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{40} + return file_terraform1_proto_rawDescGZIP(), []int{42} } type FetchProviderPackage struct { @@ -2855,7 +2949,7 @@ type FetchProviderPackage struct { func (x *FetchProviderPackage) Reset() { *x = FetchProviderPackage{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[41] + mi := &file_terraform1_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2868,7 +2962,7 @@ func (x *FetchProviderPackage) String() string { func (*FetchProviderPackage) ProtoMessage() {} func (x *FetchProviderPackage) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[41] + mi := &file_terraform1_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2881,7 +2975,7 @@ func (x *FetchProviderPackage) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchProviderPackage.ProtoReflect.Descriptor instead. func (*FetchProviderPackage) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{41} + return file_terraform1_proto_rawDescGZIP(), []int{43} } type ModulePackageVersions struct { @@ -2893,7 +2987,7 @@ type ModulePackageVersions struct { func (x *ModulePackageVersions) Reset() { *x = ModulePackageVersions{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[42] + mi := &file_terraform1_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2906,7 +3000,7 @@ func (x *ModulePackageVersions) String() string { func (*ModulePackageVersions) ProtoMessage() {} func (x *ModulePackageVersions) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[42] + mi := &file_terraform1_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2919,7 +3013,7 @@ func (x *ModulePackageVersions) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageVersions.ProtoReflect.Descriptor instead. func (*ModulePackageVersions) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{42} + return file_terraform1_proto_rawDescGZIP(), []int{44} } type ModulePackageSourceAddr struct { @@ -2931,7 +3025,7 @@ type ModulePackageSourceAddr struct { func (x *ModulePackageSourceAddr) Reset() { *x = ModulePackageSourceAddr{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[43] + mi := &file_terraform1_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2944,7 +3038,7 @@ func (x *ModulePackageSourceAddr) String() string { func (*ModulePackageSourceAddr) ProtoMessage() {} func (x *ModulePackageSourceAddr) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[43] + mi := &file_terraform1_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2957,7 +3051,7 @@ func (x *ModulePackageSourceAddr) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageSourceAddr.ProtoReflect.Descriptor instead. func (*ModulePackageSourceAddr) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{43} + return file_terraform1_proto_rawDescGZIP(), []int{45} } type FetchModulePackage struct { @@ -2969,7 +3063,7 @@ type FetchModulePackage struct { func (x *FetchModulePackage) Reset() { *x = FetchModulePackage{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[44] + mi := &file_terraform1_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2982,7 +3076,7 @@ func (x *FetchModulePackage) String() string { func (*FetchModulePackage) ProtoMessage() {} func (x *FetchModulePackage) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[44] + mi := &file_terraform1_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2995,7 +3089,7 @@ func (x *FetchModulePackage) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchModulePackage.ProtoReflect.Descriptor instead. func (*FetchModulePackage) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{44} + return file_terraform1_proto_rawDescGZIP(), []int{46} } type Handshake_Request struct { @@ -3004,12 +3098,13 @@ type Handshake_Request struct { unknownFields protoimpl.UnknownFields Capabilities *ClientCapabilities `protobuf:"bytes,1,opt,name=capabilities,proto3" json:"capabilities,omitempty"` + Config *Config `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"` } func (x *Handshake_Request) Reset() { *x = Handshake_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[45] + mi := &file_terraform1_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3022,7 +3117,7 @@ func (x *Handshake_Request) String() string { func (*Handshake_Request) ProtoMessage() {} func (x *Handshake_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[45] + mi := &file_terraform1_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3045,6 +3140,13 @@ func (x *Handshake_Request) GetCapabilities() *ClientCapabilities { return nil } +func (x *Handshake_Request) GetConfig() *Config { + if x != nil { + return x.Config + } + return nil +} + type Handshake_Response struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3056,7 +3158,7 @@ type Handshake_Response struct { func (x *Handshake_Response) Reset() { *x = Handshake_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[46] + mi := &file_terraform1_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3069,7 +3171,7 @@ func (x *Handshake_Response) String() string { func (*Handshake_Response) ProtoMessage() {} func (x *Handshake_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[46] + mi := &file_terraform1_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3103,7 +3205,7 @@ type OpenSourceBundle_Request struct { func (x *OpenSourceBundle_Request) Reset() { *x = OpenSourceBundle_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[47] + mi := &file_terraform1_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3116,7 +3218,7 @@ func (x *OpenSourceBundle_Request) String() string { func (*OpenSourceBundle_Request) ProtoMessage() {} func (x *OpenSourceBundle_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[47] + mi := &file_terraform1_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3129,7 +3231,7 @@ func (x *OpenSourceBundle_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenSourceBundle_Request.ProtoReflect.Descriptor instead. func (*OpenSourceBundle_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{3, 0} + return file_terraform1_proto_rawDescGZIP(), []int{5, 0} } func (x *OpenSourceBundle_Request) GetLocalPath() string { @@ -3150,7 +3252,7 @@ type OpenSourceBundle_Response struct { func (x *OpenSourceBundle_Response) Reset() { *x = OpenSourceBundle_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[48] + mi := &file_terraform1_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3163,7 +3265,7 @@ func (x *OpenSourceBundle_Response) String() string { func (*OpenSourceBundle_Response) ProtoMessage() {} func (x *OpenSourceBundle_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[48] + mi := &file_terraform1_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3176,7 +3278,7 @@ func (x *OpenSourceBundle_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenSourceBundle_Response.ProtoReflect.Descriptor instead. func (*OpenSourceBundle_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{3, 1} + return file_terraform1_proto_rawDescGZIP(), []int{5, 1} } func (x *OpenSourceBundle_Response) GetSourceBundleHandle() int64 { @@ -3197,7 +3299,7 @@ type CloseSourceBundle_Request struct { func (x *CloseSourceBundle_Request) Reset() { *x = CloseSourceBundle_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[49] + mi := &file_terraform1_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3210,7 +3312,7 @@ func (x *CloseSourceBundle_Request) String() string { func (*CloseSourceBundle_Request) ProtoMessage() {} func (x *CloseSourceBundle_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[49] + mi := &file_terraform1_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3223,7 +3325,7 @@ func (x *CloseSourceBundle_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseSourceBundle_Request.ProtoReflect.Descriptor instead. func (*CloseSourceBundle_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{4, 0} + return file_terraform1_proto_rawDescGZIP(), []int{6, 0} } func (x *CloseSourceBundle_Request) GetSourceBundleHandle() int64 { @@ -3242,7 +3344,7 @@ type CloseSourceBundle_Response struct { func (x *CloseSourceBundle_Response) Reset() { *x = CloseSourceBundle_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[50] + mi := &file_terraform1_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3255,7 +3357,7 @@ func (x *CloseSourceBundle_Response) String() string { func (*CloseSourceBundle_Response) ProtoMessage() {} func (x *CloseSourceBundle_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[50] + mi := &file_terraform1_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3268,7 +3370,7 @@ func (x *CloseSourceBundle_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseSourceBundle_Response.ProtoReflect.Descriptor instead. func (*CloseSourceBundle_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{4, 1} + return file_terraform1_proto_rawDescGZIP(), []int{6, 1} } type OpenDependencyLockFile_Request struct { @@ -3283,7 +3385,7 @@ type OpenDependencyLockFile_Request struct { func (x *OpenDependencyLockFile_Request) Reset() { *x = OpenDependencyLockFile_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[51] + mi := &file_terraform1_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3296,7 +3398,7 @@ func (x *OpenDependencyLockFile_Request) String() string { func (*OpenDependencyLockFile_Request) ProtoMessage() {} func (x *OpenDependencyLockFile_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[51] + mi := &file_terraform1_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3309,7 +3411,7 @@ func (x *OpenDependencyLockFile_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenDependencyLockFile_Request.ProtoReflect.Descriptor instead. func (*OpenDependencyLockFile_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{5, 0} + return file_terraform1_proto_rawDescGZIP(), []int{7, 0} } func (x *OpenDependencyLockFile_Request) GetSourceBundleHandle() int64 { @@ -3338,7 +3440,7 @@ type OpenDependencyLockFile_Response struct { func (x *OpenDependencyLockFile_Response) Reset() { *x = OpenDependencyLockFile_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[52] + mi := &file_terraform1_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3351,7 +3453,7 @@ func (x *OpenDependencyLockFile_Response) String() string { func (*OpenDependencyLockFile_Response) ProtoMessage() {} func (x *OpenDependencyLockFile_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[52] + mi := &file_terraform1_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3364,7 +3466,7 @@ func (x *OpenDependencyLockFile_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenDependencyLockFile_Response.ProtoReflect.Descriptor instead. func (*OpenDependencyLockFile_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{5, 1} + return file_terraform1_proto_rawDescGZIP(), []int{7, 1} } func (x *OpenDependencyLockFile_Response) GetDependencyLocksHandle() int64 { @@ -3398,7 +3500,7 @@ type CreateDependencyLocks_Request struct { func (x *CreateDependencyLocks_Request) Reset() { *x = CreateDependencyLocks_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[53] + mi := &file_terraform1_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3411,7 +3513,7 @@ func (x *CreateDependencyLocks_Request) String() string { func (*CreateDependencyLocks_Request) ProtoMessage() {} func (x *CreateDependencyLocks_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[53] + mi := &file_terraform1_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3424,7 +3526,7 @@ func (x *CreateDependencyLocks_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateDependencyLocks_Request.ProtoReflect.Descriptor instead. func (*CreateDependencyLocks_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{6, 0} + return file_terraform1_proto_rawDescGZIP(), []int{8, 0} } func (x *CreateDependencyLocks_Request) GetProviderSelections() []*ProviderPackage { @@ -3445,7 +3547,7 @@ type CreateDependencyLocks_Response struct { func (x *CreateDependencyLocks_Response) Reset() { *x = CreateDependencyLocks_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[54] + mi := &file_terraform1_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3458,7 +3560,7 @@ func (x *CreateDependencyLocks_Response) String() string { func (*CreateDependencyLocks_Response) ProtoMessage() {} func (x *CreateDependencyLocks_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[54] + mi := &file_terraform1_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3471,7 +3573,7 @@ func (x *CreateDependencyLocks_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateDependencyLocks_Response.ProtoReflect.Descriptor instead. func (*CreateDependencyLocks_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{6, 1} + return file_terraform1_proto_rawDescGZIP(), []int{8, 1} } func (x *CreateDependencyLocks_Response) GetDependencyLocksHandle() int64 { @@ -3492,7 +3594,7 @@ type CloseDependencyLocks_Request struct { func (x *CloseDependencyLocks_Request) Reset() { *x = CloseDependencyLocks_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[55] + mi := &file_terraform1_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3505,7 +3607,7 @@ func (x *CloseDependencyLocks_Request) String() string { func (*CloseDependencyLocks_Request) ProtoMessage() {} func (x *CloseDependencyLocks_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[55] + mi := &file_terraform1_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3518,7 +3620,7 @@ func (x *CloseDependencyLocks_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseDependencyLocks_Request.ProtoReflect.Descriptor instead. func (*CloseDependencyLocks_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{7, 0} + return file_terraform1_proto_rawDescGZIP(), []int{9, 0} } func (x *CloseDependencyLocks_Request) GetDependencyLocksHandle() int64 { @@ -3537,7 +3639,7 @@ type CloseDependencyLocks_Response struct { func (x *CloseDependencyLocks_Response) Reset() { *x = CloseDependencyLocks_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[56] + mi := &file_terraform1_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3550,7 +3652,7 @@ func (x *CloseDependencyLocks_Response) String() string { func (*CloseDependencyLocks_Response) ProtoMessage() {} func (x *CloseDependencyLocks_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[56] + mi := &file_terraform1_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3563,7 +3665,7 @@ func (x *CloseDependencyLocks_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseDependencyLocks_Response.ProtoReflect.Descriptor instead. func (*CloseDependencyLocks_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{7, 1} + return file_terraform1_proto_rawDescGZIP(), []int{9, 1} } type GetLockedProviderDependencies_Request struct { @@ -3577,7 +3679,7 @@ type GetLockedProviderDependencies_Request struct { func (x *GetLockedProviderDependencies_Request) Reset() { *x = GetLockedProviderDependencies_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[57] + mi := &file_terraform1_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3590,7 +3692,7 @@ func (x *GetLockedProviderDependencies_Request) String() string { func (*GetLockedProviderDependencies_Request) ProtoMessage() {} func (x *GetLockedProviderDependencies_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[57] + mi := &file_terraform1_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3603,7 +3705,7 @@ func (x *GetLockedProviderDependencies_Request) ProtoReflect() protoreflect.Mess // Deprecated: Use GetLockedProviderDependencies_Request.ProtoReflect.Descriptor instead. func (*GetLockedProviderDependencies_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{8, 0} + return file_terraform1_proto_rawDescGZIP(), []int{10, 0} } func (x *GetLockedProviderDependencies_Request) GetDependencyLocksHandle() int64 { @@ -3624,7 +3726,7 @@ type GetLockedProviderDependencies_Response struct { func (x *GetLockedProviderDependencies_Response) Reset() { *x = GetLockedProviderDependencies_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[58] + mi := &file_terraform1_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3637,7 +3739,7 @@ func (x *GetLockedProviderDependencies_Response) String() string { func (*GetLockedProviderDependencies_Response) ProtoMessage() {} func (x *GetLockedProviderDependencies_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[58] + mi := &file_terraform1_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3650,7 +3752,7 @@ func (x *GetLockedProviderDependencies_Response) ProtoReflect() protoreflect.Mes // Deprecated: Use GetLockedProviderDependencies_Response.ProtoReflect.Descriptor instead. func (*GetLockedProviderDependencies_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{8, 1} + return file_terraform1_proto_rawDescGZIP(), []int{10, 1} } func (x *GetLockedProviderDependencies_Response) GetSelectedProviders() []*ProviderPackage { @@ -3682,7 +3784,7 @@ type BuildProviderPluginCache_Request struct { func (x *BuildProviderPluginCache_Request) Reset() { *x = BuildProviderPluginCache_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[59] + mi := &file_terraform1_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3695,7 +3797,7 @@ func (x *BuildProviderPluginCache_Request) String() string { func (*BuildProviderPluginCache_Request) ProtoMessage() {} func (x *BuildProviderPluginCache_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[59] + mi := &file_terraform1_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3708,7 +3810,7 @@ func (x *BuildProviderPluginCache_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use BuildProviderPluginCache_Request.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{9, 0} + return file_terraform1_proto_rawDescGZIP(), []int{11, 0} } func (x *BuildProviderPluginCache_Request) GetCacheDir() string { @@ -3761,7 +3863,7 @@ type BuildProviderPluginCache_Event struct { func (x *BuildProviderPluginCache_Event) Reset() { *x = BuildProviderPluginCache_Event{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[60] + mi := &file_terraform1_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3774,7 +3876,7 @@ func (x *BuildProviderPluginCache_Event) String() string { func (*BuildProviderPluginCache_Event) ProtoMessage() {} func (x *BuildProviderPluginCache_Event) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[60] + mi := &file_terraform1_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3787,7 +3889,7 @@ func (x *BuildProviderPluginCache_Event) ProtoReflect() protoreflect.Message { // Deprecated: Use BuildProviderPluginCache_Event.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Event) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{9, 1} + return file_terraform1_proto_rawDescGZIP(), []int{11, 1} } func (m *BuildProviderPluginCache_Event) GetEvent() isBuildProviderPluginCache_Event_Event { @@ -3936,7 +4038,7 @@ type BuildProviderPluginCache_Request_InstallMethod struct { func (x *BuildProviderPluginCache_Request_InstallMethod) Reset() { *x = BuildProviderPluginCache_Request_InstallMethod{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[61] + mi := &file_terraform1_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3949,7 +4051,7 @@ func (x *BuildProviderPluginCache_Request_InstallMethod) String() string { func (*BuildProviderPluginCache_Request_InstallMethod) ProtoMessage() {} func (x *BuildProviderPluginCache_Request_InstallMethod) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[61] + mi := &file_terraform1_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3962,7 +4064,7 @@ func (x *BuildProviderPluginCache_Request_InstallMethod) ProtoReflect() protoref // Deprecated: Use BuildProviderPluginCache_Request_InstallMethod.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Request_InstallMethod) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{9, 0, 0} + return file_terraform1_proto_rawDescGZIP(), []int{11, 0, 0} } func (m *BuildProviderPluginCache_Request_InstallMethod) GetSource() isBuildProviderPluginCache_Request_InstallMethod_Source { @@ -4043,7 +4145,7 @@ type BuildProviderPluginCache_Event_Pending struct { func (x *BuildProviderPluginCache_Event_Pending) Reset() { *x = BuildProviderPluginCache_Event_Pending{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[62] + mi := &file_terraform1_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4056,7 +4158,7 @@ func (x *BuildProviderPluginCache_Event_Pending) String() string { func (*BuildProviderPluginCache_Event_Pending) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_Pending) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[62] + mi := &file_terraform1_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4069,7 +4171,7 @@ func (x *BuildProviderPluginCache_Event_Pending) ProtoReflect() protoreflect.Mes // Deprecated: Use BuildProviderPluginCache_Event_Pending.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Event_Pending) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{9, 1, 0} + return file_terraform1_proto_rawDescGZIP(), []int{11, 1, 0} } func (x *BuildProviderPluginCache_Event_Pending) GetExpected() []*BuildProviderPluginCache_Event_ProviderConstraints { @@ -4091,7 +4193,7 @@ type BuildProviderPluginCache_Event_ProviderConstraints struct { func (x *BuildProviderPluginCache_Event_ProviderConstraints) Reset() { *x = BuildProviderPluginCache_Event_ProviderConstraints{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[63] + mi := &file_terraform1_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4104,7 +4206,7 @@ func (x *BuildProviderPluginCache_Event_ProviderConstraints) String() string { func (*BuildProviderPluginCache_Event_ProviderConstraints) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_ProviderConstraints) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[63] + mi := &file_terraform1_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4117,7 +4219,7 @@ func (x *BuildProviderPluginCache_Event_ProviderConstraints) ProtoReflect() prot // Deprecated: Use BuildProviderPluginCache_Event_ProviderConstraints.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Event_ProviderConstraints) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{9, 1, 1} + return file_terraform1_proto_rawDescGZIP(), []int{11, 1, 1} } func (x *BuildProviderPluginCache_Event_ProviderConstraints) GetSourceAddr() string { @@ -4146,7 +4248,7 @@ type BuildProviderPluginCache_Event_ProviderVersion struct { func (x *BuildProviderPluginCache_Event_ProviderVersion) Reset() { *x = BuildProviderPluginCache_Event_ProviderVersion{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[64] + mi := &file_terraform1_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4159,7 +4261,7 @@ func (x *BuildProviderPluginCache_Event_ProviderVersion) String() string { func (*BuildProviderPluginCache_Event_ProviderVersion) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_ProviderVersion) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[64] + mi := &file_terraform1_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4172,7 +4274,7 @@ func (x *BuildProviderPluginCache_Event_ProviderVersion) ProtoReflect() protoref // Deprecated: Use BuildProviderPluginCache_Event_ProviderVersion.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Event_ProviderVersion) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{9, 1, 2} + return file_terraform1_proto_rawDescGZIP(), []int{11, 1, 2} } func (x *BuildProviderPluginCache_Event_ProviderVersion) GetSourceAddr() string { @@ -4201,7 +4303,7 @@ type BuildProviderPluginCache_Event_ProviderWarnings struct { func (x *BuildProviderPluginCache_Event_ProviderWarnings) Reset() { *x = BuildProviderPluginCache_Event_ProviderWarnings{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[65] + mi := &file_terraform1_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4214,7 +4316,7 @@ func (x *BuildProviderPluginCache_Event_ProviderWarnings) String() string { func (*BuildProviderPluginCache_Event_ProviderWarnings) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_ProviderWarnings) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[65] + mi := &file_terraform1_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4227,7 +4329,7 @@ func (x *BuildProviderPluginCache_Event_ProviderWarnings) ProtoReflect() protore // Deprecated: Use BuildProviderPluginCache_Event_ProviderWarnings.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Event_ProviderWarnings) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{9, 1, 3} + return file_terraform1_proto_rawDescGZIP(), []int{11, 1, 3} } func (x *BuildProviderPluginCache_Event_ProviderWarnings) GetSourceAddr() string { @@ -4256,7 +4358,7 @@ type BuildProviderPluginCache_Event_FetchBegin struct { func (x *BuildProviderPluginCache_Event_FetchBegin) Reset() { *x = BuildProviderPluginCache_Event_FetchBegin{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[66] + mi := &file_terraform1_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4269,7 +4371,7 @@ func (x *BuildProviderPluginCache_Event_FetchBegin) String() string { func (*BuildProviderPluginCache_Event_FetchBegin) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_FetchBegin) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[66] + mi := &file_terraform1_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4282,7 +4384,7 @@ func (x *BuildProviderPluginCache_Event_FetchBegin) ProtoReflect() protoreflect. // Deprecated: Use BuildProviderPluginCache_Event_FetchBegin.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Event_FetchBegin) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{9, 1, 4} + return file_terraform1_proto_rawDescGZIP(), []int{11, 1, 4} } func (x *BuildProviderPluginCache_Event_FetchBegin) GetProviderVersion() *BuildProviderPluginCache_Event_ProviderVersion { @@ -4317,7 +4419,7 @@ type BuildProviderPluginCache_Event_FetchComplete struct { func (x *BuildProviderPluginCache_Event_FetchComplete) Reset() { *x = BuildProviderPluginCache_Event_FetchComplete{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[67] + mi := &file_terraform1_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4330,7 +4432,7 @@ func (x *BuildProviderPluginCache_Event_FetchComplete) String() string { func (*BuildProviderPluginCache_Event_FetchComplete) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_FetchComplete) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[67] + mi := &file_terraform1_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4343,7 +4445,7 @@ func (x *BuildProviderPluginCache_Event_FetchComplete) ProtoReflect() protorefle // Deprecated: Use BuildProviderPluginCache_Event_FetchComplete.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Event_FetchComplete) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{9, 1, 5} + return file_terraform1_proto_rawDescGZIP(), []int{11, 1, 5} } func (x *BuildProviderPluginCache_Event_FetchComplete) GetProviderVersion() *BuildProviderPluginCache_Event_ProviderVersion { @@ -4387,7 +4489,7 @@ type OpenProviderPluginCache_Request struct { func (x *OpenProviderPluginCache_Request) Reset() { *x = OpenProviderPluginCache_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[68] + mi := &file_terraform1_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4400,7 +4502,7 @@ func (x *OpenProviderPluginCache_Request) String() string { func (*OpenProviderPluginCache_Request) ProtoMessage() {} func (x *OpenProviderPluginCache_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[68] + mi := &file_terraform1_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4413,7 +4515,7 @@ func (x *OpenProviderPluginCache_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenProviderPluginCache_Request.ProtoReflect.Descriptor instead. func (*OpenProviderPluginCache_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{10, 0} + return file_terraform1_proto_rawDescGZIP(), []int{12, 0} } func (x *OpenProviderPluginCache_Request) GetCacheDir() string { @@ -4441,7 +4543,7 @@ type OpenProviderPluginCache_Response struct { func (x *OpenProviderPluginCache_Response) Reset() { *x = OpenProviderPluginCache_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[69] + mi := &file_terraform1_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4454,7 +4556,7 @@ func (x *OpenProviderPluginCache_Response) String() string { func (*OpenProviderPluginCache_Response) ProtoMessage() {} func (x *OpenProviderPluginCache_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[69] + mi := &file_terraform1_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4467,7 +4569,7 @@ func (x *OpenProviderPluginCache_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenProviderPluginCache_Response.ProtoReflect.Descriptor instead. func (*OpenProviderPluginCache_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{10, 1} + return file_terraform1_proto_rawDescGZIP(), []int{12, 1} } func (x *OpenProviderPluginCache_Response) GetProviderCacheHandle() int64 { @@ -4488,7 +4590,7 @@ type CloseProviderPluginCache_Request struct { func (x *CloseProviderPluginCache_Request) Reset() { *x = CloseProviderPluginCache_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[70] + mi := &file_terraform1_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4501,7 +4603,7 @@ func (x *CloseProviderPluginCache_Request) String() string { func (*CloseProviderPluginCache_Request) ProtoMessage() {} func (x *CloseProviderPluginCache_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[70] + mi := &file_terraform1_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4514,7 +4616,7 @@ func (x *CloseProviderPluginCache_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseProviderPluginCache_Request.ProtoReflect.Descriptor instead. func (*CloseProviderPluginCache_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{11, 0} + return file_terraform1_proto_rawDescGZIP(), []int{13, 0} } func (x *CloseProviderPluginCache_Request) GetProviderCacheHandle() int64 { @@ -4533,7 +4635,7 @@ type CloseProviderPluginCache_Response struct { func (x *CloseProviderPluginCache_Response) Reset() { *x = CloseProviderPluginCache_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[71] + mi := &file_terraform1_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4546,7 +4648,7 @@ func (x *CloseProviderPluginCache_Response) String() string { func (*CloseProviderPluginCache_Response) ProtoMessage() {} func (x *CloseProviderPluginCache_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[71] + mi := &file_terraform1_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4559,7 +4661,7 @@ func (x *CloseProviderPluginCache_Response) ProtoReflect() protoreflect.Message // Deprecated: Use CloseProviderPluginCache_Response.ProtoReflect.Descriptor instead. func (*CloseProviderPluginCache_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{11, 1} + return file_terraform1_proto_rawDescGZIP(), []int{13, 1} } type GetCachedProviders_Request struct { @@ -4573,7 +4675,7 @@ type GetCachedProviders_Request struct { func (x *GetCachedProviders_Request) Reset() { *x = GetCachedProviders_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[72] + mi := &file_terraform1_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4586,7 +4688,7 @@ func (x *GetCachedProviders_Request) String() string { func (*GetCachedProviders_Request) ProtoMessage() {} func (x *GetCachedProviders_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[72] + mi := &file_terraform1_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4599,7 +4701,7 @@ func (x *GetCachedProviders_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCachedProviders_Request.ProtoReflect.Descriptor instead. func (*GetCachedProviders_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{12, 0} + return file_terraform1_proto_rawDescGZIP(), []int{14, 0} } func (x *GetCachedProviders_Request) GetProviderCacheHandle() int64 { @@ -4620,7 +4722,7 @@ type GetCachedProviders_Response struct { func (x *GetCachedProviders_Response) Reset() { *x = GetCachedProviders_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[73] + mi := &file_terraform1_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4633,7 +4735,7 @@ func (x *GetCachedProviders_Response) String() string { func (*GetCachedProviders_Response) ProtoMessage() {} func (x *GetCachedProviders_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[73] + mi := &file_terraform1_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4646,7 +4748,7 @@ func (x *GetCachedProviders_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCachedProviders_Response.ProtoReflect.Descriptor instead. func (*GetCachedProviders_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{12, 1} + return file_terraform1_proto_rawDescGZIP(), []int{14, 1} } func (x *GetCachedProviders_Response) GetAvailableProviders() []*ProviderPackage { @@ -4665,7 +4767,7 @@ type GetBuiltInProviders_Request struct { func (x *GetBuiltInProviders_Request) Reset() { *x = GetBuiltInProviders_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[74] + mi := &file_terraform1_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4678,7 +4780,7 @@ func (x *GetBuiltInProviders_Request) String() string { func (*GetBuiltInProviders_Request) ProtoMessage() {} func (x *GetBuiltInProviders_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[74] + mi := &file_terraform1_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4691,7 +4793,7 @@ func (x *GetBuiltInProviders_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBuiltInProviders_Request.ProtoReflect.Descriptor instead. func (*GetBuiltInProviders_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{13, 0} + return file_terraform1_proto_rawDescGZIP(), []int{15, 0} } type GetBuiltInProviders_Response struct { @@ -4712,7 +4814,7 @@ type GetBuiltInProviders_Response struct { func (x *GetBuiltInProviders_Response) Reset() { *x = GetBuiltInProviders_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[75] + mi := &file_terraform1_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4725,7 +4827,7 @@ func (x *GetBuiltInProviders_Response) String() string { func (*GetBuiltInProviders_Response) ProtoMessage() {} func (x *GetBuiltInProviders_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[75] + mi := &file_terraform1_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4738,7 +4840,7 @@ func (x *GetBuiltInProviders_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBuiltInProviders_Response.ProtoReflect.Descriptor instead. func (*GetBuiltInProviders_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{13, 1} + return file_terraform1_proto_rawDescGZIP(), []int{15, 1} } func (x *GetBuiltInProviders_Response) GetAvailableProviders() []*ProviderPackage { @@ -4782,7 +4884,7 @@ type GetProviderSchema_Request struct { func (x *GetProviderSchema_Request) Reset() { *x = GetProviderSchema_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[76] + mi := &file_terraform1_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4795,7 +4897,7 @@ func (x *GetProviderSchema_Request) String() string { func (*GetProviderSchema_Request) ProtoMessage() {} func (x *GetProviderSchema_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[76] + mi := &file_terraform1_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4808,7 +4910,7 @@ func (x *GetProviderSchema_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProviderSchema_Request.ProtoReflect.Descriptor instead. func (*GetProviderSchema_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{14, 0} + return file_terraform1_proto_rawDescGZIP(), []int{16, 0} } func (x *GetProviderSchema_Request) GetProviderAddr() string { @@ -4843,7 +4945,7 @@ type GetProviderSchema_Response struct { func (x *GetProviderSchema_Response) Reset() { *x = GetProviderSchema_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[77] + mi := &file_terraform1_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4856,7 +4958,7 @@ func (x *GetProviderSchema_Response) String() string { func (*GetProviderSchema_Response) ProtoMessage() {} func (x *GetProviderSchema_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[77] + mi := &file_terraform1_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4869,7 +4971,7 @@ func (x *GetProviderSchema_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProviderSchema_Response.ProtoReflect.Descriptor instead. func (*GetProviderSchema_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{14, 1} + return file_terraform1_proto_rawDescGZIP(), []int{16, 1} } func (x *GetProviderSchema_Response) GetSchema() *ProviderSchema { @@ -4891,7 +4993,7 @@ type OpenStackConfiguration_Request struct { func (x *OpenStackConfiguration_Request) Reset() { *x = OpenStackConfiguration_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[80] + mi := &file_terraform1_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4904,7 +5006,7 @@ func (x *OpenStackConfiguration_Request) String() string { func (*OpenStackConfiguration_Request) ProtoMessage() {} func (x *OpenStackConfiguration_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[80] + mi := &file_terraform1_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4917,7 +5019,7 @@ func (x *OpenStackConfiguration_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenStackConfiguration_Request.ProtoReflect.Descriptor instead. func (*OpenStackConfiguration_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{17, 0} + return file_terraform1_proto_rawDescGZIP(), []int{19, 0} } func (x *OpenStackConfiguration_Request) GetSourceBundleHandle() int64 { @@ -4946,7 +5048,7 @@ type OpenStackConfiguration_Response struct { func (x *OpenStackConfiguration_Response) Reset() { *x = OpenStackConfiguration_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[81] + mi := &file_terraform1_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4959,7 +5061,7 @@ func (x *OpenStackConfiguration_Response) String() string { func (*OpenStackConfiguration_Response) ProtoMessage() {} func (x *OpenStackConfiguration_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[81] + mi := &file_terraform1_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4972,7 +5074,7 @@ func (x *OpenStackConfiguration_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenStackConfiguration_Response.ProtoReflect.Descriptor instead. func (*OpenStackConfiguration_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{17, 1} + return file_terraform1_proto_rawDescGZIP(), []int{19, 1} } func (x *OpenStackConfiguration_Response) GetStackConfigHandle() int64 { @@ -5000,7 +5102,7 @@ type CloseStackConfiguration_Request struct { func (x *CloseStackConfiguration_Request) Reset() { *x = CloseStackConfiguration_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[82] + mi := &file_terraform1_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5013,7 +5115,7 @@ func (x *CloseStackConfiguration_Request) String() string { func (*CloseStackConfiguration_Request) ProtoMessage() {} func (x *CloseStackConfiguration_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[82] + mi := &file_terraform1_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5026,7 +5128,7 @@ func (x *CloseStackConfiguration_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseStackConfiguration_Request.ProtoReflect.Descriptor instead. func (*CloseStackConfiguration_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{18, 0} + return file_terraform1_proto_rawDescGZIP(), []int{20, 0} } func (x *CloseStackConfiguration_Request) GetStackConfigHandle() int64 { @@ -5045,7 +5147,7 @@ type CloseStackConfiguration_Response struct { func (x *CloseStackConfiguration_Response) Reset() { *x = CloseStackConfiguration_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[83] + mi := &file_terraform1_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5058,7 +5160,7 @@ func (x *CloseStackConfiguration_Response) String() string { func (*CloseStackConfiguration_Response) ProtoMessage() {} func (x *CloseStackConfiguration_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[83] + mi := &file_terraform1_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5071,7 +5173,7 @@ func (x *CloseStackConfiguration_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseStackConfiguration_Response.ProtoReflect.Descriptor instead. func (*CloseStackConfiguration_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{18, 1} + return file_terraform1_proto_rawDescGZIP(), []int{20, 1} } type ValidateStackConfiguration_Request struct { @@ -5087,7 +5189,7 @@ type ValidateStackConfiguration_Request struct { func (x *ValidateStackConfiguration_Request) Reset() { *x = ValidateStackConfiguration_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[84] + mi := &file_terraform1_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5100,7 +5202,7 @@ func (x *ValidateStackConfiguration_Request) String() string { func (*ValidateStackConfiguration_Request) ProtoMessage() {} func (x *ValidateStackConfiguration_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[84] + mi := &file_terraform1_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5113,7 +5215,7 @@ func (x *ValidateStackConfiguration_Request) ProtoReflect() protoreflect.Message // Deprecated: Use ValidateStackConfiguration_Request.ProtoReflect.Descriptor instead. func (*ValidateStackConfiguration_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{19, 0} + return file_terraform1_proto_rawDescGZIP(), []int{21, 0} } func (x *ValidateStackConfiguration_Request) GetStackConfigHandle() int64 { @@ -5148,7 +5250,7 @@ type ValidateStackConfiguration_Response struct { func (x *ValidateStackConfiguration_Response) Reset() { *x = ValidateStackConfiguration_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[85] + mi := &file_terraform1_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5161,7 +5263,7 @@ func (x *ValidateStackConfiguration_Response) String() string { func (*ValidateStackConfiguration_Response) ProtoMessage() {} func (x *ValidateStackConfiguration_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[85] + mi := &file_terraform1_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5174,7 +5276,7 @@ func (x *ValidateStackConfiguration_Response) ProtoReflect() protoreflect.Messag // Deprecated: Use ValidateStackConfiguration_Response.ProtoReflect.Descriptor instead. func (*ValidateStackConfiguration_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{19, 1} + return file_terraform1_proto_rawDescGZIP(), []int{21, 1} } func (x *ValidateStackConfiguration_Response) GetDiagnostics() []*Diagnostic { @@ -5195,7 +5297,7 @@ type FindStackConfigurationComponents_Request struct { func (x *FindStackConfigurationComponents_Request) Reset() { *x = FindStackConfigurationComponents_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[86] + mi := &file_terraform1_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5208,7 +5310,7 @@ func (x *FindStackConfigurationComponents_Request) String() string { func (*FindStackConfigurationComponents_Request) ProtoMessage() {} func (x *FindStackConfigurationComponents_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[86] + mi := &file_terraform1_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5221,7 +5323,7 @@ func (x *FindStackConfigurationComponents_Request) ProtoReflect() protoreflect.M // Deprecated: Use FindStackConfigurationComponents_Request.ProtoReflect.Descriptor instead. func (*FindStackConfigurationComponents_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{20, 0} + return file_terraform1_proto_rawDescGZIP(), []int{22, 0} } func (x *FindStackConfigurationComponents_Request) GetStackConfigHandle() int64 { @@ -5242,7 +5344,7 @@ type FindStackConfigurationComponents_Response struct { func (x *FindStackConfigurationComponents_Response) Reset() { *x = FindStackConfigurationComponents_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[87] + mi := &file_terraform1_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5255,7 +5357,7 @@ func (x *FindStackConfigurationComponents_Response) String() string { func (*FindStackConfigurationComponents_Response) ProtoMessage() {} func (x *FindStackConfigurationComponents_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[87] + mi := &file_terraform1_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5268,7 +5370,7 @@ func (x *FindStackConfigurationComponents_Response) ProtoReflect() protoreflect. // Deprecated: Use FindStackConfigurationComponents_Response.ProtoReflect.Descriptor instead. func (*FindStackConfigurationComponents_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{20, 1} + return file_terraform1_proto_rawDescGZIP(), []int{22, 1} } func (x *FindStackConfigurationComponents_Response) GetConfig() *FindStackConfigurationComponents_StackConfig { @@ -5290,7 +5392,7 @@ type FindStackConfigurationComponents_StackConfig struct { func (x *FindStackConfigurationComponents_StackConfig) Reset() { *x = FindStackConfigurationComponents_StackConfig{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[88] + mi := &file_terraform1_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5303,7 +5405,7 @@ func (x *FindStackConfigurationComponents_StackConfig) String() string { func (*FindStackConfigurationComponents_StackConfig) ProtoMessage() {} func (x *FindStackConfigurationComponents_StackConfig) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[88] + mi := &file_terraform1_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5316,7 +5418,7 @@ func (x *FindStackConfigurationComponents_StackConfig) ProtoReflect() protorefle // Deprecated: Use FindStackConfigurationComponents_StackConfig.ProtoReflect.Descriptor instead. func (*FindStackConfigurationComponents_StackConfig) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{20, 2} + return file_terraform1_proto_rawDescGZIP(), []int{22, 2} } func (x *FindStackConfigurationComponents_StackConfig) GetComponents() map[string]*FindStackConfigurationComponents_Component { @@ -5346,7 +5448,7 @@ type FindStackConfigurationComponents_EmbeddedStack struct { func (x *FindStackConfigurationComponents_EmbeddedStack) Reset() { *x = FindStackConfigurationComponents_EmbeddedStack{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[89] + mi := &file_terraform1_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5359,7 +5461,7 @@ func (x *FindStackConfigurationComponents_EmbeddedStack) String() string { func (*FindStackConfigurationComponents_EmbeddedStack) ProtoMessage() {} func (x *FindStackConfigurationComponents_EmbeddedStack) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[89] + mi := &file_terraform1_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5372,7 +5474,7 @@ func (x *FindStackConfigurationComponents_EmbeddedStack) ProtoReflect() protoref // Deprecated: Use FindStackConfigurationComponents_EmbeddedStack.ProtoReflect.Descriptor instead. func (*FindStackConfigurationComponents_EmbeddedStack) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{20, 3} + return file_terraform1_proto_rawDescGZIP(), []int{22, 3} } func (x *FindStackConfigurationComponents_EmbeddedStack) GetSourceAddr() string { @@ -5409,7 +5511,7 @@ type FindStackConfigurationComponents_Component struct { func (x *FindStackConfigurationComponents_Component) Reset() { *x = FindStackConfigurationComponents_Component{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[90] + mi := &file_terraform1_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5422,7 +5524,7 @@ func (x *FindStackConfigurationComponents_Component) String() string { func (*FindStackConfigurationComponents_Component) ProtoMessage() {} func (x *FindStackConfigurationComponents_Component) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[90] + mi := &file_terraform1_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5435,7 +5537,7 @@ func (x *FindStackConfigurationComponents_Component) ProtoReflect() protoreflect // Deprecated: Use FindStackConfigurationComponents_Component.ProtoReflect.Descriptor instead. func (*FindStackConfigurationComponents_Component) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{20, 4} + return file_terraform1_proto_rawDescGZIP(), []int{22, 4} } func (x *FindStackConfigurationComponents_Component) GetSourceAddr() string { @@ -5475,7 +5577,7 @@ type PlanStackChanges_Request struct { func (x *PlanStackChanges_Request) Reset() { *x = PlanStackChanges_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[93] + mi := &file_terraform1_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5488,7 +5590,7 @@ func (x *PlanStackChanges_Request) String() string { func (*PlanStackChanges_Request) ProtoMessage() {} func (x *PlanStackChanges_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[93] + mi := &file_terraform1_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5501,7 +5603,7 @@ func (x *PlanStackChanges_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use PlanStackChanges_Request.ProtoReflect.Descriptor instead. func (*PlanStackChanges_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{21, 0} + return file_terraform1_proto_rawDescGZIP(), []int{23, 0} } func (x *PlanStackChanges_Request) GetPlanMode() PlanMode { @@ -5562,7 +5664,7 @@ type PlanStackChanges_Event struct { func (x *PlanStackChanges_Event) Reset() { *x = PlanStackChanges_Event{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[94] + mi := &file_terraform1_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5575,7 +5677,7 @@ func (x *PlanStackChanges_Event) String() string { func (*PlanStackChanges_Event) ProtoMessage() {} func (x *PlanStackChanges_Event) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[94] + mi := &file_terraform1_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5588,7 +5690,7 @@ func (x *PlanStackChanges_Event) ProtoReflect() protoreflect.Message { // Deprecated: Use PlanStackChanges_Event.ProtoReflect.Descriptor instead. func (*PlanStackChanges_Event) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{21, 1} + return file_terraform1_proto_rawDescGZIP(), []int{23, 1} } func (m *PlanStackChanges_Event) GetEvent() isPlanStackChanges_Event_Event { @@ -5672,7 +5774,7 @@ type ApplyStackChanges_Request struct { func (x *ApplyStackChanges_Request) Reset() { *x = ApplyStackChanges_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[97] + mi := &file_terraform1_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5685,7 +5787,7 @@ func (x *ApplyStackChanges_Request) String() string { func (*ApplyStackChanges_Request) ProtoMessage() {} func (x *ApplyStackChanges_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[97] + mi := &file_terraform1_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5698,7 +5800,7 @@ func (x *ApplyStackChanges_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplyStackChanges_Request.ProtoReflect.Descriptor instead. func (*ApplyStackChanges_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{22, 0} + return file_terraform1_proto_rawDescGZIP(), []int{24, 0} } func (x *ApplyStackChanges_Request) GetStackConfigHandle() int64 { @@ -5752,7 +5854,7 @@ type ApplyStackChanges_Event struct { func (x *ApplyStackChanges_Event) Reset() { *x = ApplyStackChanges_Event{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[98] + mi := &file_terraform1_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5765,7 +5867,7 @@ func (x *ApplyStackChanges_Event) String() string { func (*ApplyStackChanges_Event) ProtoMessage() {} func (x *ApplyStackChanges_Event) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[98] + mi := &file_terraform1_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5778,7 +5880,7 @@ func (x *ApplyStackChanges_Event) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplyStackChanges_Event.ProtoReflect.Descriptor instead. func (*ApplyStackChanges_Event) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{22, 1} + return file_terraform1_proto_rawDescGZIP(), []int{24, 1} } func (m *ApplyStackChanges_Event) GetEvent() isApplyStackChanges_Event_Event { @@ -5846,7 +5948,7 @@ type OpenStackInspector_Request struct { func (x *OpenStackInspector_Request) Reset() { *x = OpenStackInspector_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[99] + mi := &file_terraform1_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5859,7 +5961,7 @@ func (x *OpenStackInspector_Request) String() string { func (*OpenStackInspector_Request) ProtoMessage() {} func (x *OpenStackInspector_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[99] + mi := &file_terraform1_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5872,7 +5974,7 @@ func (x *OpenStackInspector_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenStackInspector_Request.ProtoReflect.Descriptor instead. func (*OpenStackInspector_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{23, 0} + return file_terraform1_proto_rawDescGZIP(), []int{25, 0} } func (x *OpenStackInspector_Request) GetStackConfigHandle() int64 { @@ -5922,7 +6024,7 @@ type OpenStackInspector_Response struct { func (x *OpenStackInspector_Response) Reset() { *x = OpenStackInspector_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[100] + mi := &file_terraform1_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5935,7 +6037,7 @@ func (x *OpenStackInspector_Response) String() string { func (*OpenStackInspector_Response) ProtoMessage() {} func (x *OpenStackInspector_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[100] + mi := &file_terraform1_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5948,7 +6050,7 @@ func (x *OpenStackInspector_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenStackInspector_Response.ProtoReflect.Descriptor instead. func (*OpenStackInspector_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{23, 1} + return file_terraform1_proto_rawDescGZIP(), []int{25, 1} } func (x *OpenStackInspector_Response) GetStackInspectorHandle() int64 { @@ -5978,7 +6080,7 @@ type InspectExpressionResult_Request struct { func (x *InspectExpressionResult_Request) Reset() { *x = InspectExpressionResult_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[103] + mi := &file_terraform1_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5991,7 +6093,7 @@ func (x *InspectExpressionResult_Request) String() string { func (*InspectExpressionResult_Request) ProtoMessage() {} func (x *InspectExpressionResult_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[103] + mi := &file_terraform1_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6004,7 +6106,7 @@ func (x *InspectExpressionResult_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use InspectExpressionResult_Request.ProtoReflect.Descriptor instead. func (*InspectExpressionResult_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{24, 0} + return file_terraform1_proto_rawDescGZIP(), []int{26, 0} } func (x *InspectExpressionResult_Request) GetStackInspectorHandle() int64 { @@ -6046,7 +6148,7 @@ type InspectExpressionResult_Response struct { func (x *InspectExpressionResult_Response) Reset() { *x = InspectExpressionResult_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[104] + mi := &file_terraform1_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6059,7 +6161,7 @@ func (x *InspectExpressionResult_Response) String() string { func (*InspectExpressionResult_Response) ProtoMessage() {} func (x *InspectExpressionResult_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[104] + mi := &file_terraform1_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6072,7 +6174,7 @@ func (x *InspectExpressionResult_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use InspectExpressionResult_Response.ProtoReflect.Descriptor instead. func (*InspectExpressionResult_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{24, 1} + return file_terraform1_proto_rawDescGZIP(), []int{26, 1} } func (x *InspectExpressionResult_Response) GetResult() *DynamicValue { @@ -6105,7 +6207,7 @@ type AttributePath_Step struct { func (x *AttributePath_Step) Reset() { *x = AttributePath_Step{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[105] + mi := &file_terraform1_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6118,7 +6220,7 @@ func (x *AttributePath_Step) String() string { func (*AttributePath_Step) ProtoMessage() {} func (x *AttributePath_Step) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[105] + mi := &file_terraform1_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6131,7 +6233,7 @@ func (x *AttributePath_Step) ProtoReflect() protoreflect.Message { // Deprecated: Use AttributePath_Step.ProtoReflect.Descriptor instead. func (*AttributePath_Step) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{28, 0} + return file_terraform1_proto_rawDescGZIP(), []int{30, 0} } func (m *AttributePath_Step) GetSelector() isAttributePath_Step_Selector { @@ -6213,7 +6315,7 @@ type PlannedChange_ChangeDescription struct { func (x *PlannedChange_ChangeDescription) Reset() { *x = PlannedChange_ChangeDescription{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[106] + mi := &file_terraform1_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6226,7 +6328,7 @@ func (x *PlannedChange_ChangeDescription) String() string { func (*PlannedChange_ChangeDescription) ProtoMessage() {} func (x *PlannedChange_ChangeDescription) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[106] + mi := &file_terraform1_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6239,7 +6341,7 @@ func (x *PlannedChange_ChangeDescription) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedChange_ChangeDescription.ProtoReflect.Descriptor instead. func (*PlannedChange_ChangeDescription) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{33, 0} + return file_terraform1_proto_rawDescGZIP(), []int{35, 0} } func (m *PlannedChange_ChangeDescription) GetDescription() isPlannedChange_ChangeDescription_Description { @@ -6340,7 +6442,7 @@ type PlannedChange_ComponentInstance struct { func (x *PlannedChange_ComponentInstance) Reset() { *x = PlannedChange_ComponentInstance{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[107] + mi := &file_terraform1_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6353,7 +6455,7 @@ func (x *PlannedChange_ComponentInstance) String() string { func (*PlannedChange_ComponentInstance) ProtoMessage() {} func (x *PlannedChange_ComponentInstance) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[107] + mi := &file_terraform1_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6366,7 +6468,7 @@ func (x *PlannedChange_ComponentInstance) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedChange_ComponentInstance.ProtoReflect.Descriptor instead. func (*PlannedChange_ComponentInstance) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{33, 1} + return file_terraform1_proto_rawDescGZIP(), []int{35, 1} } func (x *PlannedChange_ComponentInstance) GetAddr() *ComponentInstanceInStackAddr { @@ -6429,7 +6531,7 @@ type PlannedChange_ResourceInstance struct { func (x *PlannedChange_ResourceInstance) Reset() { *x = PlannedChange_ResourceInstance{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[108] + mi := &file_terraform1_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6442,7 +6544,7 @@ func (x *PlannedChange_ResourceInstance) String() string { func (*PlannedChange_ResourceInstance) ProtoMessage() {} func (x *PlannedChange_ResourceInstance) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[108] + mi := &file_terraform1_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6455,7 +6557,7 @@ func (x *PlannedChange_ResourceInstance) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedChange_ResourceInstance.ProtoReflect.Descriptor instead. func (*PlannedChange_ResourceInstance) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{33, 2} + return file_terraform1_proto_rawDescGZIP(), []int{35, 2} } func (x *PlannedChange_ResourceInstance) GetAddr() *ResourceInstanceObjectInStackAddr { @@ -6551,7 +6653,7 @@ type PlannedChange_OutputValue struct { func (x *PlannedChange_OutputValue) Reset() { *x = PlannedChange_OutputValue{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[109] + mi := &file_terraform1_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6564,7 +6666,7 @@ func (x *PlannedChange_OutputValue) String() string { func (*PlannedChange_OutputValue) ProtoMessage() {} func (x *PlannedChange_OutputValue) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[109] + mi := &file_terraform1_proto_msgTypes[112] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6577,7 +6679,7 @@ func (x *PlannedChange_OutputValue) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedChange_OutputValue.ProtoReflect.Descriptor instead. func (*PlannedChange_OutputValue) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{33, 3} + return file_terraform1_proto_rawDescGZIP(), []int{35, 3} } func (x *PlannedChange_OutputValue) GetName() string { @@ -6612,7 +6714,7 @@ type PlannedChange_ResourceInstance_Moved struct { func (x *PlannedChange_ResourceInstance_Moved) Reset() { *x = PlannedChange_ResourceInstance_Moved{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[110] + mi := &file_terraform1_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6625,7 +6727,7 @@ func (x *PlannedChange_ResourceInstance_Moved) String() string { func (*PlannedChange_ResourceInstance_Moved) ProtoMessage() {} func (x *PlannedChange_ResourceInstance_Moved) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[110] + mi := &file_terraform1_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6638,7 +6740,7 @@ func (x *PlannedChange_ResourceInstance_Moved) ProtoReflect() protoreflect.Messa // Deprecated: Use PlannedChange_ResourceInstance_Moved.ProtoReflect.Descriptor instead. func (*PlannedChange_ResourceInstance_Moved) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{33, 2, 0} + return file_terraform1_proto_rawDescGZIP(), []int{35, 2, 0} } func (x *PlannedChange_ResourceInstance_Moved) GetPrevAddr() *ResourceInstanceInStackAddr { @@ -6659,7 +6761,7 @@ type PlannedChange_ResourceInstance_Imported struct { func (x *PlannedChange_ResourceInstance_Imported) Reset() { *x = PlannedChange_ResourceInstance_Imported{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[111] + mi := &file_terraform1_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6672,7 +6774,7 @@ func (x *PlannedChange_ResourceInstance_Imported) String() string { func (*PlannedChange_ResourceInstance_Imported) ProtoMessage() {} func (x *PlannedChange_ResourceInstance_Imported) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[111] + mi := &file_terraform1_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6685,7 +6787,7 @@ func (x *PlannedChange_ResourceInstance_Imported) ProtoReflect() protoreflect.Me // Deprecated: Use PlannedChange_ResourceInstance_Imported.ProtoReflect.Descriptor instead. func (*PlannedChange_ResourceInstance_Imported) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{33, 2, 1} + return file_terraform1_proto_rawDescGZIP(), []int{35, 2, 1} } func (x *PlannedChange_ResourceInstance_Imported) GetImportId() string { @@ -6707,7 +6809,7 @@ type AppliedChange_RawChange struct { func (x *AppliedChange_RawChange) Reset() { *x = AppliedChange_RawChange{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[112] + mi := &file_terraform1_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6720,7 +6822,7 @@ func (x *AppliedChange_RawChange) String() string { func (*AppliedChange_RawChange) ProtoMessage() {} func (x *AppliedChange_RawChange) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[112] + mi := &file_terraform1_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6733,7 +6835,7 @@ func (x *AppliedChange_RawChange) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_RawChange.ProtoReflect.Descriptor instead. func (*AppliedChange_RawChange) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{34, 0} + return file_terraform1_proto_rawDescGZIP(), []int{36, 0} } func (x *AppliedChange_RawChange) GetKey() string { @@ -6768,7 +6870,7 @@ type AppliedChange_ChangeDescription struct { func (x *AppliedChange_ChangeDescription) Reset() { *x = AppliedChange_ChangeDescription{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[113] + mi := &file_terraform1_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6781,7 +6883,7 @@ func (x *AppliedChange_ChangeDescription) String() string { func (*AppliedChange_ChangeDescription) ProtoMessage() {} func (x *AppliedChange_ChangeDescription) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[113] + mi := &file_terraform1_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6794,7 +6896,7 @@ func (x *AppliedChange_ChangeDescription) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_ChangeDescription.ProtoReflect.Descriptor instead. func (*AppliedChange_ChangeDescription) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{34, 1} + return file_terraform1_proto_rawDescGZIP(), []int{36, 1} } func (x *AppliedChange_ChangeDescription) GetKey() string { @@ -6906,7 +7008,7 @@ type AppliedChange_ResourceInstance struct { func (x *AppliedChange_ResourceInstance) Reset() { *x = AppliedChange_ResourceInstance{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[114] + mi := &file_terraform1_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6919,7 +7021,7 @@ func (x *AppliedChange_ResourceInstance) String() string { func (*AppliedChange_ResourceInstance) ProtoMessage() {} func (x *AppliedChange_ResourceInstance) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[114] + mi := &file_terraform1_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6932,7 +7034,7 @@ func (x *AppliedChange_ResourceInstance) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_ResourceInstance.ProtoReflect.Descriptor instead. func (*AppliedChange_ResourceInstance) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{34, 2} + return file_terraform1_proto_rawDescGZIP(), []int{36, 2} } func (x *AppliedChange_ResourceInstance) GetAddr() *ResourceInstanceObjectInStackAddr { @@ -6990,7 +7092,7 @@ type AppliedChange_ComponentInstance struct { func (x *AppliedChange_ComponentInstance) Reset() { *x = AppliedChange_ComponentInstance{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[115] + mi := &file_terraform1_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7003,7 +7105,7 @@ func (x *AppliedChange_ComponentInstance) String() string { func (*AppliedChange_ComponentInstance) ProtoMessage() {} func (x *AppliedChange_ComponentInstance) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[115] + mi := &file_terraform1_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7016,7 +7118,7 @@ func (x *AppliedChange_ComponentInstance) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_ComponentInstance.ProtoReflect.Descriptor instead. func (*AppliedChange_ComponentInstance) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{34, 3} + return file_terraform1_proto_rawDescGZIP(), []int{36, 3} } func (x *AppliedChange_ComponentInstance) GetComponentAddr() string { @@ -7052,7 +7154,7 @@ type AppliedChange_OutputValue struct { func (x *AppliedChange_OutputValue) Reset() { *x = AppliedChange_OutputValue{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[116] + mi := &file_terraform1_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7065,7 +7167,7 @@ func (x *AppliedChange_OutputValue) String() string { func (*AppliedChange_OutputValue) ProtoMessage() {} func (x *AppliedChange_OutputValue) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[116] + mi := &file_terraform1_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7078,7 +7180,7 @@ func (x *AppliedChange_OutputValue) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_OutputValue.ProtoReflect.Descriptor instead. func (*AppliedChange_OutputValue) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{34, 4} + return file_terraform1_proto_rawDescGZIP(), []int{36, 4} } func (x *AppliedChange_OutputValue) GetName() string { @@ -7104,7 +7206,7 @@ type AppliedChange_Nothing struct { func (x *AppliedChange_Nothing) Reset() { *x = AppliedChange_Nothing{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[117] + mi := &file_terraform1_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7117,7 +7219,7 @@ func (x *AppliedChange_Nothing) String() string { func (*AppliedChange_Nothing) ProtoMessage() {} func (x *AppliedChange_Nothing) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[117] + mi := &file_terraform1_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7130,7 +7232,7 @@ func (x *AppliedChange_Nothing) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_Nothing.ProtoReflect.Descriptor instead. func (*AppliedChange_Nothing) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{34, 5} + return file_terraform1_proto_rawDescGZIP(), []int{36, 5} } // ComponentInstanceStatus describes the current status of a component instance @@ -7147,7 +7249,7 @@ type StackChangeProgress_ComponentInstanceStatus struct { func (x *StackChangeProgress_ComponentInstanceStatus) Reset() { *x = StackChangeProgress_ComponentInstanceStatus{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[119] + mi := &file_terraform1_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7160,7 +7262,7 @@ func (x *StackChangeProgress_ComponentInstanceStatus) String() string { func (*StackChangeProgress_ComponentInstanceStatus) ProtoMessage() {} func (x *StackChangeProgress_ComponentInstanceStatus) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[119] + mi := &file_terraform1_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7173,7 +7275,7 @@ func (x *StackChangeProgress_ComponentInstanceStatus) ProtoReflect() protoreflec // Deprecated: Use StackChangeProgress_ComponentInstanceStatus.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ComponentInstanceStatus) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 0} + return file_terraform1_proto_rawDescGZIP(), []int{37, 0} } func (x *StackChangeProgress_ComponentInstanceStatus) GetAddr() *ComponentInstanceInStackAddr { @@ -7205,7 +7307,7 @@ type StackChangeProgress_ResourceInstanceStatus struct { func (x *StackChangeProgress_ResourceInstanceStatus) Reset() { *x = StackChangeProgress_ResourceInstanceStatus{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[120] + mi := &file_terraform1_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7218,7 +7320,7 @@ func (x *StackChangeProgress_ResourceInstanceStatus) String() string { func (*StackChangeProgress_ResourceInstanceStatus) ProtoMessage() {} func (x *StackChangeProgress_ResourceInstanceStatus) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[120] + mi := &file_terraform1_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7231,7 +7333,7 @@ func (x *StackChangeProgress_ResourceInstanceStatus) ProtoReflect() protoreflect // Deprecated: Use StackChangeProgress_ResourceInstanceStatus.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ResourceInstanceStatus) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 1} + return file_terraform1_proto_rawDescGZIP(), []int{37, 1} } func (x *StackChangeProgress_ResourceInstanceStatus) GetAddr() *ResourceInstanceObjectInStackAddr { @@ -7275,7 +7377,7 @@ type StackChangeProgress_ResourceInstancePlannedChange struct { func (x *StackChangeProgress_ResourceInstancePlannedChange) Reset() { *x = StackChangeProgress_ResourceInstancePlannedChange{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[121] + mi := &file_terraform1_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7288,7 +7390,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange) String() string { func (*StackChangeProgress_ResourceInstancePlannedChange) ProtoMessage() {} func (x *StackChangeProgress_ResourceInstancePlannedChange) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[121] + mi := &file_terraform1_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7301,7 +7403,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange) ProtoReflect() proto // Deprecated: Use StackChangeProgress_ResourceInstancePlannedChange.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ResourceInstancePlannedChange) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 2} + return file_terraform1_proto_rawDescGZIP(), []int{37, 2} } func (x *StackChangeProgress_ResourceInstancePlannedChange) GetAddr() *ResourceInstanceObjectInStackAddr { @@ -7354,7 +7456,7 @@ type StackChangeProgress_ProvisionerStatus struct { func (x *StackChangeProgress_ProvisionerStatus) Reset() { *x = StackChangeProgress_ProvisionerStatus{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[122] + mi := &file_terraform1_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7367,7 +7469,7 @@ func (x *StackChangeProgress_ProvisionerStatus) String() string { func (*StackChangeProgress_ProvisionerStatus) ProtoMessage() {} func (x *StackChangeProgress_ProvisionerStatus) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[122] + mi := &file_terraform1_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7380,7 +7482,7 @@ func (x *StackChangeProgress_ProvisionerStatus) ProtoReflect() protoreflect.Mess // Deprecated: Use StackChangeProgress_ProvisionerStatus.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ProvisionerStatus) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 3} + return file_terraform1_proto_rawDescGZIP(), []int{37, 3} } func (x *StackChangeProgress_ProvisionerStatus) GetAddr() *ResourceInstanceObjectInStackAddr { @@ -7419,7 +7521,7 @@ type StackChangeProgress_ProvisionerOutput struct { func (x *StackChangeProgress_ProvisionerOutput) Reset() { *x = StackChangeProgress_ProvisionerOutput{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[123] + mi := &file_terraform1_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7432,7 +7534,7 @@ func (x *StackChangeProgress_ProvisionerOutput) String() string { func (*StackChangeProgress_ProvisionerOutput) ProtoMessage() {} func (x *StackChangeProgress_ProvisionerOutput) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[123] + mi := &file_terraform1_proto_msgTypes[126] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7445,7 +7547,7 @@ func (x *StackChangeProgress_ProvisionerOutput) ProtoReflect() protoreflect.Mess // Deprecated: Use StackChangeProgress_ProvisionerOutput.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ProvisionerOutput) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 4} + return file_terraform1_proto_rawDescGZIP(), []int{37, 4} } func (x *StackChangeProgress_ProvisionerOutput) GetAddr() *ResourceInstanceObjectInStackAddr { @@ -7494,7 +7596,7 @@ type StackChangeProgress_ComponentInstanceChanges struct { func (x *StackChangeProgress_ComponentInstanceChanges) Reset() { *x = StackChangeProgress_ComponentInstanceChanges{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[124] + mi := &file_terraform1_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7507,7 +7609,7 @@ func (x *StackChangeProgress_ComponentInstanceChanges) String() string { func (*StackChangeProgress_ComponentInstanceChanges) ProtoMessage() {} func (x *StackChangeProgress_ComponentInstanceChanges) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[124] + mi := &file_terraform1_proto_msgTypes[127] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7520,7 +7622,7 @@ func (x *StackChangeProgress_ComponentInstanceChanges) ProtoReflect() protorefle // Deprecated: Use StackChangeProgress_ComponentInstanceChanges.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ComponentInstanceChanges) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 5} + return file_terraform1_proto_rawDescGZIP(), []int{37, 5} } func (x *StackChangeProgress_ComponentInstanceChanges) GetAddr() *ComponentInstanceInStackAddr { @@ -7579,7 +7681,7 @@ type StackChangeProgress_ComponentInstances struct { func (x *StackChangeProgress_ComponentInstances) Reset() { *x = StackChangeProgress_ComponentInstances{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[125] + mi := &file_terraform1_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7592,7 +7694,7 @@ func (x *StackChangeProgress_ComponentInstances) String() string { func (*StackChangeProgress_ComponentInstances) ProtoMessage() {} func (x *StackChangeProgress_ComponentInstances) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[125] + mi := &file_terraform1_proto_msgTypes[128] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7605,7 +7707,7 @@ func (x *StackChangeProgress_ComponentInstances) ProtoReflect() protoreflect.Mes // Deprecated: Use StackChangeProgress_ComponentInstances.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ComponentInstances) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 6} + return file_terraform1_proto_rawDescGZIP(), []int{37, 6} } func (x *StackChangeProgress_ComponentInstances) GetComponentAddr() string { @@ -7633,7 +7735,7 @@ type StackChangeProgress_ResourceInstancePlannedChange_Moved struct { func (x *StackChangeProgress_ResourceInstancePlannedChange_Moved) Reset() { *x = StackChangeProgress_ResourceInstancePlannedChange_Moved{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[126] + mi := &file_terraform1_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7646,7 +7748,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange_Moved) String() strin func (*StackChangeProgress_ResourceInstancePlannedChange_Moved) ProtoMessage() {} func (x *StackChangeProgress_ResourceInstancePlannedChange_Moved) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[126] + mi := &file_terraform1_proto_msgTypes[129] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7659,7 +7761,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange_Moved) ProtoReflect() // Deprecated: Use StackChangeProgress_ResourceInstancePlannedChange_Moved.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ResourceInstancePlannedChange_Moved) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 2, 0} + return file_terraform1_proto_rawDescGZIP(), []int{37, 2, 0} } func (x *StackChangeProgress_ResourceInstancePlannedChange_Moved) GetPrevAddr() *ResourceInstanceInStackAddr { @@ -7680,7 +7782,7 @@ type StackChangeProgress_ResourceInstancePlannedChange_Imported struct { func (x *StackChangeProgress_ResourceInstancePlannedChange_Imported) Reset() { *x = StackChangeProgress_ResourceInstancePlannedChange_Imported{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[127] + mi := &file_terraform1_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7693,7 +7795,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange_Imported) String() st func (*StackChangeProgress_ResourceInstancePlannedChange_Imported) ProtoMessage() {} func (x *StackChangeProgress_ResourceInstancePlannedChange_Imported) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[127] + mi := &file_terraform1_proto_msgTypes[130] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7706,7 +7808,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange_Imported) ProtoReflec // Deprecated: Use StackChangeProgress_ResourceInstancePlannedChange_Imported.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ResourceInstancePlannedChange_Imported) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 2, 1} + return file_terraform1_proto_rawDescGZIP(), []int{37, 2, 1} } func (x *StackChangeProgress_ResourceInstancePlannedChange_Imported) GetImportId() string { @@ -7730,7 +7832,7 @@ type Schema_Block struct { func (x *Schema_Block) Reset() { *x = Schema_Block{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[128] + mi := &file_terraform1_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7743,7 +7845,7 @@ func (x *Schema_Block) String() string { func (*Schema_Block) ProtoMessage() {} func (x *Schema_Block) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[128] + mi := &file_terraform1_proto_msgTypes[131] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7756,7 +7858,7 @@ func (x *Schema_Block) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema_Block.ProtoReflect.Descriptor instead. func (*Schema_Block) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{39, 0} + return file_terraform1_proto_rawDescGZIP(), []int{41, 0} } func (x *Schema_Block) GetAttributes() []*Schema_Attribute { @@ -7806,7 +7908,7 @@ type Schema_Attribute struct { func (x *Schema_Attribute) Reset() { *x = Schema_Attribute{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[129] + mi := &file_terraform1_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7819,7 +7921,7 @@ func (x *Schema_Attribute) String() string { func (*Schema_Attribute) ProtoMessage() {} func (x *Schema_Attribute) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[129] + mi := &file_terraform1_proto_msgTypes[132] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7832,7 +7934,7 @@ func (x *Schema_Attribute) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema_Attribute.ProtoReflect.Descriptor instead. func (*Schema_Attribute) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{39, 1} + return file_terraform1_proto_rawDescGZIP(), []int{41, 1} } func (x *Schema_Attribute) GetName() string { @@ -7911,7 +8013,7 @@ type Schema_NestedBlock struct { func (x *Schema_NestedBlock) Reset() { *x = Schema_NestedBlock{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[130] + mi := &file_terraform1_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7924,7 +8026,7 @@ func (x *Schema_NestedBlock) String() string { func (*Schema_NestedBlock) ProtoMessage() {} func (x *Schema_NestedBlock) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[130] + mi := &file_terraform1_proto_msgTypes[133] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7937,7 +8039,7 @@ func (x *Schema_NestedBlock) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema_NestedBlock.ProtoReflect.Descriptor instead. func (*Schema_NestedBlock) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{39, 2} + return file_terraform1_proto_rawDescGZIP(), []int{41, 2} } func (x *Schema_NestedBlock) GetTypeName() string { @@ -7973,7 +8075,7 @@ type Schema_Object struct { func (x *Schema_Object) Reset() { *x = Schema_Object{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[131] + mi := &file_terraform1_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7986,7 +8088,7 @@ func (x *Schema_Object) String() string { func (*Schema_Object) ProtoMessage() {} func (x *Schema_Object) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[131] + mi := &file_terraform1_proto_msgTypes[134] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7999,7 +8101,7 @@ func (x *Schema_Object) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema_Object.ProtoReflect.Descriptor instead. func (*Schema_Object) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{39, 3} + return file_terraform1_proto_rawDescGZIP(), []int{41, 3} } func (x *Schema_Object) GetAttributes() []*Schema_Attribute { @@ -8028,7 +8130,7 @@ type Schema_DocString struct { func (x *Schema_DocString) Reset() { *x = Schema_DocString{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[132] + mi := &file_terraform1_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8041,7 +8143,7 @@ func (x *Schema_DocString) String() string { func (*Schema_DocString) ProtoMessage() {} func (x *Schema_DocString) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[132] + mi := &file_terraform1_proto_msgTypes[135] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8054,7 +8156,7 @@ func (x *Schema_DocString) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema_DocString.ProtoReflect.Descriptor instead. func (*Schema_DocString) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{39, 4} + return file_terraform1_proto_rawDescGZIP(), []int{41, 4} } func (x *Schema_DocString) GetDescription() string { @@ -8082,7 +8184,7 @@ type ProviderPackageVersions_Request struct { func (x *ProviderPackageVersions_Request) Reset() { *x = ProviderPackageVersions_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[133] + mi := &file_terraform1_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8095,7 +8197,7 @@ func (x *ProviderPackageVersions_Request) String() string { func (*ProviderPackageVersions_Request) ProtoMessage() {} func (x *ProviderPackageVersions_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[133] + mi := &file_terraform1_proto_msgTypes[136] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8108,7 +8210,7 @@ func (x *ProviderPackageVersions_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use ProviderPackageVersions_Request.ProtoReflect.Descriptor instead. func (*ProviderPackageVersions_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{40, 0} + return file_terraform1_proto_rawDescGZIP(), []int{42, 0} } func (x *ProviderPackageVersions_Request) GetSourceAddr() string { @@ -8130,7 +8232,7 @@ type ProviderPackageVersions_Response struct { func (x *ProviderPackageVersions_Response) Reset() { *x = ProviderPackageVersions_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[134] + mi := &file_terraform1_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8143,7 +8245,7 @@ func (x *ProviderPackageVersions_Response) String() string { func (*ProviderPackageVersions_Response) ProtoMessage() {} func (x *ProviderPackageVersions_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[134] + mi := &file_terraform1_proto_msgTypes[137] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8156,7 +8258,7 @@ func (x *ProviderPackageVersions_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use ProviderPackageVersions_Response.ProtoReflect.Descriptor instead. func (*ProviderPackageVersions_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{40, 1} + return file_terraform1_proto_rawDescGZIP(), []int{42, 1} } func (x *ProviderPackageVersions_Response) GetVersions() []string { @@ -8188,7 +8290,7 @@ type FetchProviderPackage_Request struct { func (x *FetchProviderPackage_Request) Reset() { *x = FetchProviderPackage_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[135] + mi := &file_terraform1_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8201,7 +8303,7 @@ func (x *FetchProviderPackage_Request) String() string { func (*FetchProviderPackage_Request) ProtoMessage() {} func (x *FetchProviderPackage_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[135] + mi := &file_terraform1_proto_msgTypes[138] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8214,7 +8316,7 @@ func (x *FetchProviderPackage_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchProviderPackage_Request.ProtoReflect.Descriptor instead. func (*FetchProviderPackage_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{41, 0} + return file_terraform1_proto_rawDescGZIP(), []int{43, 0} } func (x *FetchProviderPackage_Request) GetCacheDir() string { @@ -8269,7 +8371,7 @@ type FetchProviderPackage_Response struct { func (x *FetchProviderPackage_Response) Reset() { *x = FetchProviderPackage_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[136] + mi := &file_terraform1_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8282,7 +8384,7 @@ func (x *FetchProviderPackage_Response) String() string { func (*FetchProviderPackage_Response) ProtoMessage() {} func (x *FetchProviderPackage_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[136] + mi := &file_terraform1_proto_msgTypes[139] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8295,7 +8397,7 @@ func (x *FetchProviderPackage_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchProviderPackage_Response.ProtoReflect.Descriptor instead. func (*FetchProviderPackage_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{41, 1} + return file_terraform1_proto_rawDescGZIP(), []int{43, 1} } func (x *FetchProviderPackage_Response) GetResults() []*FetchProviderPackage_PlatformResult { @@ -8324,7 +8426,7 @@ type FetchProviderPackage_PlatformResult struct { func (x *FetchProviderPackage_PlatformResult) Reset() { *x = FetchProviderPackage_PlatformResult{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[137] + mi := &file_terraform1_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8337,7 +8439,7 @@ func (x *FetchProviderPackage_PlatformResult) String() string { func (*FetchProviderPackage_PlatformResult) ProtoMessage() {} func (x *FetchProviderPackage_PlatformResult) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[137] + mi := &file_terraform1_proto_msgTypes[140] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8350,7 +8452,7 @@ func (x *FetchProviderPackage_PlatformResult) ProtoReflect() protoreflect.Messag // Deprecated: Use FetchProviderPackage_PlatformResult.ProtoReflect.Descriptor instead. func (*FetchProviderPackage_PlatformResult) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{41, 2} + return file_terraform1_proto_rawDescGZIP(), []int{43, 2} } func (x *FetchProviderPackage_PlatformResult) GetProvider() *ProviderPackage { @@ -8378,7 +8480,7 @@ type ModulePackageVersions_Request struct { func (x *ModulePackageVersions_Request) Reset() { *x = ModulePackageVersions_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[138] + mi := &file_terraform1_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8391,7 +8493,7 @@ func (x *ModulePackageVersions_Request) String() string { func (*ModulePackageVersions_Request) ProtoMessage() {} func (x *ModulePackageVersions_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[138] + mi := &file_terraform1_proto_msgTypes[141] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8404,7 +8506,7 @@ func (x *ModulePackageVersions_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageVersions_Request.ProtoReflect.Descriptor instead. func (*ModulePackageVersions_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{42, 0} + return file_terraform1_proto_rawDescGZIP(), []int{44, 0} } func (x *ModulePackageVersions_Request) GetSourceAddr() string { @@ -8426,7 +8528,7 @@ type ModulePackageVersions_Response struct { func (x *ModulePackageVersions_Response) Reset() { *x = ModulePackageVersions_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[139] + mi := &file_terraform1_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8439,7 +8541,7 @@ func (x *ModulePackageVersions_Response) String() string { func (*ModulePackageVersions_Response) ProtoMessage() {} func (x *ModulePackageVersions_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[139] + mi := &file_terraform1_proto_msgTypes[142] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8452,7 +8554,7 @@ func (x *ModulePackageVersions_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageVersions_Response.ProtoReflect.Descriptor instead. func (*ModulePackageVersions_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{42, 1} + return file_terraform1_proto_rawDescGZIP(), []int{44, 1} } func (x *ModulePackageVersions_Response) GetVersions() []string { @@ -8481,7 +8583,7 @@ type ModulePackageSourceAddr_Request struct { func (x *ModulePackageSourceAddr_Request) Reset() { *x = ModulePackageSourceAddr_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[140] + mi := &file_terraform1_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8494,7 +8596,7 @@ func (x *ModulePackageSourceAddr_Request) String() string { func (*ModulePackageSourceAddr_Request) ProtoMessage() {} func (x *ModulePackageSourceAddr_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[140] + mi := &file_terraform1_proto_msgTypes[143] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8507,7 +8609,7 @@ func (x *ModulePackageSourceAddr_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageSourceAddr_Request.ProtoReflect.Descriptor instead. func (*ModulePackageSourceAddr_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{43, 0} + return file_terraform1_proto_rawDescGZIP(), []int{45, 0} } func (x *ModulePackageSourceAddr_Request) GetSourceAddr() string { @@ -8536,7 +8638,7 @@ type ModulePackageSourceAddr_Response struct { func (x *ModulePackageSourceAddr_Response) Reset() { *x = ModulePackageSourceAddr_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[141] + mi := &file_terraform1_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8549,7 +8651,7 @@ func (x *ModulePackageSourceAddr_Response) String() string { func (*ModulePackageSourceAddr_Response) ProtoMessage() {} func (x *ModulePackageSourceAddr_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[141] + mi := &file_terraform1_proto_msgTypes[144] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8562,7 +8664,7 @@ func (x *ModulePackageSourceAddr_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageSourceAddr_Response.ProtoReflect.Descriptor instead. func (*ModulePackageSourceAddr_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{43, 1} + return file_terraform1_proto_rawDescGZIP(), []int{45, 1} } func (x *ModulePackageSourceAddr_Response) GetUrl() string { @@ -8591,7 +8693,7 @@ type FetchModulePackage_Request struct { func (x *FetchModulePackage_Request) Reset() { *x = FetchModulePackage_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[142] + mi := &file_terraform1_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8604,7 +8706,7 @@ func (x *FetchModulePackage_Request) String() string { func (*FetchModulePackage_Request) ProtoMessage() {} func (x *FetchModulePackage_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[142] + mi := &file_terraform1_proto_msgTypes[145] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8617,7 +8719,7 @@ func (x *FetchModulePackage_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchModulePackage_Request.ProtoReflect.Descriptor instead. func (*FetchModulePackage_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{44, 0} + return file_terraform1_proto_rawDescGZIP(), []int{46, 0} } func (x *FetchModulePackage_Request) GetCacheDir() string { @@ -8645,7 +8747,7 @@ type FetchModulePackage_Response struct { func (x *FetchModulePackage_Response) Reset() { *x = FetchModulePackage_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[143] + mi := &file_terraform1_proto_msgTypes[146] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8658,7 +8760,7 @@ func (x *FetchModulePackage_Response) String() string { func (*FetchModulePackage_Response) ProtoMessage() {} func (x *FetchModulePackage_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[143] + mi := &file_terraform1_proto_msgTypes[146] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8671,7 +8773,7 @@ func (x *FetchModulePackage_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchModulePackage_Response.ProtoReflect.Descriptor instead. func (*FetchModulePackage_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{44, 1} + return file_terraform1_proto_rawDescGZIP(), []int{46, 1} } func (x *FetchModulePackage_Response) GetDiagnostics() []*Diagnostic { @@ -8687,1350 +8789,1366 @@ var file_terraform1_proto_rawDesc = []byte{ 0x0a, 0x10, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, - 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xaa, 0x01, 0x0a, 0x09, 0x48, 0x61, - 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x1a, 0x4d, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd6, 0x01, 0x0a, 0x09, 0x48, 0x61, + 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x1a, 0x79, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x4e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x14, 0x0a, 0x12, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, - 0x65, 0x73, 0x22, 0x7a, 0x0a, 0x10, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x28, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, - 0x1a, 0x3c, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x14, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x68, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x5c, - 0x0a, 0x11, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, - 0x64, 0x6c, 0x65, 0x1a, 0x3b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, + 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x1a, 0x4e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, + 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0xab, + 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x45, 0x0a, 0x0b, 0x63, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, + 0x1a, 0x5a, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x26, 0x0a, 0x0e, + 0x48, 0x6f, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x7a, 0x0a, 0x10, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x28, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, + 0x74, 0x68, 0x1a, 0x3c, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x95, 0x02, 0x0a, - 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, - 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x7d, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x6e, - 0x64, 0x6c, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x12, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x7c, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, - 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, - 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, - 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, - 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, - 0x74, 0x69, 0x63, 0x73, 0x22, 0xb4, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, - 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x57, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4c, 0x0a, 0x13, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x42, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, - 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, - 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x65, 0x0a, 0x14, 0x43, - 0x6c, 0x6f, 0x73, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, - 0x63, 0x6b, 0x73, 0x1a, 0x41, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, - 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x6f, 0x63, - 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, - 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0xba, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, - 0x63, 0x69, 0x65, 0x73, 0x1a, 0x41, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x6f, - 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, - 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x56, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x12, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x11, 0x73, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, - 0x8b, 0x11, 0x0a, 0x18, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x1a, 0xc0, 0x03, 0x0a, - 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, - 0x65, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x63, - 0x68, 0x65, 0x44, 0x69, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, + 0x22, 0x5c, 0x0a, 0x11, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x3b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x30, 0x0a, 0x14, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, + 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x95, + 0x02, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, + 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x7d, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x12, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x7c, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, + 0x63, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, + 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x38, 0x0a, 0x0b, + 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, + 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, + 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xb4, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, + 0x1a, 0x57, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4c, 0x0a, 0x13, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x42, 0x0a, 0x08, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, - 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x6d, 0x0a, - 0x14, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, - 0x6c, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x12, 0x2b, 0x0a, 0x11, - 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, - 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, - 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x1a, 0xc3, 0x01, 0x0a, 0x0d, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x18, 0x0a, 0x06, 0x64, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x64, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x6d, - 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x69, - 0x72, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6d, 0x69, 0x72, - 0x72, 0x6f, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x10, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x55, 0x72, - 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, - 0xab, 0x0d, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4e, 0x0a, 0x07, 0x70, 0x65, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x48, 0x00, - 0x52, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x69, 0x0a, 0x11, 0x61, 0x6c, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x48, 0x00, 0x52, 0x10, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x57, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x5f, 0x69, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, + 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x65, 0x0a, + 0x14, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, + 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x41, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, + 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, + 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xba, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, + 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, + 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x1a, 0x41, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, + 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, + 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x56, 0x0a, 0x08, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x12, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x11, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x22, 0x8b, 0x11, 0x0a, 0x18, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x1a, 0xc0, + 0x03, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x44, 0x69, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, + 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, + 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, + 0x6d, 0x0a, 0x14, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x12, 0x2b, + 0x0a, 0x11, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, + 0x6f, 0x72, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6f, 0x76, 0x65, 0x72, 0x72, + 0x69, 0x64, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x1a, 0xc3, 0x01, 0x0a, 0x0d, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x18, 0x0a, + 0x06, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, + 0x06, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x5f, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, + 0x44, 0x69, 0x72, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6d, + 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x10, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, + 0x55, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x1a, 0xab, 0x0d, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4e, 0x0a, 0x07, 0x70, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x48, 0x00, 0x52, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x69, 0x0a, 0x11, 0x61, + 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x12, 0x61, 0x0a, - 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, - 0x74, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x42, 0x65, 0x67, 0x69, 0x6e, - 0x12, 0x61, 0x0a, 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x12, 0x64, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x77, 0x61, 0x72, - 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x58, 0x0a, 0x0b, 0x66, 0x65, 0x74, - 0x63, 0x68, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, - 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, - 0x42, 0x65, 0x67, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x66, 0x65, 0x74, 0x63, 0x68, 0x42, 0x65, - 0x67, 0x69, 0x6e, 0x12, 0x61, 0x0a, 0x0e, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x66, 0x65, 0x74, 0x63, 0x68, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, - 0x73, 0x74, 0x69, 0x63, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, - 0x69, 0x63, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x1a, 0x65, 0x0a, 0x07, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x5a, 0x0a, 0x08, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x08, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x1a, 0x52, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, - 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x4c, 0x0a, 0x0f, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x4f, 0x0a, 0x10, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1f, 0x0a, - 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x1a, - 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x8f, 0x01, 0x0a, 0x0a, 0x46, - 0x65, 0x74, 0x63, 0x68, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x12, 0x65, 0x0a, 0x10, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xf5, 0x02, 0x0a, - 0x0d, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x65, - 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x10, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x57, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x5f, + 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x64, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x43, 0x2e, 0x74, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x12, + 0x61, 0x0a, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, + 0x69, 0x6e, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x42, 0x65, 0x67, + 0x69, 0x6e, 0x12, 0x61, 0x0a, 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x64, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x77, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x58, 0x0a, 0x0b, 0x66, + 0x65, 0x74, 0x63, 0x68, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x35, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x65, 0x74, + 0x63, 0x68, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x66, 0x65, 0x74, 0x63, 0x68, + 0x42, 0x65, 0x67, 0x69, 0x6e, 0x12, 0x61, 0x0a, 0x0e, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x66, 0x65, 0x74, 0x63, 0x68, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x64, 0x69, 0x61, 0x67, + 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, + 0x73, 0x74, 0x69, 0x63, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x1a, 0x65, 0x0a, 0x07, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x5a, 0x0a, + 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x52, + 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x1a, 0x52, 0x0a, 0x13, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, + 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, + 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x4c, 0x0a, + 0x0f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, + 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x4f, 0x0a, 0x10, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, + 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x8f, 0x01, 0x0a, + 0x0a, 0x46, 0x65, 0x74, 0x63, 0x68, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x12, 0x65, 0x0a, 0x10, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xf5, + 0x02, 0x0a, 0x0d, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x12, 0x65, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x74, 0x65, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, - 0x0a, 0x61, 0x75, 0x74, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x6b, - 0x65, 0x79, 0x5f, 0x69, 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6b, 0x65, 0x79, 0x49, 0x64, 0x46, 0x6f, - 0x72, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x22, 0x6a, 0x0a, 0x0a, 0x41, 0x75, 0x74, 0x68, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, - 0x4e, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, - 0x43, 0x48, 0x45, 0x43, 0x4b, 0x53, 0x55, 0x4d, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x4f, 0x46, - 0x46, 0x49, 0x43, 0x49, 0x41, 0x4c, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, 0x02, 0x12, - 0x12, 0x0a, 0x0e, 0x50, 0x41, 0x52, 0x54, 0x4e, 0x45, 0x52, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, - 0x44, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x53, 0x49, 0x47, 0x4e, - 0x45, 0x44, 0x10, 0x04, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xae, 0x01, - 0x0a, 0x17, 0x4f, 0x70, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x1a, 0x53, 0x0a, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x64, 0x69, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x63, 0x68, 0x65, 0x44, 0x69, - 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x70, 0x6c, - 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6f, 0x76, - 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x1a, 0x3e, - 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, - 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x65, - 0x0a, 0x18, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x1a, 0x3d, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xad, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x07, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x64, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x43, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2b, 0x0a, + 0x12, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6b, 0x65, 0x79, 0x49, 0x64, + 0x46, 0x6f, 0x72, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x22, 0x6a, 0x0a, 0x0a, 0x41, 0x75, + 0x74, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x53, 0x55, 0x4d, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, + 0x4f, 0x46, 0x46, 0x49, 0x43, 0x49, 0x41, 0x4c, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, + 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x41, 0x52, 0x54, 0x4e, 0x45, 0x52, 0x5f, 0x53, 0x49, 0x47, + 0x4e, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x53, 0x49, + 0x47, 0x4e, 0x45, 0x44, 0x10, 0x04, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, + 0xae, 0x01, 0x0a, 0x17, 0x4f, 0x70, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x1a, 0x53, 0x0a, 0x07, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, + 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x44, 0x69, 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, + 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x1a, 0x3e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x15, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, + 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x22, 0x65, 0x0a, 0x18, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x1a, 0x3d, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x58, 0x0a, 0x08, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x13, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x52, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x7a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, - 0x74, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x09, 0x0a, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x58, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x13, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x12, 0x61, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x22, 0xe3, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, 0x8d, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, - 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x3e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, - 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x64, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0xd3, 0x03, - 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x12, 0x3b, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0e, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x6a, 0x0a, - 0x16, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x14, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x13, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x1a, 0x5b, 0x0a, 0x19, - 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x16, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x8d, 0x02, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x7d, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, - 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0d, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x74, 0x0a, - 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, - 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, - 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, - 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, - 0x69, 0x63, 0x73, 0x22, 0x60, 0x0a, 0x17, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x39, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, - 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8a, 0x02, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xa5, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, - 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, - 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x44, 0x0a, 0x08, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, - 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, - 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, - 0x63, 0x73, 0x22, 0xdb, 0x08, 0x0a, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x39, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xad, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x3d, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x58, 0x0a, + 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x13, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x52, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x7a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x75, + 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x09, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x58, 0x0a, 0x08, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x13, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, + 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x73, 0x22, 0xe3, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, 0x8d, 0x01, 0x0a, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x3e, 0x0a, 0x08, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x64, 0x0a, 0x0f, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, + 0xd3, 0x03, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x12, 0x3b, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x0e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x6a, 0x0a, 0x16, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x34, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x14, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x13, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x1a, 0x5b, + 0x0a, 0x19, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x16, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8d, 0x02, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x1a, 0x7d, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x68, 0x61, 0x6e, + 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x40, 0x0a, + 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, + 0x74, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, + 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x60, 0x0a, 0x17, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x1a, 0x39, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8a, 0x02, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xa5, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x1a, 0x5c, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, - 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x1a, 0xe4, 0x03, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x68, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x75, 0x0a, 0x0f, 0x65, 0x6d, - 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x6d, - 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x73, 0x1a, 0x75, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7d, 0x0a, 0x13, 0x45, 0x6d, 0x62, 0x65, - 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, - 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, - 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xd8, 0x01, 0x0a, 0x0d, 0x45, 0x6d, 0x62, 0x65, - 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x54, 0x0a, 0x09, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, - 0x12, 0x50, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x6c, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, + 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, + 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, + 0x64, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x44, + 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, + 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x22, 0xdb, 0x08, 0x0a, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x39, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x5c, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x50, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x1a, 0xa9, 0x01, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, - 0x72, 0x12, 0x54, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x09, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x22, 0x30, - 0x0a, 0x09, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x0a, 0x0a, 0x06, 0x53, - 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x4f, 0x55, 0x4e, 0x54, - 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x4f, 0x52, 0x5f, 0x45, 0x41, 0x43, 0x48, 0x10, 0x02, - 0x22, 0xb9, 0x06, 0x0a, 0x10, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x1a, 0xce, 0x04, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x31, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x6e, - 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x5e, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, - 0x63, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, - 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x15, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, - 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x12, 0x58, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x56, 0x0a, 0x12, 0x50, 0x72, - 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x62, 0x0a, 0x10, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x69, 0x67, 0x1a, 0xe4, 0x03, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x68, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x75, 0x0a, 0x0f, + 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, + 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x73, 0x1a, 0x75, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xd3, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x42, 0x0a, 0x0e, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, - 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x48, 0x00, 0x52, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x12, 0x3d, - 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x07, 0x0a, - 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x0a, 0x22, 0x86, 0x04, 0x0a, - 0x11, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x1a, 0xa0, 0x02, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, - 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, - 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, - 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x34, - 0x0a, 0x16, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x4b, 0x65, 0x79, 0x73, 0x12, 0x3d, 0x0a, 0x0f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x41, 0x6e, 0x79, 0x52, 0x0e, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, - 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x05, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7d, 0x0a, 0x13, 0x45, 0x6d, + 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xd8, 0x01, 0x0a, 0x0d, 0x45, 0x6d, + 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x54, 0x0a, 0x09, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x36, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x73, 0x12, 0x50, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xa9, 0x01, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, + 0x64, 0x64, 0x72, 0x12, 0x54, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x09, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, + 0x22, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x0a, 0x0a, + 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x4f, 0x55, + 0x4e, 0x54, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x4f, 0x52, 0x5f, 0x45, 0x41, 0x43, 0x48, + 0x10, 0x02, 0x22, 0xb9, 0x06, 0x0a, 0x10, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x1a, 0xce, 0x04, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x70, 0x6c, + 0x61, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x5e, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, + 0x75, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, + 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, + 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, + 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x32, + 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x12, 0x58, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0b, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x56, 0x0a, 0x12, + 0x50, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x62, 0x0a, 0x10, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x38, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xd3, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x42, 0x0a, 0x0e, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, + 0x73, 0x74, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, + 0x12, 0x3d, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, + 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x0a, 0x22, 0x86, + 0x04, 0x0a, 0x11, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x1a, 0xa0, 0x02, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x12, 0x34, 0x0a, 0x16, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x14, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x3d, 0x0a, 0x0f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, + 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0e, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, + 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, + 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x32, 0x0a, + 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, + 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x1a, 0xcd, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x42, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, + 0x74, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, + 0x63, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x12, + 0x3d, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x07, + 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x91, 0x05, 0x0a, 0x12, 0x4f, 0x70, 0x65, 0x6e, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0xfe, + 0x03, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x47, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, + 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x4a, - 0x04, 0x08, 0x02, 0x10, 0x03, 0x1a, 0xcd, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x42, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, - 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x48, - 0x00, 0x52, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x12, 0x3d, 0x0a, - 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x07, 0x0a, 0x05, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x91, 0x05, 0x0a, 0x12, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0xfe, 0x03, 0x0a, - 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x47, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, - 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, - 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, - 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x5a, 0x0a, - 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x4e, 0x0a, 0x0a, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x62, 0x0a, 0x10, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, - 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7a, 0x0a, - 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x74, 0x61, - 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x68, 0x61, 0x6e, - 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, - 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, - 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x99, 0x02, 0x0a, 0x17, 0x49, 0x6e, - 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x85, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x14, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x72, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0d, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x72, 0x63, 0x12, 0x1d, - 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x76, 0x0a, - 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x64, - 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, - 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, - 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x61, 0x0a, 0x0c, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x70, 0x61, 0x63, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x70, 0x61, 0x63, 0x6b, 0x12, - 0x37, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x09, 0x73, - 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x22, 0x6c, 0x0a, 0x12, 0x44, 0x79, 0x6e, 0x61, - 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x2a, - 0x0a, 0x03, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x6f, 0x6c, 0x64, 0x12, 0x2a, 0x0a, 0x03, 0x6e, 0x65, - 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x03, 0x6e, 0x65, 0x77, 0x22, 0x84, 0x01, 0x0a, 0x16, 0x44, 0x79, 0x6e, 0x61, 0x6d, - 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, - 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x3a, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xdd, 0x01, - 0x0a, 0x0d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, - 0x34, 0x0a, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x52, 0x05, - 0x73, 0x74, 0x65, 0x70, 0x73, 0x1a, 0x95, 0x01, 0x0a, 0x04, 0x53, 0x74, 0x65, 0x70, 0x12, 0x27, - 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x65, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, - 0x79, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x48, 0x00, 0x52, 0x0d, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x49, 0x6e, - 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x7d, 0x0a, - 0x1c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x12, 0x25, 0x0a, - 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x41, 0x64, 0x64, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x22, 0x8b, 0x01, 0x0a, - 0x1b, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x12, 0x36, 0x0a, 0x17, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x41, 0x64, 0x64, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x22, 0xb2, 0x01, 0x0a, 0x21, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, - 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, - 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x1f, - 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x22, - 0x43, 0x0a, 0x0d, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe1, 0x0c, 0x0a, 0x0d, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x03, 0x72, 0x61, 0x77, 0x12, 0x4f, - 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, - 0xfd, 0x02, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6b, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, - 0x6e, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, - 0x65, 0x64, 0x12, 0x68, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x48, 0x00, 0x52, 0x17, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x59, 0x0a, 0x14, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x70, 0x6c, 0x61, - 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x48, 0x00, 0x52, 0x12, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0e, 0x70, 0x6c, 0x61, 0x6e, 0x5f, - 0x61, 0x70, 0x70, 0x6c, 0x79, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, - 0x00, 0x52, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x61, 0x62, 0x6c, 0x65, - 0x42, 0x0d, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, - 0xa8, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, - 0x64, 0x64, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x63, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x70, 0x6c, - 0x61, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x1a, 0x97, 0x06, 0x0a, 0x10, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, - 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, - 0x64, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x05, - 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x52, 0x05, 0x6d, - 0x6f, 0x76, 0x65, 0x64, 0x12, 0x4f, 0x0a, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x08, 0x69, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x46, - 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x52, 0x75, - 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x6e, 0x6f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6e, 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 0x12, 0x3e, 0x0a, 0x0d, - 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x0b, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0c, - 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x73, 0x1a, 0x4d, 0x0a, 0x05, - 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x61, 0x64, - 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, - 0x72, 0x52, 0x08, 0x70, 0x72, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x27, 0x0a, 0x08, 0x49, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x49, 0x64, 0x1a, 0x8b, 0x01, 0x0a, 0x0b, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x07, 0x22, 0xb2, 0x0a, 0x0a, 0x0d, 0x41, 0x70, 0x70, - 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x03, 0x72, 0x61, - 0x77, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x2e, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x03, 0x72, 0x61, - 0x77, 0x12, 0x4f, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x1a, 0x49, 0x0a, 0x09, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, + 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, + 0x5a, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x4e, 0x0a, 0x0a, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x62, 0x0a, 0x10, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x82, 0x03, - 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x12, 0x59, 0x0a, 0x11, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, - 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x10, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, - 0x4a, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x0b, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x5c, 0x0a, 0x12, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x08, 0x08, 0xa0, 0x9c, 0x01, 0x10, 0xa1, - 0x9c, 0x01, 0x1a, 0xaf, 0x02, 0x0a, 0x10, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x6e, 0x65, - 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x79, 0x12, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x7a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x68, + 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, + 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x99, 0x02, 0x0a, 0x17, + 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x85, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x73, + 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x14, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x72, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0d, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x72, 0x63, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x1a, + 0x76, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x38, 0x0a, + 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, + 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x61, 0x0a, 0x0c, 0x44, 0x79, 0x6e, 0x61, 0x6d, + 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x70, 0x61, + 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x70, 0x61, 0x63, + 0x6b, 0x12, 0x37, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, + 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x22, 0x6c, 0x0a, 0x12, 0x44, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x12, 0x2a, 0x0a, 0x03, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, - 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x6f, - 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, - 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x69, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x69, 0x6d, 0x1a, 0xb1, 0x02, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, - 0x72, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x62, 0x0a, 0x0d, 0x6f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, - 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x59, 0x0a, - 0x11, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0b, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x6e, - 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, - 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x1a, 0x09, 0x0a, 0x07, 0x4e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x22, 0xdd, 0x14, - 0x0a, 0x13, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x75, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x48, 0x00, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x72, 0x0a, 0x18, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x16, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x88, 0x01, 0x0a, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, - 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1d, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, - 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x62, 0x0a, 0x12, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x11, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x62, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x5f, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x48, 0x00, - 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x12, 0x78, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x73, 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x65, 0x0a, - 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x65, 0x72, + 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x6f, 0x6c, 0x64, 0x12, 0x2a, 0x0a, 0x03, + 0x6e, 0x65, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x03, 0x6e, 0x65, 0x77, 0x22, 0x84, 0x01, 0x0a, 0x16, 0x44, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x3a, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x22, + 0xdd, 0x01, 0x0a, 0x0d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, + 0x68, 0x12, 0x34, 0x0a, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x2e, 0x53, 0x74, 0x65, 0x70, + 0x52, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x1a, 0x95, 0x01, 0x0a, 0x04, 0x53, 0x74, 0x65, 0x70, + 0x12, 0x27, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x65, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x4b, 0x65, 0x79, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, + 0x49, 0x6e, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, + 0x7d, 0x0a, 0x1c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x12, + 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x22, 0x8b, + 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x12, 0x36, + 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x22, 0xb2, 0x01, 0x0a, + 0x21, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, + 0x64, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, + 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x4b, 0x65, + 0x79, 0x22, 0x43, 0x0a, 0x0d, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe1, 0x0c, 0x0a, 0x0d, 0x50, 0x6c, 0x61, 0x6e, 0x6e, + 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x03, 0x72, 0x61, 0x77, + 0x12, 0x4f, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x1a, 0xfd, 0x02, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6b, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6c, + 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, + 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x68, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x17, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x59, + 0x0a, 0x14, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x70, + 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x12, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0e, 0x70, 0x6c, 0x61, + 0x6e, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x61, 0x62, + 0x6c, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x1a, 0xa8, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, + 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x5f, + 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x70, 0x6c, 0x61, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x1a, 0x97, 0x06, 0x0a, + 0x10, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, + 0x61, 0x64, 0x64, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x46, + 0x0a, 0x05, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, + 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x52, + 0x05, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x4f, 0x0a, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x08, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, + 0x12, 0x46, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x72, 0x75, 0x6e, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, + 0x52, 0x75, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x6e, 0x6f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x73, 0x69, + 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6e, 0x6f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 0x12, 0x3e, + 0x0a, 0x0d, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, + 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, + 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x73, 0x1a, 0x4d, + 0x0a, 0x05, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x76, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, + 0x64, 0x64, 0x72, 0x52, 0x08, 0x70, 0x72, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x27, 0x0a, + 0x08, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x49, 0x64, 0x1a, 0x8b, 0x01, 0x0a, 0x0b, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x0a, 0x06, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x07, 0x22, 0xb2, 0x0a, 0x0a, 0x0d, 0x41, + 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x03, + 0x72, 0x61, 0x77, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x03, + 0x72, 0x61, 0x77, 0x12, 0x4f, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x49, 0x0a, 0x09, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x1a, + 0x82, 0x03, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x59, 0x0a, 0x11, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, + 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, + 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x12, 0x4a, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, + 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x5c, 0x0a, + 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x08, 0x08, 0xa0, 0x9c, 0x01, + 0x10, 0xa1, 0x9c, 0x01, 0x1a, 0xaf, 0x02, 0x0a, 0x10, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x35, 0x0a, 0x09, + 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6d, 0x1a, 0xb1, 0x02, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x41, + 0x64, 0x64, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x62, 0x0a, 0x0d, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, + 0x59, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0b, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, + 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x09, 0x0a, 0x07, 0x4e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x22, + 0xdd, 0x14, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x75, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x48, 0x00, - 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x1a, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x3c, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x56, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3e, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x65, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, - 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x4c, - 0x41, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x4c, 0x41, 0x4e, - 0x4e, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x50, 0x50, 0x4c, 0x59, 0x49, 0x4e, - 0x47, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, 0x05, - 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x06, 0x1a, 0xde, 0x02, - 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x55, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3d, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x22, 0x84, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, - 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, - 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, - 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x50, - 0x4c, 0x41, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x4c, 0x41, - 0x4e, 0x4e, 0x45, 0x44, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x50, 0x50, 0x4c, 0x59, 0x49, - 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, - 0x07, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x08, 0x1a, 0xf0, - 0x03, 0x0a, 0x1d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, - 0x64, 0x64, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x05, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x52, 0x05, 0x6d, 0x6f, 0x76, 0x65, 0x64, - 0x12, 0x62, 0x0a, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x08, 0x69, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x4d, 0x0a, 0x05, 0x4d, 0x6f, 0x76, - 0x65, 0x64, 0x12, 0x44, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x08, - 0x70, 0x72, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x27, 0x0a, 0x08, 0x49, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x49, - 0x64, 0x1a, 0xfc, 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x49, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, - 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, 0x47, - 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x45, - 0x44, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x03, - 0x1a, 0x82, 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, - 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x1a, 0xc8, 0x01, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x72, + 0x0a, 0x18, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x36, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x16, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, + 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, + 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1d, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x62, 0x0a, + 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x11, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x62, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x48, 0x00, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x78, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, + 0x65, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x48, 0x00, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x1a, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x64, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x64, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x1a, 0x62, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x25, 0x0a, - 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x92, 0x02, - 0x0a, 0x0a, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x12, 0x3b, 0x0a, 0x08, - 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, - 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x52, - 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x31, 0x0a, 0x07, 0x73, - 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x31, - 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x22, 0x2f, 0x0a, 0x08, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x0b, 0x0a, - 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, - 0x10, 0x02, 0x22, 0x84, 0x01, 0x0a, 0x0b, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x12, 0x27, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x50, 0x6f, 0x73, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x4b, 0x0a, 0x09, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x79, 0x74, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x62, 0x79, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, - 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, - 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0xb5, 0x09, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x12, 0x2e, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x1a, 0xe6, 0x01, 0x0a, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x3c, 0x0a, 0x0a, 0x61, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x0a, 0x61, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x0a, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, - 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, - 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x1a, 0xc1, 0x02, 0x0a, 0x09, 0x41, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x3a, 0x0a, 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x0a, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3e, 0x0a, 0x0b, + 0x12, 0x56, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x3e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x65, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, + 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, + 0x50, 0x4c, 0x41, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x4c, + 0x41, 0x4e, 0x4e, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x50, 0x50, 0x4c, 0x59, + 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, + 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x06, 0x1a, + 0xde, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, + 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x55, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3d, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x22, 0x84, 0x01, 0x0a, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, + 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, + 0x0a, 0x0a, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0c, 0x0a, + 0x08, 0x50, 0x4c, 0x41, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x50, + 0x4c, 0x41, 0x4e, 0x4e, 0x45, 0x44, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x50, 0x50, 0x4c, + 0x59, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, + 0x44, 0x10, 0x07, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x08, + 0x1a, 0xf0, 0x03, 0x0a, 0x1d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, + 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x05, 0x6d, 0x6f, 0x76, 0x65, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x52, 0x05, 0x6d, 0x6f, 0x76, + 0x65, 0x64, 0x12, 0x62, 0x0a, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x08, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x4d, 0x0a, 0x05, 0x4d, + 0x6f, 0x76, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, + 0x52, 0x08, 0x70, 0x72, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x27, 0x0a, 0x08, 0x49, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x49, 0x64, 0x1a, 0xfc, 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x49, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x45, 0x0a, 0x06, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, + 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, + 0x4e, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, + 0x10, 0x03, 0x1a, 0x82, 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x1a, 0xc8, 0x01, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, + 0x64, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x64, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x64, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x1a, 0x62, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, + 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x41, 0x64, 0x64, 0x72, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, + 0x92, 0x02, 0x0a, 0x0a, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x12, 0x3b, + 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, + 0x79, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x31, 0x0a, + 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x22, 0x2f, 0x0a, 0x08, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, + 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, + 0x4e, 0x47, 0x10, 0x02, 0x22, 0x84, 0x01, 0x0a, 0x0b, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x12, 0x27, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x4b, 0x0a, 0x09, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x79, 0x74, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x62, 0x79, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0xb5, 0x09, 0x0a, 0x06, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x12, 0x2e, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x1a, 0xe6, 0x01, 0x0a, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x3c, 0x0a, + 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, + 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, - 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1e, - 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x1a, 0xef, - 0x01, 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1b, - 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x44, 0x0a, 0x07, 0x6e, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x74, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, + 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x1a, 0xc1, 0x02, 0x0a, + 0x09, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x52, 0x0a, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3e, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, + 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x1a, 0xef, 0x01, 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, + 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x4e, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x22, 0x4d, 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x53, - 0x54, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, - 0x4d, 0x41, 0x50, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x05, - 0x1a, 0xcb, 0x01, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x61, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x0a, 0x61, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x07, 0x6e, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, - 0x65, 0x52, 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x42, 0x0a, 0x0b, 0x4e, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, - 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, - 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x50, 0x10, 0x04, 0x1a, 0x8d, - 0x01, 0x0a, 0x09, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, - 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, + 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x44, 0x0a, + 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x21, 0x0a, 0x06, 0x46, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x00, - 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x41, 0x52, 0x4b, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x22, 0xa7, - 0x01, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x2a, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x60, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, - 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, - 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xc8, 0x03, 0x0a, 0x14, 0x46, 0x65, 0x74, - 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x1a, 0x97, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, - 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x63, 0x61, 0x63, 0x68, 0x65, 0x44, 0x69, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, - 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, - 0x72, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x1a, 0x8f, 0x01, 0x0a, 0x08, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, - 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x1a, 0x83, 0x01, - 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x12, 0x37, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, - 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, - 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, - 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, - 0x69, 0x63, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x15, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x2a, 0x0a, - 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x60, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, - 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xb7, 0x01, 0x0a, 0x17, - 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x44, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x56, 0x0a, - 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x38, 0x0a, 0x0b, 0x64, + 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x4e, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x6e, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x22, 0x4d, 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, + 0x49, 0x53, 0x54, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x07, + 0x0a, 0x03, 0x4d, 0x41, 0x50, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x4f, 0x55, 0x50, + 0x10, 0x05, 0x1a, 0xcb, 0x01, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3c, 0x0a, + 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, + 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x07, 0x6e, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, + 0x6f, 0x64, 0x65, 0x52, 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x42, 0x0a, 0x0b, + 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, + 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, + 0x4c, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, 0x12, 0x07, + 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x50, 0x10, 0x04, + 0x1a, 0x8d, 0x01, 0x0a, 0x09, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x20, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x3b, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x23, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x21, 0x0a, + 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, + 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x41, 0x52, 0x4b, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x01, + 0x22, 0xa7, 0x01, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x2a, 0x0a, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x60, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, + 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xc8, 0x03, 0x0a, 0x14, 0x46, + 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x1a, 0x97, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x63, 0x68, 0x65, 0x44, 0x69, 0x72, 0x12, 0x1f, 0x0a, 0x0b, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x74, 0x66, + 0x6f, 0x72, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x74, + 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x1a, 0x8f, 0x01, + 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x50, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x1a, + 0x83, 0x01, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x37, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, - 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x12, 0x46, 0x65, 0x74, 0x63, 0x68, 0x4d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x1a, 0x38, 0x0a, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, - 0x5f, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x63, 0x68, - 0x65, 0x44, 0x69, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x1a, 0x44, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, - 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x2a, 0x32, 0x0a, 0x0c, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, - 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x41, 0x4e, - 0x41, 0x47, 0x45, 0x44, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x41, 0x54, 0x41, 0x10, 0x02, - 0x2a, 0x35, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, 0x0a, 0x06, - 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x45, 0x46, 0x52, - 0x45, 0x53, 0x48, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, - 0x53, 0x54, 0x52, 0x4f, 0x59, 0x10, 0x02, 0x2a, 0x44, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, - 0x08, 0x0a, 0x04, 0x52, 0x45, 0x41, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x45, - 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, - 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x04, 0x32, 0x53, 0x0a, - 0x05, 0x53, 0x65, 0x74, 0x75, 0x70, 0x12, 0x4a, 0x0a, 0x09, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, - 0x61, 0x6b, 0x65, 0x12, 0x1d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x32, 0xc8, 0x0a, 0x0a, 0x0c, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, - 0x69, 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x24, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, - 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, - 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, - 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x4f, 0x70, 0x65, 0x6e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, - 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x15, 0x43, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x15, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x2a, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x60, 0x0a, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, + 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, + 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xb7, 0x01, + 0x0a, 0x17, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x44, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, + 0x56, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x38, 0x0a, + 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, + 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x12, 0x46, 0x65, 0x74, 0x63, + 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x1a, 0x38, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x44, 0x69, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x1a, 0x44, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, + 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x2a, 0x32, + 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, + 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4d, + 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x41, 0x54, 0x41, + 0x10, 0x02, 0x2a, 0x35, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, + 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x45, + 0x46, 0x52, 0x45, 0x53, 0x48, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, + 0x44, 0x45, 0x53, 0x54, 0x52, 0x4f, 0x59, 0x10, 0x02, 0x2a, 0x44, 0x0a, 0x0a, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, + 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x45, 0x41, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, + 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, + 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x04, 0x32, + 0x53, 0x0a, 0x05, 0x53, 0x65, 0x74, 0x75, 0x70, 0x12, 0x4a, 0x0a, 0x09, 0x48, 0x61, 0x6e, 0x64, + 0x73, 0x68, 0x61, 0x6b, 0x65, 0x12, 0x1d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xc8, 0x0a, 0x0a, 0x0c, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, + 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x24, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, + 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, + 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x16, 0x4f, 0x70, + 0x65, 0x6e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, + 0x46, 0x69, 0x6c, 0x65, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, + 0x4c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, + 0x46, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, + 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, + 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x29, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, + 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, - 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x29, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, + 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, + 0x14, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, + 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, - 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x14, 0x43, - 0x6c, 0x6f, 0x73, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, - 0x63, 0x6b, 0x73, 0x12, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, - 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, - 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x86, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, + 0x29, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, + 0x73, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, + 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x86, 0x01, 0x0a, 0x1d, 0x47, + 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x65, 0x70, 0x65, 0x6e, + 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x32, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x65, - 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, - 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, - 0x6e, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, - 0x63, 0x6b, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x65, 0x70, 0x65, - 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x76, 0x0a, 0x18, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x2c, 0x2e, + 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x18, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, + 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x74, 0x0a, 0x17, 0x4f, 0x70, 0x65, - 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, - 0x61, 0x63, 0x68, 0x65, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, + 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x74, 0x0a, 0x17, 0x4f, 0x70, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x77, 0x0a, 0x18, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x2c, 0x2e, 0x74, 0x65, + 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, + 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x77, 0x0a, 0x18, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x2c, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, - 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, - 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x68, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x47, 0x65, 0x74, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x25, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xa2, 0x07, - 0x0a, 0x06, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x71, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x17, 0x43, - 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x7d, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x2e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2f, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x8f, 0x01, 0x0a, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, + 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x12, 0x47, 0x65, + 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x68, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x47, + 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x12, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, + 0xa2, 0x07, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x71, 0x0a, 0x16, 0x4f, 0x70, + 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, + 0x17, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x2e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2f, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x34, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x34, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x10, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x30, 0x01, 0x12, 0x61, 0x0a, 0x11, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, - 0x79, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x12, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x26, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x17, - 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x32, 0xba, 0x04, 0x0a, 0x08, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x12, - 0x74, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x14, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x28, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x15, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x10, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x30, 0x01, 0x12, 0x61, 0x0a, 0x11, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x23, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, + 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x12, 0x4f, 0x70, 0x65, 0x6e, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x26, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, + 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xba, 0x04, 0x0a, 0x08, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x73, 0x12, 0x74, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x74, 0x0a, 0x17, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x2b, 0x2e, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x14, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, + 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, + 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x15, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, - 0x64, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x2e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x12, 0x46, 0x65, 0x74, 0x63, - 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x26, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, - 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x17, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, + 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x41, 0x64, 0x64, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, + 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x12, 0x46, 0x65, + 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x12, 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, + 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10046,7 +10164,7 @@ func file_terraform1_proto_rawDescGZIP() []byte { } var file_terraform1_proto_enumTypes = make([]protoimpl.EnumInfo, 12) -var file_terraform1_proto_msgTypes = make([]protoimpl.MessageInfo, 144) +var file_terraform1_proto_msgTypes = make([]protoimpl.MessageInfo, 147) var file_terraform1_proto_goTypes = []interface{}{ (ResourceMode)(0), // 0: terraform1.ResourceMode (PlanMode)(0), // 1: terraform1.PlanMode @@ -10063,346 +10181,352 @@ var file_terraform1_proto_goTypes = []interface{}{ (*Handshake)(nil), // 12: terraform1.Handshake (*ClientCapabilities)(nil), // 13: terraform1.ClientCapabilities (*ServerCapabilities)(nil), // 14: terraform1.ServerCapabilities - (*OpenSourceBundle)(nil), // 15: terraform1.OpenSourceBundle - (*CloseSourceBundle)(nil), // 16: terraform1.CloseSourceBundle - (*OpenDependencyLockFile)(nil), // 17: terraform1.OpenDependencyLockFile - (*CreateDependencyLocks)(nil), // 18: terraform1.CreateDependencyLocks - (*CloseDependencyLocks)(nil), // 19: terraform1.CloseDependencyLocks - (*GetLockedProviderDependencies)(nil), // 20: terraform1.GetLockedProviderDependencies - (*BuildProviderPluginCache)(nil), // 21: terraform1.BuildProviderPluginCache - (*OpenProviderPluginCache)(nil), // 22: terraform1.OpenProviderPluginCache - (*CloseProviderPluginCache)(nil), // 23: terraform1.CloseProviderPluginCache - (*GetCachedProviders)(nil), // 24: terraform1.GetCachedProviders - (*GetBuiltInProviders)(nil), // 25: terraform1.GetBuiltInProviders - (*GetProviderSchema)(nil), // 26: terraform1.GetProviderSchema - (*ProviderPackage)(nil), // 27: terraform1.ProviderPackage - (*ProviderSchema)(nil), // 28: terraform1.ProviderSchema - (*OpenStackConfiguration)(nil), // 29: terraform1.OpenStackConfiguration - (*CloseStackConfiguration)(nil), // 30: terraform1.CloseStackConfiguration - (*ValidateStackConfiguration)(nil), // 31: terraform1.ValidateStackConfiguration - (*FindStackConfigurationComponents)(nil), // 32: terraform1.FindStackConfigurationComponents - (*PlanStackChanges)(nil), // 33: terraform1.PlanStackChanges - (*ApplyStackChanges)(nil), // 34: terraform1.ApplyStackChanges - (*OpenStackInspector)(nil), // 35: terraform1.OpenStackInspector - (*InspectExpressionResult)(nil), // 36: terraform1.InspectExpressionResult - (*DynamicValue)(nil), // 37: terraform1.DynamicValue - (*DynamicValueChange)(nil), // 38: terraform1.DynamicValueChange - (*DynamicValueWithSource)(nil), // 39: terraform1.DynamicValueWithSource - (*AttributePath)(nil), // 40: terraform1.AttributePath - (*ComponentInstanceInStackAddr)(nil), // 41: terraform1.ComponentInstanceInStackAddr - (*ResourceInstanceInStackAddr)(nil), // 42: terraform1.ResourceInstanceInStackAddr - (*ResourceInstanceObjectInStackAddr)(nil), // 43: terraform1.ResourceInstanceObjectInStackAddr - (*SourceAddress)(nil), // 44: terraform1.SourceAddress - (*PlannedChange)(nil), // 45: terraform1.PlannedChange - (*AppliedChange)(nil), // 46: terraform1.AppliedChange - (*StackChangeProgress)(nil), // 47: terraform1.StackChangeProgress - (*Diagnostic)(nil), // 48: terraform1.Diagnostic - (*SourceRange)(nil), // 49: terraform1.SourceRange - (*SourcePos)(nil), // 50: terraform1.SourcePos - (*Schema)(nil), // 51: terraform1.Schema - (*ProviderPackageVersions)(nil), // 52: terraform1.ProviderPackageVersions - (*FetchProviderPackage)(nil), // 53: terraform1.FetchProviderPackage - (*ModulePackageVersions)(nil), // 54: terraform1.ModulePackageVersions - (*ModulePackageSourceAddr)(nil), // 55: terraform1.ModulePackageSourceAddr - (*FetchModulePackage)(nil), // 56: terraform1.FetchModulePackage - (*Handshake_Request)(nil), // 57: terraform1.Handshake.Request - (*Handshake_Response)(nil), // 58: terraform1.Handshake.Response - (*OpenSourceBundle_Request)(nil), // 59: terraform1.OpenSourceBundle.Request - (*OpenSourceBundle_Response)(nil), // 60: terraform1.OpenSourceBundle.Response - (*CloseSourceBundle_Request)(nil), // 61: terraform1.CloseSourceBundle.Request - (*CloseSourceBundle_Response)(nil), // 62: terraform1.CloseSourceBundle.Response - (*OpenDependencyLockFile_Request)(nil), // 63: terraform1.OpenDependencyLockFile.Request - (*OpenDependencyLockFile_Response)(nil), // 64: terraform1.OpenDependencyLockFile.Response - (*CreateDependencyLocks_Request)(nil), // 65: terraform1.CreateDependencyLocks.Request - (*CreateDependencyLocks_Response)(nil), // 66: terraform1.CreateDependencyLocks.Response - (*CloseDependencyLocks_Request)(nil), // 67: terraform1.CloseDependencyLocks.Request - (*CloseDependencyLocks_Response)(nil), // 68: terraform1.CloseDependencyLocks.Response - (*GetLockedProviderDependencies_Request)(nil), // 69: terraform1.GetLockedProviderDependencies.Request - (*GetLockedProviderDependencies_Response)(nil), // 70: terraform1.GetLockedProviderDependencies.Response - (*BuildProviderPluginCache_Request)(nil), // 71: terraform1.BuildProviderPluginCache.Request - (*BuildProviderPluginCache_Event)(nil), // 72: terraform1.BuildProviderPluginCache.Event - (*BuildProviderPluginCache_Request_InstallMethod)(nil), // 73: terraform1.BuildProviderPluginCache.Request.InstallMethod - (*BuildProviderPluginCache_Event_Pending)(nil), // 74: terraform1.BuildProviderPluginCache.Event.Pending - (*BuildProviderPluginCache_Event_ProviderConstraints)(nil), // 75: terraform1.BuildProviderPluginCache.Event.ProviderConstraints - (*BuildProviderPluginCache_Event_ProviderVersion)(nil), // 76: terraform1.BuildProviderPluginCache.Event.ProviderVersion - (*BuildProviderPluginCache_Event_ProviderWarnings)(nil), // 77: terraform1.BuildProviderPluginCache.Event.ProviderWarnings - (*BuildProviderPluginCache_Event_FetchBegin)(nil), // 78: terraform1.BuildProviderPluginCache.Event.FetchBegin - (*BuildProviderPluginCache_Event_FetchComplete)(nil), // 79: terraform1.BuildProviderPluginCache.Event.FetchComplete - (*OpenProviderPluginCache_Request)(nil), // 80: terraform1.OpenProviderPluginCache.Request - (*OpenProviderPluginCache_Response)(nil), // 81: terraform1.OpenProviderPluginCache.Response - (*CloseProviderPluginCache_Request)(nil), // 82: terraform1.CloseProviderPluginCache.Request - (*CloseProviderPluginCache_Response)(nil), // 83: terraform1.CloseProviderPluginCache.Response - (*GetCachedProviders_Request)(nil), // 84: terraform1.GetCachedProviders.Request - (*GetCachedProviders_Response)(nil), // 85: terraform1.GetCachedProviders.Response - (*GetBuiltInProviders_Request)(nil), // 86: terraform1.GetBuiltInProviders.Request - (*GetBuiltInProviders_Response)(nil), // 87: terraform1.GetBuiltInProviders.Response - (*GetProviderSchema_Request)(nil), // 88: terraform1.GetProviderSchema.Request - (*GetProviderSchema_Response)(nil), // 89: terraform1.GetProviderSchema.Response - nil, // 90: terraform1.ProviderSchema.ManagedResourceTypesEntry - nil, // 91: terraform1.ProviderSchema.DataResourceTypesEntry - (*OpenStackConfiguration_Request)(nil), // 92: terraform1.OpenStackConfiguration.Request - (*OpenStackConfiguration_Response)(nil), // 93: terraform1.OpenStackConfiguration.Response - (*CloseStackConfiguration_Request)(nil), // 94: terraform1.CloseStackConfiguration.Request - (*CloseStackConfiguration_Response)(nil), // 95: terraform1.CloseStackConfiguration.Response - (*ValidateStackConfiguration_Request)(nil), // 96: terraform1.ValidateStackConfiguration.Request - (*ValidateStackConfiguration_Response)(nil), // 97: terraform1.ValidateStackConfiguration.Response - (*FindStackConfigurationComponents_Request)(nil), // 98: terraform1.FindStackConfigurationComponents.Request - (*FindStackConfigurationComponents_Response)(nil), // 99: terraform1.FindStackConfigurationComponents.Response - (*FindStackConfigurationComponents_StackConfig)(nil), // 100: terraform1.FindStackConfigurationComponents.StackConfig - (*FindStackConfigurationComponents_EmbeddedStack)(nil), // 101: terraform1.FindStackConfigurationComponents.EmbeddedStack - (*FindStackConfigurationComponents_Component)(nil), // 102: terraform1.FindStackConfigurationComponents.Component - nil, // 103: terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry - nil, // 104: terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry - (*PlanStackChanges_Request)(nil), // 105: terraform1.PlanStackChanges.Request - (*PlanStackChanges_Event)(nil), // 106: terraform1.PlanStackChanges.Event - nil, // 107: terraform1.PlanStackChanges.Request.PreviousStateEntry - nil, // 108: terraform1.PlanStackChanges.Request.InputValuesEntry - (*ApplyStackChanges_Request)(nil), // 109: terraform1.ApplyStackChanges.Request - (*ApplyStackChanges_Event)(nil), // 110: terraform1.ApplyStackChanges.Event - (*OpenStackInspector_Request)(nil), // 111: terraform1.OpenStackInspector.Request - (*OpenStackInspector_Response)(nil), // 112: terraform1.OpenStackInspector.Response - nil, // 113: terraform1.OpenStackInspector.Request.StateEntry - nil, // 114: terraform1.OpenStackInspector.Request.InputValuesEntry - (*InspectExpressionResult_Request)(nil), // 115: terraform1.InspectExpressionResult.Request - (*InspectExpressionResult_Response)(nil), // 116: terraform1.InspectExpressionResult.Response - (*AttributePath_Step)(nil), // 117: terraform1.AttributePath.Step - (*PlannedChange_ChangeDescription)(nil), // 118: terraform1.PlannedChange.ChangeDescription - (*PlannedChange_ComponentInstance)(nil), // 119: terraform1.PlannedChange.ComponentInstance - (*PlannedChange_ResourceInstance)(nil), // 120: terraform1.PlannedChange.ResourceInstance - (*PlannedChange_OutputValue)(nil), // 121: terraform1.PlannedChange.OutputValue - (*PlannedChange_ResourceInstance_Moved)(nil), // 122: terraform1.PlannedChange.ResourceInstance.Moved - (*PlannedChange_ResourceInstance_Imported)(nil), // 123: terraform1.PlannedChange.ResourceInstance.Imported - (*AppliedChange_RawChange)(nil), // 124: terraform1.AppliedChange.RawChange - (*AppliedChange_ChangeDescription)(nil), // 125: terraform1.AppliedChange.ChangeDescription - (*AppliedChange_ResourceInstance)(nil), // 126: terraform1.AppliedChange.ResourceInstance - (*AppliedChange_ComponentInstance)(nil), // 127: terraform1.AppliedChange.ComponentInstance - (*AppliedChange_OutputValue)(nil), // 128: terraform1.AppliedChange.OutputValue - (*AppliedChange_Nothing)(nil), // 129: terraform1.AppliedChange.Nothing - nil, // 130: terraform1.AppliedChange.ComponentInstance.OutputValuesEntry - (*StackChangeProgress_ComponentInstanceStatus)(nil), // 131: terraform1.StackChangeProgress.ComponentInstanceStatus - (*StackChangeProgress_ResourceInstanceStatus)(nil), // 132: terraform1.StackChangeProgress.ResourceInstanceStatus - (*StackChangeProgress_ResourceInstancePlannedChange)(nil), // 133: terraform1.StackChangeProgress.ResourceInstancePlannedChange - (*StackChangeProgress_ProvisionerStatus)(nil), // 134: terraform1.StackChangeProgress.ProvisionerStatus - (*StackChangeProgress_ProvisionerOutput)(nil), // 135: terraform1.StackChangeProgress.ProvisionerOutput - (*StackChangeProgress_ComponentInstanceChanges)(nil), // 136: terraform1.StackChangeProgress.ComponentInstanceChanges - (*StackChangeProgress_ComponentInstances)(nil), // 137: terraform1.StackChangeProgress.ComponentInstances - (*StackChangeProgress_ResourceInstancePlannedChange_Moved)(nil), // 138: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved - (*StackChangeProgress_ResourceInstancePlannedChange_Imported)(nil), // 139: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Imported - (*Schema_Block)(nil), // 140: terraform1.Schema.Block - (*Schema_Attribute)(nil), // 141: terraform1.Schema.Attribute - (*Schema_NestedBlock)(nil), // 142: terraform1.Schema.NestedBlock - (*Schema_Object)(nil), // 143: terraform1.Schema.Object - (*Schema_DocString)(nil), // 144: terraform1.Schema.DocString - (*ProviderPackageVersions_Request)(nil), // 145: terraform1.ProviderPackageVersions.Request - (*ProviderPackageVersions_Response)(nil), // 146: terraform1.ProviderPackageVersions.Response - (*FetchProviderPackage_Request)(nil), // 147: terraform1.FetchProviderPackage.Request - (*FetchProviderPackage_Response)(nil), // 148: terraform1.FetchProviderPackage.Response - (*FetchProviderPackage_PlatformResult)(nil), // 149: terraform1.FetchProviderPackage.PlatformResult - (*ModulePackageVersions_Request)(nil), // 150: terraform1.ModulePackageVersions.Request - (*ModulePackageVersions_Response)(nil), // 151: terraform1.ModulePackageVersions.Response - (*ModulePackageSourceAddr_Request)(nil), // 152: terraform1.ModulePackageSourceAddr.Request - (*ModulePackageSourceAddr_Response)(nil), // 153: terraform1.ModulePackageSourceAddr.Response - (*FetchModulePackage_Request)(nil), // 154: terraform1.FetchModulePackage.Request - (*FetchModulePackage_Response)(nil), // 155: terraform1.FetchModulePackage.Response - (*anypb.Any)(nil), // 156: google.protobuf.Any + (*Config)(nil), // 15: terraform1.Config + (*HostCredential)(nil), // 16: terraform1.HostCredential + (*OpenSourceBundle)(nil), // 17: terraform1.OpenSourceBundle + (*CloseSourceBundle)(nil), // 18: terraform1.CloseSourceBundle + (*OpenDependencyLockFile)(nil), // 19: terraform1.OpenDependencyLockFile + (*CreateDependencyLocks)(nil), // 20: terraform1.CreateDependencyLocks + (*CloseDependencyLocks)(nil), // 21: terraform1.CloseDependencyLocks + (*GetLockedProviderDependencies)(nil), // 22: terraform1.GetLockedProviderDependencies + (*BuildProviderPluginCache)(nil), // 23: terraform1.BuildProviderPluginCache + (*OpenProviderPluginCache)(nil), // 24: terraform1.OpenProviderPluginCache + (*CloseProviderPluginCache)(nil), // 25: terraform1.CloseProviderPluginCache + (*GetCachedProviders)(nil), // 26: terraform1.GetCachedProviders + (*GetBuiltInProviders)(nil), // 27: terraform1.GetBuiltInProviders + (*GetProviderSchema)(nil), // 28: terraform1.GetProviderSchema + (*ProviderPackage)(nil), // 29: terraform1.ProviderPackage + (*ProviderSchema)(nil), // 30: terraform1.ProviderSchema + (*OpenStackConfiguration)(nil), // 31: terraform1.OpenStackConfiguration + (*CloseStackConfiguration)(nil), // 32: terraform1.CloseStackConfiguration + (*ValidateStackConfiguration)(nil), // 33: terraform1.ValidateStackConfiguration + (*FindStackConfigurationComponents)(nil), // 34: terraform1.FindStackConfigurationComponents + (*PlanStackChanges)(nil), // 35: terraform1.PlanStackChanges + (*ApplyStackChanges)(nil), // 36: terraform1.ApplyStackChanges + (*OpenStackInspector)(nil), // 37: terraform1.OpenStackInspector + (*InspectExpressionResult)(nil), // 38: terraform1.InspectExpressionResult + (*DynamicValue)(nil), // 39: terraform1.DynamicValue + (*DynamicValueChange)(nil), // 40: terraform1.DynamicValueChange + (*DynamicValueWithSource)(nil), // 41: terraform1.DynamicValueWithSource + (*AttributePath)(nil), // 42: terraform1.AttributePath + (*ComponentInstanceInStackAddr)(nil), // 43: terraform1.ComponentInstanceInStackAddr + (*ResourceInstanceInStackAddr)(nil), // 44: terraform1.ResourceInstanceInStackAddr + (*ResourceInstanceObjectInStackAddr)(nil), // 45: terraform1.ResourceInstanceObjectInStackAddr + (*SourceAddress)(nil), // 46: terraform1.SourceAddress + (*PlannedChange)(nil), // 47: terraform1.PlannedChange + (*AppliedChange)(nil), // 48: terraform1.AppliedChange + (*StackChangeProgress)(nil), // 49: terraform1.StackChangeProgress + (*Diagnostic)(nil), // 50: terraform1.Diagnostic + (*SourceRange)(nil), // 51: terraform1.SourceRange + (*SourcePos)(nil), // 52: terraform1.SourcePos + (*Schema)(nil), // 53: terraform1.Schema + (*ProviderPackageVersions)(nil), // 54: terraform1.ProviderPackageVersions + (*FetchProviderPackage)(nil), // 55: terraform1.FetchProviderPackage + (*ModulePackageVersions)(nil), // 56: terraform1.ModulePackageVersions + (*ModulePackageSourceAddr)(nil), // 57: terraform1.ModulePackageSourceAddr + (*FetchModulePackage)(nil), // 58: terraform1.FetchModulePackage + (*Handshake_Request)(nil), // 59: terraform1.Handshake.Request + (*Handshake_Response)(nil), // 60: terraform1.Handshake.Response + nil, // 61: terraform1.Config.CredentialsEntry + (*OpenSourceBundle_Request)(nil), // 62: terraform1.OpenSourceBundle.Request + (*OpenSourceBundle_Response)(nil), // 63: terraform1.OpenSourceBundle.Response + (*CloseSourceBundle_Request)(nil), // 64: terraform1.CloseSourceBundle.Request + (*CloseSourceBundle_Response)(nil), // 65: terraform1.CloseSourceBundle.Response + (*OpenDependencyLockFile_Request)(nil), // 66: terraform1.OpenDependencyLockFile.Request + (*OpenDependencyLockFile_Response)(nil), // 67: terraform1.OpenDependencyLockFile.Response + (*CreateDependencyLocks_Request)(nil), // 68: terraform1.CreateDependencyLocks.Request + (*CreateDependencyLocks_Response)(nil), // 69: terraform1.CreateDependencyLocks.Response + (*CloseDependencyLocks_Request)(nil), // 70: terraform1.CloseDependencyLocks.Request + (*CloseDependencyLocks_Response)(nil), // 71: terraform1.CloseDependencyLocks.Response + (*GetLockedProviderDependencies_Request)(nil), // 72: terraform1.GetLockedProviderDependencies.Request + (*GetLockedProviderDependencies_Response)(nil), // 73: terraform1.GetLockedProviderDependencies.Response + (*BuildProviderPluginCache_Request)(nil), // 74: terraform1.BuildProviderPluginCache.Request + (*BuildProviderPluginCache_Event)(nil), // 75: terraform1.BuildProviderPluginCache.Event + (*BuildProviderPluginCache_Request_InstallMethod)(nil), // 76: terraform1.BuildProviderPluginCache.Request.InstallMethod + (*BuildProviderPluginCache_Event_Pending)(nil), // 77: terraform1.BuildProviderPluginCache.Event.Pending + (*BuildProviderPluginCache_Event_ProviderConstraints)(nil), // 78: terraform1.BuildProviderPluginCache.Event.ProviderConstraints + (*BuildProviderPluginCache_Event_ProviderVersion)(nil), // 79: terraform1.BuildProviderPluginCache.Event.ProviderVersion + (*BuildProviderPluginCache_Event_ProviderWarnings)(nil), // 80: terraform1.BuildProviderPluginCache.Event.ProviderWarnings + (*BuildProviderPluginCache_Event_FetchBegin)(nil), // 81: terraform1.BuildProviderPluginCache.Event.FetchBegin + (*BuildProviderPluginCache_Event_FetchComplete)(nil), // 82: terraform1.BuildProviderPluginCache.Event.FetchComplete + (*OpenProviderPluginCache_Request)(nil), // 83: terraform1.OpenProviderPluginCache.Request + (*OpenProviderPluginCache_Response)(nil), // 84: terraform1.OpenProviderPluginCache.Response + (*CloseProviderPluginCache_Request)(nil), // 85: terraform1.CloseProviderPluginCache.Request + (*CloseProviderPluginCache_Response)(nil), // 86: terraform1.CloseProviderPluginCache.Response + (*GetCachedProviders_Request)(nil), // 87: terraform1.GetCachedProviders.Request + (*GetCachedProviders_Response)(nil), // 88: terraform1.GetCachedProviders.Response + (*GetBuiltInProviders_Request)(nil), // 89: terraform1.GetBuiltInProviders.Request + (*GetBuiltInProviders_Response)(nil), // 90: terraform1.GetBuiltInProviders.Response + (*GetProviderSchema_Request)(nil), // 91: terraform1.GetProviderSchema.Request + (*GetProviderSchema_Response)(nil), // 92: terraform1.GetProviderSchema.Response + nil, // 93: terraform1.ProviderSchema.ManagedResourceTypesEntry + nil, // 94: terraform1.ProviderSchema.DataResourceTypesEntry + (*OpenStackConfiguration_Request)(nil), // 95: terraform1.OpenStackConfiguration.Request + (*OpenStackConfiguration_Response)(nil), // 96: terraform1.OpenStackConfiguration.Response + (*CloseStackConfiguration_Request)(nil), // 97: terraform1.CloseStackConfiguration.Request + (*CloseStackConfiguration_Response)(nil), // 98: terraform1.CloseStackConfiguration.Response + (*ValidateStackConfiguration_Request)(nil), // 99: terraform1.ValidateStackConfiguration.Request + (*ValidateStackConfiguration_Response)(nil), // 100: terraform1.ValidateStackConfiguration.Response + (*FindStackConfigurationComponents_Request)(nil), // 101: terraform1.FindStackConfigurationComponents.Request + (*FindStackConfigurationComponents_Response)(nil), // 102: terraform1.FindStackConfigurationComponents.Response + (*FindStackConfigurationComponents_StackConfig)(nil), // 103: terraform1.FindStackConfigurationComponents.StackConfig + (*FindStackConfigurationComponents_EmbeddedStack)(nil), // 104: terraform1.FindStackConfigurationComponents.EmbeddedStack + (*FindStackConfigurationComponents_Component)(nil), // 105: terraform1.FindStackConfigurationComponents.Component + nil, // 106: terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry + nil, // 107: terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry + (*PlanStackChanges_Request)(nil), // 108: terraform1.PlanStackChanges.Request + (*PlanStackChanges_Event)(nil), // 109: terraform1.PlanStackChanges.Event + nil, // 110: terraform1.PlanStackChanges.Request.PreviousStateEntry + nil, // 111: terraform1.PlanStackChanges.Request.InputValuesEntry + (*ApplyStackChanges_Request)(nil), // 112: terraform1.ApplyStackChanges.Request + (*ApplyStackChanges_Event)(nil), // 113: terraform1.ApplyStackChanges.Event + (*OpenStackInspector_Request)(nil), // 114: terraform1.OpenStackInspector.Request + (*OpenStackInspector_Response)(nil), // 115: terraform1.OpenStackInspector.Response + nil, // 116: terraform1.OpenStackInspector.Request.StateEntry + nil, // 117: terraform1.OpenStackInspector.Request.InputValuesEntry + (*InspectExpressionResult_Request)(nil), // 118: terraform1.InspectExpressionResult.Request + (*InspectExpressionResult_Response)(nil), // 119: terraform1.InspectExpressionResult.Response + (*AttributePath_Step)(nil), // 120: terraform1.AttributePath.Step + (*PlannedChange_ChangeDescription)(nil), // 121: terraform1.PlannedChange.ChangeDescription + (*PlannedChange_ComponentInstance)(nil), // 122: terraform1.PlannedChange.ComponentInstance + (*PlannedChange_ResourceInstance)(nil), // 123: terraform1.PlannedChange.ResourceInstance + (*PlannedChange_OutputValue)(nil), // 124: terraform1.PlannedChange.OutputValue + (*PlannedChange_ResourceInstance_Moved)(nil), // 125: terraform1.PlannedChange.ResourceInstance.Moved + (*PlannedChange_ResourceInstance_Imported)(nil), // 126: terraform1.PlannedChange.ResourceInstance.Imported + (*AppliedChange_RawChange)(nil), // 127: terraform1.AppliedChange.RawChange + (*AppliedChange_ChangeDescription)(nil), // 128: terraform1.AppliedChange.ChangeDescription + (*AppliedChange_ResourceInstance)(nil), // 129: terraform1.AppliedChange.ResourceInstance + (*AppliedChange_ComponentInstance)(nil), // 130: terraform1.AppliedChange.ComponentInstance + (*AppliedChange_OutputValue)(nil), // 131: terraform1.AppliedChange.OutputValue + (*AppliedChange_Nothing)(nil), // 132: terraform1.AppliedChange.Nothing + nil, // 133: terraform1.AppliedChange.ComponentInstance.OutputValuesEntry + (*StackChangeProgress_ComponentInstanceStatus)(nil), // 134: terraform1.StackChangeProgress.ComponentInstanceStatus + (*StackChangeProgress_ResourceInstanceStatus)(nil), // 135: terraform1.StackChangeProgress.ResourceInstanceStatus + (*StackChangeProgress_ResourceInstancePlannedChange)(nil), // 136: terraform1.StackChangeProgress.ResourceInstancePlannedChange + (*StackChangeProgress_ProvisionerStatus)(nil), // 137: terraform1.StackChangeProgress.ProvisionerStatus + (*StackChangeProgress_ProvisionerOutput)(nil), // 138: terraform1.StackChangeProgress.ProvisionerOutput + (*StackChangeProgress_ComponentInstanceChanges)(nil), // 139: terraform1.StackChangeProgress.ComponentInstanceChanges + (*StackChangeProgress_ComponentInstances)(nil), // 140: terraform1.StackChangeProgress.ComponentInstances + (*StackChangeProgress_ResourceInstancePlannedChange_Moved)(nil), // 141: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved + (*StackChangeProgress_ResourceInstancePlannedChange_Imported)(nil), // 142: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Imported + (*Schema_Block)(nil), // 143: terraform1.Schema.Block + (*Schema_Attribute)(nil), // 144: terraform1.Schema.Attribute + (*Schema_NestedBlock)(nil), // 145: terraform1.Schema.NestedBlock + (*Schema_Object)(nil), // 146: terraform1.Schema.Object + (*Schema_DocString)(nil), // 147: terraform1.Schema.DocString + (*ProviderPackageVersions_Request)(nil), // 148: terraform1.ProviderPackageVersions.Request + (*ProviderPackageVersions_Response)(nil), // 149: terraform1.ProviderPackageVersions.Response + (*FetchProviderPackage_Request)(nil), // 150: terraform1.FetchProviderPackage.Request + (*FetchProviderPackage_Response)(nil), // 151: terraform1.FetchProviderPackage.Response + (*FetchProviderPackage_PlatformResult)(nil), // 152: terraform1.FetchProviderPackage.PlatformResult + (*ModulePackageVersions_Request)(nil), // 153: terraform1.ModulePackageVersions.Request + (*ModulePackageVersions_Response)(nil), // 154: terraform1.ModulePackageVersions.Response + (*ModulePackageSourceAddr_Request)(nil), // 155: terraform1.ModulePackageSourceAddr.Request + (*ModulePackageSourceAddr_Response)(nil), // 156: terraform1.ModulePackageSourceAddr.Response + (*FetchModulePackage_Request)(nil), // 157: terraform1.FetchModulePackage.Request + (*FetchModulePackage_Response)(nil), // 158: terraform1.FetchModulePackage.Response + (*anypb.Any)(nil), // 159: google.protobuf.Any } var file_terraform1_proto_depIdxs = []int32{ - 51, // 0: terraform1.ProviderSchema.provider_config:type_name -> terraform1.Schema - 90, // 1: terraform1.ProviderSchema.managed_resource_types:type_name -> terraform1.ProviderSchema.ManagedResourceTypesEntry - 91, // 2: terraform1.ProviderSchema.data_resource_types:type_name -> terraform1.ProviderSchema.DataResourceTypesEntry - 40, // 3: terraform1.DynamicValue.sensitive:type_name -> terraform1.AttributePath - 37, // 4: terraform1.DynamicValueChange.old:type_name -> terraform1.DynamicValue - 37, // 5: terraform1.DynamicValueChange.new:type_name -> terraform1.DynamicValue - 37, // 6: terraform1.DynamicValueWithSource.value:type_name -> terraform1.DynamicValue - 49, // 7: terraform1.DynamicValueWithSource.source_range:type_name -> terraform1.SourceRange - 117, // 8: terraform1.AttributePath.steps:type_name -> terraform1.AttributePath.Step - 156, // 9: terraform1.PlannedChange.raw:type_name -> google.protobuf.Any - 118, // 10: terraform1.PlannedChange.descriptions:type_name -> terraform1.PlannedChange.ChangeDescription - 124, // 11: terraform1.AppliedChange.raw:type_name -> terraform1.AppliedChange.RawChange - 125, // 12: terraform1.AppliedChange.descriptions:type_name -> terraform1.AppliedChange.ChangeDescription - 131, // 13: terraform1.StackChangeProgress.component_instance_status:type_name -> terraform1.StackChangeProgress.ComponentInstanceStatus - 132, // 14: terraform1.StackChangeProgress.resource_instance_status:type_name -> terraform1.StackChangeProgress.ResourceInstanceStatus - 133, // 15: terraform1.StackChangeProgress.resource_instance_planned_change:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange - 134, // 16: terraform1.StackChangeProgress.provisioner_status:type_name -> terraform1.StackChangeProgress.ProvisionerStatus - 135, // 17: terraform1.StackChangeProgress.provisioner_output:type_name -> terraform1.StackChangeProgress.ProvisionerOutput - 136, // 18: terraform1.StackChangeProgress.component_instance_changes:type_name -> terraform1.StackChangeProgress.ComponentInstanceChanges - 137, // 19: terraform1.StackChangeProgress.component_instances:type_name -> terraform1.StackChangeProgress.ComponentInstances - 8, // 20: terraform1.Diagnostic.severity:type_name -> terraform1.Diagnostic.Severity - 49, // 21: terraform1.Diagnostic.subject:type_name -> terraform1.SourceRange - 49, // 22: terraform1.Diagnostic.context:type_name -> terraform1.SourceRange - 50, // 23: terraform1.SourceRange.start:type_name -> terraform1.SourcePos - 50, // 24: terraform1.SourceRange.end:type_name -> terraform1.SourcePos - 140, // 25: terraform1.Schema.block:type_name -> terraform1.Schema.Block - 13, // 26: terraform1.Handshake.Request.capabilities:type_name -> terraform1.ClientCapabilities - 14, // 27: terraform1.Handshake.Response.capabilities:type_name -> terraform1.ServerCapabilities - 44, // 28: terraform1.OpenDependencyLockFile.Request.source_address:type_name -> terraform1.SourceAddress - 48, // 29: terraform1.OpenDependencyLockFile.Response.diagnostics:type_name -> terraform1.Diagnostic - 27, // 30: terraform1.CreateDependencyLocks.Request.provider_selections:type_name -> terraform1.ProviderPackage - 27, // 31: terraform1.GetLockedProviderDependencies.Response.selected_providers:type_name -> terraform1.ProviderPackage - 73, // 32: terraform1.BuildProviderPluginCache.Request.installation_methods:type_name -> terraform1.BuildProviderPluginCache.Request.InstallMethod - 74, // 33: terraform1.BuildProviderPluginCache.Event.pending:type_name -> terraform1.BuildProviderPluginCache.Event.Pending - 76, // 34: terraform1.BuildProviderPluginCache.Event.already_installed:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion - 76, // 35: terraform1.BuildProviderPluginCache.Event.built_in:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion - 75, // 36: terraform1.BuildProviderPluginCache.Event.query_begin:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderConstraints - 76, // 37: terraform1.BuildProviderPluginCache.Event.query_success:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion - 77, // 38: terraform1.BuildProviderPluginCache.Event.query_warnings:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderWarnings - 78, // 39: terraform1.BuildProviderPluginCache.Event.fetch_begin:type_name -> terraform1.BuildProviderPluginCache.Event.FetchBegin - 79, // 40: terraform1.BuildProviderPluginCache.Event.fetch_complete:type_name -> terraform1.BuildProviderPluginCache.Event.FetchComplete - 48, // 41: terraform1.BuildProviderPluginCache.Event.diagnostic:type_name -> terraform1.Diagnostic - 75, // 42: terraform1.BuildProviderPluginCache.Event.Pending.expected:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderConstraints - 76, // 43: terraform1.BuildProviderPluginCache.Event.FetchBegin.provider_version:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion - 76, // 44: terraform1.BuildProviderPluginCache.Event.FetchComplete.provider_version:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion - 3, // 45: terraform1.BuildProviderPluginCache.Event.FetchComplete.auth_result:type_name -> terraform1.BuildProviderPluginCache.Event.FetchComplete.AuthResult - 27, // 46: terraform1.GetCachedProviders.Response.available_providers:type_name -> terraform1.ProviderPackage - 27, // 47: terraform1.GetBuiltInProviders.Response.available_providers:type_name -> terraform1.ProviderPackage - 28, // 48: terraform1.GetProviderSchema.Response.schema:type_name -> terraform1.ProviderSchema - 51, // 49: terraform1.ProviderSchema.ManagedResourceTypesEntry.value:type_name -> terraform1.Schema - 51, // 50: terraform1.ProviderSchema.DataResourceTypesEntry.value:type_name -> terraform1.Schema - 44, // 51: terraform1.OpenStackConfiguration.Request.source_address:type_name -> terraform1.SourceAddress - 48, // 52: terraform1.OpenStackConfiguration.Response.diagnostics:type_name -> terraform1.Diagnostic - 48, // 53: terraform1.ValidateStackConfiguration.Response.diagnostics:type_name -> terraform1.Diagnostic - 100, // 54: terraform1.FindStackConfigurationComponents.Response.config:type_name -> terraform1.FindStackConfigurationComponents.StackConfig - 103, // 55: terraform1.FindStackConfigurationComponents.StackConfig.components:type_name -> terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry - 104, // 56: terraform1.FindStackConfigurationComponents.StackConfig.embedded_stacks:type_name -> terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry - 4, // 57: terraform1.FindStackConfigurationComponents.EmbeddedStack.instances:type_name -> terraform1.FindStackConfigurationComponents.Instances - 100, // 58: terraform1.FindStackConfigurationComponents.EmbeddedStack.config:type_name -> terraform1.FindStackConfigurationComponents.StackConfig - 4, // 59: terraform1.FindStackConfigurationComponents.Component.instances:type_name -> terraform1.FindStackConfigurationComponents.Instances - 102, // 60: terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry.value:type_name -> terraform1.FindStackConfigurationComponents.Component - 101, // 61: terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry.value:type_name -> terraform1.FindStackConfigurationComponents.EmbeddedStack - 1, // 62: terraform1.PlanStackChanges.Request.plan_mode:type_name -> terraform1.PlanMode - 107, // 63: terraform1.PlanStackChanges.Request.previous_state:type_name -> terraform1.PlanStackChanges.Request.PreviousStateEntry - 108, // 64: terraform1.PlanStackChanges.Request.input_values:type_name -> terraform1.PlanStackChanges.Request.InputValuesEntry - 45, // 65: terraform1.PlanStackChanges.Event.planned_change:type_name -> terraform1.PlannedChange - 48, // 66: terraform1.PlanStackChanges.Event.diagnostic:type_name -> terraform1.Diagnostic - 47, // 67: terraform1.PlanStackChanges.Event.progress:type_name -> terraform1.StackChangeProgress - 156, // 68: terraform1.PlanStackChanges.Request.PreviousStateEntry.value:type_name -> google.protobuf.Any - 39, // 69: terraform1.PlanStackChanges.Request.InputValuesEntry.value:type_name -> terraform1.DynamicValueWithSource - 156, // 70: terraform1.ApplyStackChanges.Request.planned_changes:type_name -> google.protobuf.Any - 46, // 71: terraform1.ApplyStackChanges.Event.applied_change:type_name -> terraform1.AppliedChange - 48, // 72: terraform1.ApplyStackChanges.Event.diagnostic:type_name -> terraform1.Diagnostic - 47, // 73: terraform1.ApplyStackChanges.Event.progress:type_name -> terraform1.StackChangeProgress - 113, // 74: terraform1.OpenStackInspector.Request.state:type_name -> terraform1.OpenStackInspector.Request.StateEntry - 114, // 75: terraform1.OpenStackInspector.Request.input_values:type_name -> terraform1.OpenStackInspector.Request.InputValuesEntry - 48, // 76: terraform1.OpenStackInspector.Response.diagnostics:type_name -> terraform1.Diagnostic - 156, // 77: terraform1.OpenStackInspector.Request.StateEntry.value:type_name -> google.protobuf.Any - 39, // 78: terraform1.OpenStackInspector.Request.InputValuesEntry.value:type_name -> terraform1.DynamicValueWithSource - 37, // 79: terraform1.InspectExpressionResult.Response.result:type_name -> terraform1.DynamicValue - 48, // 80: terraform1.InspectExpressionResult.Response.diagnostics:type_name -> terraform1.Diagnostic - 119, // 81: terraform1.PlannedChange.ChangeDescription.component_instance_planned:type_name -> terraform1.PlannedChange.ComponentInstance - 120, // 82: terraform1.PlannedChange.ChangeDescription.resource_instance_planned:type_name -> terraform1.PlannedChange.ResourceInstance - 121, // 83: terraform1.PlannedChange.ChangeDescription.output_value_planned:type_name -> terraform1.PlannedChange.OutputValue - 41, // 84: terraform1.PlannedChange.ComponentInstance.addr:type_name -> terraform1.ComponentInstanceInStackAddr - 2, // 85: terraform1.PlannedChange.ComponentInstance.actions:type_name -> terraform1.ChangeType - 43, // 86: terraform1.PlannedChange.ResourceInstance.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr - 2, // 87: terraform1.PlannedChange.ResourceInstance.actions:type_name -> terraform1.ChangeType - 38, // 88: terraform1.PlannedChange.ResourceInstance.values:type_name -> terraform1.DynamicValueChange - 122, // 89: terraform1.PlannedChange.ResourceInstance.moved:type_name -> terraform1.PlannedChange.ResourceInstance.Moved - 123, // 90: terraform1.PlannedChange.ResourceInstance.imported:type_name -> terraform1.PlannedChange.ResourceInstance.Imported - 0, // 91: terraform1.PlannedChange.ResourceInstance.resource_mode:type_name -> terraform1.ResourceMode - 37, // 92: terraform1.PlannedChange.ResourceInstance.previous_run_value:type_name -> terraform1.DynamicValue - 40, // 93: terraform1.PlannedChange.ResourceInstance.replace_paths:type_name -> terraform1.AttributePath - 2, // 94: terraform1.PlannedChange.OutputValue.actions:type_name -> terraform1.ChangeType - 38, // 95: terraform1.PlannedChange.OutputValue.values:type_name -> terraform1.DynamicValueChange - 42, // 96: terraform1.PlannedChange.ResourceInstance.Moved.prev_addr:type_name -> terraform1.ResourceInstanceInStackAddr - 156, // 97: terraform1.AppliedChange.RawChange.value:type_name -> google.protobuf.Any - 129, // 98: terraform1.AppliedChange.ChangeDescription.deleted:type_name -> terraform1.AppliedChange.Nothing - 126, // 99: terraform1.AppliedChange.ChangeDescription.resource_instance:type_name -> terraform1.AppliedChange.ResourceInstance - 128, // 100: terraform1.AppliedChange.ChangeDescription.output_value:type_name -> terraform1.AppliedChange.OutputValue - 127, // 101: terraform1.AppliedChange.ChangeDescription.component_instance:type_name -> terraform1.AppliedChange.ComponentInstance - 43, // 102: terraform1.AppliedChange.ResourceInstance.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr - 37, // 103: terraform1.AppliedChange.ResourceInstance.new_value:type_name -> terraform1.DynamicValue - 0, // 104: terraform1.AppliedChange.ResourceInstance.resource_mode:type_name -> terraform1.ResourceMode - 130, // 105: terraform1.AppliedChange.ComponentInstance.output_values:type_name -> terraform1.AppliedChange.ComponentInstance.OutputValuesEntry - 37, // 106: terraform1.AppliedChange.OutputValue.new_value:type_name -> terraform1.DynamicValue - 37, // 107: terraform1.AppliedChange.ComponentInstance.OutputValuesEntry.value:type_name -> terraform1.DynamicValue - 41, // 108: terraform1.StackChangeProgress.ComponentInstanceStatus.addr:type_name -> terraform1.ComponentInstanceInStackAddr - 5, // 109: terraform1.StackChangeProgress.ComponentInstanceStatus.status:type_name -> terraform1.StackChangeProgress.ComponentInstanceStatus.Status - 43, // 110: terraform1.StackChangeProgress.ResourceInstanceStatus.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr - 6, // 111: terraform1.StackChangeProgress.ResourceInstanceStatus.status:type_name -> terraform1.StackChangeProgress.ResourceInstanceStatus.Status - 43, // 112: terraform1.StackChangeProgress.ResourceInstancePlannedChange.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr - 2, // 113: terraform1.StackChangeProgress.ResourceInstancePlannedChange.actions:type_name -> terraform1.ChangeType - 138, // 114: terraform1.StackChangeProgress.ResourceInstancePlannedChange.moved:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved - 139, // 115: terraform1.StackChangeProgress.ResourceInstancePlannedChange.imported:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange.Imported - 43, // 116: terraform1.StackChangeProgress.ProvisionerStatus.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr - 134, // 117: terraform1.StackChangeProgress.ProvisionerStatus.status:type_name -> terraform1.StackChangeProgress.ProvisionerStatus - 43, // 118: terraform1.StackChangeProgress.ProvisionerOutput.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr - 41, // 119: terraform1.StackChangeProgress.ComponentInstanceChanges.addr:type_name -> terraform1.ComponentInstanceInStackAddr - 42, // 120: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved.prev_addr:type_name -> terraform1.ResourceInstanceInStackAddr - 141, // 121: terraform1.Schema.Block.attributes:type_name -> terraform1.Schema.Attribute - 142, // 122: terraform1.Schema.Block.block_types:type_name -> terraform1.Schema.NestedBlock - 144, // 123: terraform1.Schema.Block.description:type_name -> terraform1.Schema.DocString - 143, // 124: terraform1.Schema.Attribute.nested_type:type_name -> terraform1.Schema.Object - 144, // 125: terraform1.Schema.Attribute.description:type_name -> terraform1.Schema.DocString - 140, // 126: terraform1.Schema.NestedBlock.block:type_name -> terraform1.Schema.Block - 9, // 127: terraform1.Schema.NestedBlock.nesting:type_name -> terraform1.Schema.NestedBlock.NestingMode - 141, // 128: terraform1.Schema.Object.attributes:type_name -> terraform1.Schema.Attribute - 10, // 129: terraform1.Schema.Object.nesting:type_name -> terraform1.Schema.Object.NestingMode - 11, // 130: terraform1.Schema.DocString.format:type_name -> terraform1.Schema.DocString.Format - 48, // 131: terraform1.ProviderPackageVersions.Response.diagnostics:type_name -> terraform1.Diagnostic - 149, // 132: terraform1.FetchProviderPackage.Response.results:type_name -> terraform1.FetchProviderPackage.PlatformResult - 48, // 133: terraform1.FetchProviderPackage.Response.diagnostics:type_name -> terraform1.Diagnostic - 27, // 134: terraform1.FetchProviderPackage.PlatformResult.provider:type_name -> terraform1.ProviderPackage - 48, // 135: terraform1.FetchProviderPackage.PlatformResult.diagnostics:type_name -> terraform1.Diagnostic - 48, // 136: terraform1.ModulePackageVersions.Response.diagnostics:type_name -> terraform1.Diagnostic - 48, // 137: terraform1.ModulePackageSourceAddr.Response.diagnostics:type_name -> terraform1.Diagnostic - 48, // 138: terraform1.FetchModulePackage.Response.diagnostics:type_name -> terraform1.Diagnostic - 57, // 139: terraform1.Setup.Handshake:input_type -> terraform1.Handshake.Request - 59, // 140: terraform1.Dependencies.OpenSourceBundle:input_type -> terraform1.OpenSourceBundle.Request - 61, // 141: terraform1.Dependencies.CloseSourceBundle:input_type -> terraform1.CloseSourceBundle.Request - 63, // 142: terraform1.Dependencies.OpenDependencyLockFile:input_type -> terraform1.OpenDependencyLockFile.Request - 65, // 143: terraform1.Dependencies.CreateDependencyLocks:input_type -> terraform1.CreateDependencyLocks.Request - 67, // 144: terraform1.Dependencies.CloseDependencyLocks:input_type -> terraform1.CloseDependencyLocks.Request - 69, // 145: terraform1.Dependencies.GetLockedProviderDependencies:input_type -> terraform1.GetLockedProviderDependencies.Request - 71, // 146: terraform1.Dependencies.BuildProviderPluginCache:input_type -> terraform1.BuildProviderPluginCache.Request - 80, // 147: terraform1.Dependencies.OpenProviderPluginCache:input_type -> terraform1.OpenProviderPluginCache.Request - 82, // 148: terraform1.Dependencies.CloseProviderPluginCache:input_type -> terraform1.CloseProviderPluginCache.Request - 84, // 149: terraform1.Dependencies.GetCachedProviders:input_type -> terraform1.GetCachedProviders.Request - 86, // 150: terraform1.Dependencies.GetBuiltInProviders:input_type -> terraform1.GetBuiltInProviders.Request - 88, // 151: terraform1.Dependencies.GetProviderSchema:input_type -> terraform1.GetProviderSchema.Request - 92, // 152: terraform1.Stacks.OpenStackConfiguration:input_type -> terraform1.OpenStackConfiguration.Request - 94, // 153: terraform1.Stacks.CloseStackConfiguration:input_type -> terraform1.CloseStackConfiguration.Request - 96, // 154: terraform1.Stacks.ValidateStackConfiguration:input_type -> terraform1.ValidateStackConfiguration.Request - 98, // 155: terraform1.Stacks.FindStackConfigurationComponents:input_type -> terraform1.FindStackConfigurationComponents.Request - 105, // 156: terraform1.Stacks.PlanStackChanges:input_type -> terraform1.PlanStackChanges.Request - 109, // 157: terraform1.Stacks.ApplyStackChanges:input_type -> terraform1.ApplyStackChanges.Request - 111, // 158: terraform1.Stacks.OpenStackInspector:input_type -> terraform1.OpenStackInspector.Request - 115, // 159: terraform1.Stacks.InspectExpressionResult:input_type -> terraform1.InspectExpressionResult.Request - 145, // 160: terraform1.Packages.ProviderPackageVersions:input_type -> terraform1.ProviderPackageVersions.Request - 147, // 161: terraform1.Packages.FetchProviderPackage:input_type -> terraform1.FetchProviderPackage.Request - 150, // 162: terraform1.Packages.ModulePackageVersions:input_type -> terraform1.ModulePackageVersions.Request - 152, // 163: terraform1.Packages.ModulePackageSourceAddr:input_type -> terraform1.ModulePackageSourceAddr.Request - 154, // 164: terraform1.Packages.FetchModulePackage:input_type -> terraform1.FetchModulePackage.Request - 58, // 165: terraform1.Setup.Handshake:output_type -> terraform1.Handshake.Response - 60, // 166: terraform1.Dependencies.OpenSourceBundle:output_type -> terraform1.OpenSourceBundle.Response - 62, // 167: terraform1.Dependencies.CloseSourceBundle:output_type -> terraform1.CloseSourceBundle.Response - 64, // 168: terraform1.Dependencies.OpenDependencyLockFile:output_type -> terraform1.OpenDependencyLockFile.Response - 66, // 169: terraform1.Dependencies.CreateDependencyLocks:output_type -> terraform1.CreateDependencyLocks.Response - 68, // 170: terraform1.Dependencies.CloseDependencyLocks:output_type -> terraform1.CloseDependencyLocks.Response - 70, // 171: terraform1.Dependencies.GetLockedProviderDependencies:output_type -> terraform1.GetLockedProviderDependencies.Response - 72, // 172: terraform1.Dependencies.BuildProviderPluginCache:output_type -> terraform1.BuildProviderPluginCache.Event - 81, // 173: terraform1.Dependencies.OpenProviderPluginCache:output_type -> terraform1.OpenProviderPluginCache.Response - 83, // 174: terraform1.Dependencies.CloseProviderPluginCache:output_type -> terraform1.CloseProviderPluginCache.Response - 85, // 175: terraform1.Dependencies.GetCachedProviders:output_type -> terraform1.GetCachedProviders.Response - 87, // 176: terraform1.Dependencies.GetBuiltInProviders:output_type -> terraform1.GetBuiltInProviders.Response - 89, // 177: terraform1.Dependencies.GetProviderSchema:output_type -> terraform1.GetProviderSchema.Response - 93, // 178: terraform1.Stacks.OpenStackConfiguration:output_type -> terraform1.OpenStackConfiguration.Response - 95, // 179: terraform1.Stacks.CloseStackConfiguration:output_type -> terraform1.CloseStackConfiguration.Response - 97, // 180: terraform1.Stacks.ValidateStackConfiguration:output_type -> terraform1.ValidateStackConfiguration.Response - 99, // 181: terraform1.Stacks.FindStackConfigurationComponents:output_type -> terraform1.FindStackConfigurationComponents.Response - 106, // 182: terraform1.Stacks.PlanStackChanges:output_type -> terraform1.PlanStackChanges.Event - 110, // 183: terraform1.Stacks.ApplyStackChanges:output_type -> terraform1.ApplyStackChanges.Event - 112, // 184: terraform1.Stacks.OpenStackInspector:output_type -> terraform1.OpenStackInspector.Response - 116, // 185: terraform1.Stacks.InspectExpressionResult:output_type -> terraform1.InspectExpressionResult.Response - 146, // 186: terraform1.Packages.ProviderPackageVersions:output_type -> terraform1.ProviderPackageVersions.Response - 148, // 187: terraform1.Packages.FetchProviderPackage:output_type -> terraform1.FetchProviderPackage.Response - 151, // 188: terraform1.Packages.ModulePackageVersions:output_type -> terraform1.ModulePackageVersions.Response - 153, // 189: terraform1.Packages.ModulePackageSourceAddr:output_type -> terraform1.ModulePackageSourceAddr.Response - 155, // 190: terraform1.Packages.FetchModulePackage:output_type -> terraform1.FetchModulePackage.Response - 165, // [165:191] is the sub-list for method output_type - 139, // [139:165] is the sub-list for method input_type - 139, // [139:139] is the sub-list for extension type_name - 139, // [139:139] is the sub-list for extension extendee - 0, // [0:139] is the sub-list for field type_name + 61, // 0: terraform1.Config.credentials:type_name -> terraform1.Config.CredentialsEntry + 53, // 1: terraform1.ProviderSchema.provider_config:type_name -> terraform1.Schema + 93, // 2: terraform1.ProviderSchema.managed_resource_types:type_name -> terraform1.ProviderSchema.ManagedResourceTypesEntry + 94, // 3: terraform1.ProviderSchema.data_resource_types:type_name -> terraform1.ProviderSchema.DataResourceTypesEntry + 42, // 4: terraform1.DynamicValue.sensitive:type_name -> terraform1.AttributePath + 39, // 5: terraform1.DynamicValueChange.old:type_name -> terraform1.DynamicValue + 39, // 6: terraform1.DynamicValueChange.new:type_name -> terraform1.DynamicValue + 39, // 7: terraform1.DynamicValueWithSource.value:type_name -> terraform1.DynamicValue + 51, // 8: terraform1.DynamicValueWithSource.source_range:type_name -> terraform1.SourceRange + 120, // 9: terraform1.AttributePath.steps:type_name -> terraform1.AttributePath.Step + 159, // 10: terraform1.PlannedChange.raw:type_name -> google.protobuf.Any + 121, // 11: terraform1.PlannedChange.descriptions:type_name -> terraform1.PlannedChange.ChangeDescription + 127, // 12: terraform1.AppliedChange.raw:type_name -> terraform1.AppliedChange.RawChange + 128, // 13: terraform1.AppliedChange.descriptions:type_name -> terraform1.AppliedChange.ChangeDescription + 134, // 14: terraform1.StackChangeProgress.component_instance_status:type_name -> terraform1.StackChangeProgress.ComponentInstanceStatus + 135, // 15: terraform1.StackChangeProgress.resource_instance_status:type_name -> terraform1.StackChangeProgress.ResourceInstanceStatus + 136, // 16: terraform1.StackChangeProgress.resource_instance_planned_change:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange + 137, // 17: terraform1.StackChangeProgress.provisioner_status:type_name -> terraform1.StackChangeProgress.ProvisionerStatus + 138, // 18: terraform1.StackChangeProgress.provisioner_output:type_name -> terraform1.StackChangeProgress.ProvisionerOutput + 139, // 19: terraform1.StackChangeProgress.component_instance_changes:type_name -> terraform1.StackChangeProgress.ComponentInstanceChanges + 140, // 20: terraform1.StackChangeProgress.component_instances:type_name -> terraform1.StackChangeProgress.ComponentInstances + 8, // 21: terraform1.Diagnostic.severity:type_name -> terraform1.Diagnostic.Severity + 51, // 22: terraform1.Diagnostic.subject:type_name -> terraform1.SourceRange + 51, // 23: terraform1.Diagnostic.context:type_name -> terraform1.SourceRange + 52, // 24: terraform1.SourceRange.start:type_name -> terraform1.SourcePos + 52, // 25: terraform1.SourceRange.end:type_name -> terraform1.SourcePos + 143, // 26: terraform1.Schema.block:type_name -> terraform1.Schema.Block + 13, // 27: terraform1.Handshake.Request.capabilities:type_name -> terraform1.ClientCapabilities + 15, // 28: terraform1.Handshake.Request.config:type_name -> terraform1.Config + 14, // 29: terraform1.Handshake.Response.capabilities:type_name -> terraform1.ServerCapabilities + 16, // 30: terraform1.Config.CredentialsEntry.value:type_name -> terraform1.HostCredential + 46, // 31: terraform1.OpenDependencyLockFile.Request.source_address:type_name -> terraform1.SourceAddress + 50, // 32: terraform1.OpenDependencyLockFile.Response.diagnostics:type_name -> terraform1.Diagnostic + 29, // 33: terraform1.CreateDependencyLocks.Request.provider_selections:type_name -> terraform1.ProviderPackage + 29, // 34: terraform1.GetLockedProviderDependencies.Response.selected_providers:type_name -> terraform1.ProviderPackage + 76, // 35: terraform1.BuildProviderPluginCache.Request.installation_methods:type_name -> terraform1.BuildProviderPluginCache.Request.InstallMethod + 77, // 36: terraform1.BuildProviderPluginCache.Event.pending:type_name -> terraform1.BuildProviderPluginCache.Event.Pending + 79, // 37: terraform1.BuildProviderPluginCache.Event.already_installed:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion + 79, // 38: terraform1.BuildProviderPluginCache.Event.built_in:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion + 78, // 39: terraform1.BuildProviderPluginCache.Event.query_begin:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderConstraints + 79, // 40: terraform1.BuildProviderPluginCache.Event.query_success:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion + 80, // 41: terraform1.BuildProviderPluginCache.Event.query_warnings:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderWarnings + 81, // 42: terraform1.BuildProviderPluginCache.Event.fetch_begin:type_name -> terraform1.BuildProviderPluginCache.Event.FetchBegin + 82, // 43: terraform1.BuildProviderPluginCache.Event.fetch_complete:type_name -> terraform1.BuildProviderPluginCache.Event.FetchComplete + 50, // 44: terraform1.BuildProviderPluginCache.Event.diagnostic:type_name -> terraform1.Diagnostic + 78, // 45: terraform1.BuildProviderPluginCache.Event.Pending.expected:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderConstraints + 79, // 46: terraform1.BuildProviderPluginCache.Event.FetchBegin.provider_version:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion + 79, // 47: terraform1.BuildProviderPluginCache.Event.FetchComplete.provider_version:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion + 3, // 48: terraform1.BuildProviderPluginCache.Event.FetchComplete.auth_result:type_name -> terraform1.BuildProviderPluginCache.Event.FetchComplete.AuthResult + 29, // 49: terraform1.GetCachedProviders.Response.available_providers:type_name -> terraform1.ProviderPackage + 29, // 50: terraform1.GetBuiltInProviders.Response.available_providers:type_name -> terraform1.ProviderPackage + 30, // 51: terraform1.GetProviderSchema.Response.schema:type_name -> terraform1.ProviderSchema + 53, // 52: terraform1.ProviderSchema.ManagedResourceTypesEntry.value:type_name -> terraform1.Schema + 53, // 53: terraform1.ProviderSchema.DataResourceTypesEntry.value:type_name -> terraform1.Schema + 46, // 54: terraform1.OpenStackConfiguration.Request.source_address:type_name -> terraform1.SourceAddress + 50, // 55: terraform1.OpenStackConfiguration.Response.diagnostics:type_name -> terraform1.Diagnostic + 50, // 56: terraform1.ValidateStackConfiguration.Response.diagnostics:type_name -> terraform1.Diagnostic + 103, // 57: terraform1.FindStackConfigurationComponents.Response.config:type_name -> terraform1.FindStackConfigurationComponents.StackConfig + 106, // 58: terraform1.FindStackConfigurationComponents.StackConfig.components:type_name -> terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry + 107, // 59: terraform1.FindStackConfigurationComponents.StackConfig.embedded_stacks:type_name -> terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry + 4, // 60: terraform1.FindStackConfigurationComponents.EmbeddedStack.instances:type_name -> terraform1.FindStackConfigurationComponents.Instances + 103, // 61: terraform1.FindStackConfigurationComponents.EmbeddedStack.config:type_name -> terraform1.FindStackConfigurationComponents.StackConfig + 4, // 62: terraform1.FindStackConfigurationComponents.Component.instances:type_name -> terraform1.FindStackConfigurationComponents.Instances + 105, // 63: terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry.value:type_name -> terraform1.FindStackConfigurationComponents.Component + 104, // 64: terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry.value:type_name -> terraform1.FindStackConfigurationComponents.EmbeddedStack + 1, // 65: terraform1.PlanStackChanges.Request.plan_mode:type_name -> terraform1.PlanMode + 110, // 66: terraform1.PlanStackChanges.Request.previous_state:type_name -> terraform1.PlanStackChanges.Request.PreviousStateEntry + 111, // 67: terraform1.PlanStackChanges.Request.input_values:type_name -> terraform1.PlanStackChanges.Request.InputValuesEntry + 47, // 68: terraform1.PlanStackChanges.Event.planned_change:type_name -> terraform1.PlannedChange + 50, // 69: terraform1.PlanStackChanges.Event.diagnostic:type_name -> terraform1.Diagnostic + 49, // 70: terraform1.PlanStackChanges.Event.progress:type_name -> terraform1.StackChangeProgress + 159, // 71: terraform1.PlanStackChanges.Request.PreviousStateEntry.value:type_name -> google.protobuf.Any + 41, // 72: terraform1.PlanStackChanges.Request.InputValuesEntry.value:type_name -> terraform1.DynamicValueWithSource + 159, // 73: terraform1.ApplyStackChanges.Request.planned_changes:type_name -> google.protobuf.Any + 48, // 74: terraform1.ApplyStackChanges.Event.applied_change:type_name -> terraform1.AppliedChange + 50, // 75: terraform1.ApplyStackChanges.Event.diagnostic:type_name -> terraform1.Diagnostic + 49, // 76: terraform1.ApplyStackChanges.Event.progress:type_name -> terraform1.StackChangeProgress + 116, // 77: terraform1.OpenStackInspector.Request.state:type_name -> terraform1.OpenStackInspector.Request.StateEntry + 117, // 78: terraform1.OpenStackInspector.Request.input_values:type_name -> terraform1.OpenStackInspector.Request.InputValuesEntry + 50, // 79: terraform1.OpenStackInspector.Response.diagnostics:type_name -> terraform1.Diagnostic + 159, // 80: terraform1.OpenStackInspector.Request.StateEntry.value:type_name -> google.protobuf.Any + 41, // 81: terraform1.OpenStackInspector.Request.InputValuesEntry.value:type_name -> terraform1.DynamicValueWithSource + 39, // 82: terraform1.InspectExpressionResult.Response.result:type_name -> terraform1.DynamicValue + 50, // 83: terraform1.InspectExpressionResult.Response.diagnostics:type_name -> terraform1.Diagnostic + 122, // 84: terraform1.PlannedChange.ChangeDescription.component_instance_planned:type_name -> terraform1.PlannedChange.ComponentInstance + 123, // 85: terraform1.PlannedChange.ChangeDescription.resource_instance_planned:type_name -> terraform1.PlannedChange.ResourceInstance + 124, // 86: terraform1.PlannedChange.ChangeDescription.output_value_planned:type_name -> terraform1.PlannedChange.OutputValue + 43, // 87: terraform1.PlannedChange.ComponentInstance.addr:type_name -> terraform1.ComponentInstanceInStackAddr + 2, // 88: terraform1.PlannedChange.ComponentInstance.actions:type_name -> terraform1.ChangeType + 45, // 89: terraform1.PlannedChange.ResourceInstance.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 2, // 90: terraform1.PlannedChange.ResourceInstance.actions:type_name -> terraform1.ChangeType + 40, // 91: terraform1.PlannedChange.ResourceInstance.values:type_name -> terraform1.DynamicValueChange + 125, // 92: terraform1.PlannedChange.ResourceInstance.moved:type_name -> terraform1.PlannedChange.ResourceInstance.Moved + 126, // 93: terraform1.PlannedChange.ResourceInstance.imported:type_name -> terraform1.PlannedChange.ResourceInstance.Imported + 0, // 94: terraform1.PlannedChange.ResourceInstance.resource_mode:type_name -> terraform1.ResourceMode + 39, // 95: terraform1.PlannedChange.ResourceInstance.previous_run_value:type_name -> terraform1.DynamicValue + 42, // 96: terraform1.PlannedChange.ResourceInstance.replace_paths:type_name -> terraform1.AttributePath + 2, // 97: terraform1.PlannedChange.OutputValue.actions:type_name -> terraform1.ChangeType + 40, // 98: terraform1.PlannedChange.OutputValue.values:type_name -> terraform1.DynamicValueChange + 44, // 99: terraform1.PlannedChange.ResourceInstance.Moved.prev_addr:type_name -> terraform1.ResourceInstanceInStackAddr + 159, // 100: terraform1.AppliedChange.RawChange.value:type_name -> google.protobuf.Any + 132, // 101: terraform1.AppliedChange.ChangeDescription.deleted:type_name -> terraform1.AppliedChange.Nothing + 129, // 102: terraform1.AppliedChange.ChangeDescription.resource_instance:type_name -> terraform1.AppliedChange.ResourceInstance + 131, // 103: terraform1.AppliedChange.ChangeDescription.output_value:type_name -> terraform1.AppliedChange.OutputValue + 130, // 104: terraform1.AppliedChange.ChangeDescription.component_instance:type_name -> terraform1.AppliedChange.ComponentInstance + 45, // 105: terraform1.AppliedChange.ResourceInstance.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 39, // 106: terraform1.AppliedChange.ResourceInstance.new_value:type_name -> terraform1.DynamicValue + 0, // 107: terraform1.AppliedChange.ResourceInstance.resource_mode:type_name -> terraform1.ResourceMode + 133, // 108: terraform1.AppliedChange.ComponentInstance.output_values:type_name -> terraform1.AppliedChange.ComponentInstance.OutputValuesEntry + 39, // 109: terraform1.AppliedChange.OutputValue.new_value:type_name -> terraform1.DynamicValue + 39, // 110: terraform1.AppliedChange.ComponentInstance.OutputValuesEntry.value:type_name -> terraform1.DynamicValue + 43, // 111: terraform1.StackChangeProgress.ComponentInstanceStatus.addr:type_name -> terraform1.ComponentInstanceInStackAddr + 5, // 112: terraform1.StackChangeProgress.ComponentInstanceStatus.status:type_name -> terraform1.StackChangeProgress.ComponentInstanceStatus.Status + 45, // 113: terraform1.StackChangeProgress.ResourceInstanceStatus.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 6, // 114: terraform1.StackChangeProgress.ResourceInstanceStatus.status:type_name -> terraform1.StackChangeProgress.ResourceInstanceStatus.Status + 45, // 115: terraform1.StackChangeProgress.ResourceInstancePlannedChange.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 2, // 116: terraform1.StackChangeProgress.ResourceInstancePlannedChange.actions:type_name -> terraform1.ChangeType + 141, // 117: terraform1.StackChangeProgress.ResourceInstancePlannedChange.moved:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved + 142, // 118: terraform1.StackChangeProgress.ResourceInstancePlannedChange.imported:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange.Imported + 45, // 119: terraform1.StackChangeProgress.ProvisionerStatus.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 137, // 120: terraform1.StackChangeProgress.ProvisionerStatus.status:type_name -> terraform1.StackChangeProgress.ProvisionerStatus + 45, // 121: terraform1.StackChangeProgress.ProvisionerOutput.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 43, // 122: terraform1.StackChangeProgress.ComponentInstanceChanges.addr:type_name -> terraform1.ComponentInstanceInStackAddr + 44, // 123: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved.prev_addr:type_name -> terraform1.ResourceInstanceInStackAddr + 144, // 124: terraform1.Schema.Block.attributes:type_name -> terraform1.Schema.Attribute + 145, // 125: terraform1.Schema.Block.block_types:type_name -> terraform1.Schema.NestedBlock + 147, // 126: terraform1.Schema.Block.description:type_name -> terraform1.Schema.DocString + 146, // 127: terraform1.Schema.Attribute.nested_type:type_name -> terraform1.Schema.Object + 147, // 128: terraform1.Schema.Attribute.description:type_name -> terraform1.Schema.DocString + 143, // 129: terraform1.Schema.NestedBlock.block:type_name -> terraform1.Schema.Block + 9, // 130: terraform1.Schema.NestedBlock.nesting:type_name -> terraform1.Schema.NestedBlock.NestingMode + 144, // 131: terraform1.Schema.Object.attributes:type_name -> terraform1.Schema.Attribute + 10, // 132: terraform1.Schema.Object.nesting:type_name -> terraform1.Schema.Object.NestingMode + 11, // 133: terraform1.Schema.DocString.format:type_name -> terraform1.Schema.DocString.Format + 50, // 134: terraform1.ProviderPackageVersions.Response.diagnostics:type_name -> terraform1.Diagnostic + 152, // 135: terraform1.FetchProviderPackage.Response.results:type_name -> terraform1.FetchProviderPackage.PlatformResult + 50, // 136: terraform1.FetchProviderPackage.Response.diagnostics:type_name -> terraform1.Diagnostic + 29, // 137: terraform1.FetchProviderPackage.PlatformResult.provider:type_name -> terraform1.ProviderPackage + 50, // 138: terraform1.FetchProviderPackage.PlatformResult.diagnostics:type_name -> terraform1.Diagnostic + 50, // 139: terraform1.ModulePackageVersions.Response.diagnostics:type_name -> terraform1.Diagnostic + 50, // 140: terraform1.ModulePackageSourceAddr.Response.diagnostics:type_name -> terraform1.Diagnostic + 50, // 141: terraform1.FetchModulePackage.Response.diagnostics:type_name -> terraform1.Diagnostic + 59, // 142: terraform1.Setup.Handshake:input_type -> terraform1.Handshake.Request + 62, // 143: terraform1.Dependencies.OpenSourceBundle:input_type -> terraform1.OpenSourceBundle.Request + 64, // 144: terraform1.Dependencies.CloseSourceBundle:input_type -> terraform1.CloseSourceBundle.Request + 66, // 145: terraform1.Dependencies.OpenDependencyLockFile:input_type -> terraform1.OpenDependencyLockFile.Request + 68, // 146: terraform1.Dependencies.CreateDependencyLocks:input_type -> terraform1.CreateDependencyLocks.Request + 70, // 147: terraform1.Dependencies.CloseDependencyLocks:input_type -> terraform1.CloseDependencyLocks.Request + 72, // 148: terraform1.Dependencies.GetLockedProviderDependencies:input_type -> terraform1.GetLockedProviderDependencies.Request + 74, // 149: terraform1.Dependencies.BuildProviderPluginCache:input_type -> terraform1.BuildProviderPluginCache.Request + 83, // 150: terraform1.Dependencies.OpenProviderPluginCache:input_type -> terraform1.OpenProviderPluginCache.Request + 85, // 151: terraform1.Dependencies.CloseProviderPluginCache:input_type -> terraform1.CloseProviderPluginCache.Request + 87, // 152: terraform1.Dependencies.GetCachedProviders:input_type -> terraform1.GetCachedProviders.Request + 89, // 153: terraform1.Dependencies.GetBuiltInProviders:input_type -> terraform1.GetBuiltInProviders.Request + 91, // 154: terraform1.Dependencies.GetProviderSchema:input_type -> terraform1.GetProviderSchema.Request + 95, // 155: terraform1.Stacks.OpenStackConfiguration:input_type -> terraform1.OpenStackConfiguration.Request + 97, // 156: terraform1.Stacks.CloseStackConfiguration:input_type -> terraform1.CloseStackConfiguration.Request + 99, // 157: terraform1.Stacks.ValidateStackConfiguration:input_type -> terraform1.ValidateStackConfiguration.Request + 101, // 158: terraform1.Stacks.FindStackConfigurationComponents:input_type -> terraform1.FindStackConfigurationComponents.Request + 108, // 159: terraform1.Stacks.PlanStackChanges:input_type -> terraform1.PlanStackChanges.Request + 112, // 160: terraform1.Stacks.ApplyStackChanges:input_type -> terraform1.ApplyStackChanges.Request + 114, // 161: terraform1.Stacks.OpenStackInspector:input_type -> terraform1.OpenStackInspector.Request + 118, // 162: terraform1.Stacks.InspectExpressionResult:input_type -> terraform1.InspectExpressionResult.Request + 148, // 163: terraform1.Packages.ProviderPackageVersions:input_type -> terraform1.ProviderPackageVersions.Request + 150, // 164: terraform1.Packages.FetchProviderPackage:input_type -> terraform1.FetchProviderPackage.Request + 153, // 165: terraform1.Packages.ModulePackageVersions:input_type -> terraform1.ModulePackageVersions.Request + 155, // 166: terraform1.Packages.ModulePackageSourceAddr:input_type -> terraform1.ModulePackageSourceAddr.Request + 157, // 167: terraform1.Packages.FetchModulePackage:input_type -> terraform1.FetchModulePackage.Request + 60, // 168: terraform1.Setup.Handshake:output_type -> terraform1.Handshake.Response + 63, // 169: terraform1.Dependencies.OpenSourceBundle:output_type -> terraform1.OpenSourceBundle.Response + 65, // 170: terraform1.Dependencies.CloseSourceBundle:output_type -> terraform1.CloseSourceBundle.Response + 67, // 171: terraform1.Dependencies.OpenDependencyLockFile:output_type -> terraform1.OpenDependencyLockFile.Response + 69, // 172: terraform1.Dependencies.CreateDependencyLocks:output_type -> terraform1.CreateDependencyLocks.Response + 71, // 173: terraform1.Dependencies.CloseDependencyLocks:output_type -> terraform1.CloseDependencyLocks.Response + 73, // 174: terraform1.Dependencies.GetLockedProviderDependencies:output_type -> terraform1.GetLockedProviderDependencies.Response + 75, // 175: terraform1.Dependencies.BuildProviderPluginCache:output_type -> terraform1.BuildProviderPluginCache.Event + 84, // 176: terraform1.Dependencies.OpenProviderPluginCache:output_type -> terraform1.OpenProviderPluginCache.Response + 86, // 177: terraform1.Dependencies.CloseProviderPluginCache:output_type -> terraform1.CloseProviderPluginCache.Response + 88, // 178: terraform1.Dependencies.GetCachedProviders:output_type -> terraform1.GetCachedProviders.Response + 90, // 179: terraform1.Dependencies.GetBuiltInProviders:output_type -> terraform1.GetBuiltInProviders.Response + 92, // 180: terraform1.Dependencies.GetProviderSchema:output_type -> terraform1.GetProviderSchema.Response + 96, // 181: terraform1.Stacks.OpenStackConfiguration:output_type -> terraform1.OpenStackConfiguration.Response + 98, // 182: terraform1.Stacks.CloseStackConfiguration:output_type -> terraform1.CloseStackConfiguration.Response + 100, // 183: terraform1.Stacks.ValidateStackConfiguration:output_type -> terraform1.ValidateStackConfiguration.Response + 102, // 184: terraform1.Stacks.FindStackConfigurationComponents:output_type -> terraform1.FindStackConfigurationComponents.Response + 109, // 185: terraform1.Stacks.PlanStackChanges:output_type -> terraform1.PlanStackChanges.Event + 113, // 186: terraform1.Stacks.ApplyStackChanges:output_type -> terraform1.ApplyStackChanges.Event + 115, // 187: terraform1.Stacks.OpenStackInspector:output_type -> terraform1.OpenStackInspector.Response + 119, // 188: terraform1.Stacks.InspectExpressionResult:output_type -> terraform1.InspectExpressionResult.Response + 149, // 189: terraform1.Packages.ProviderPackageVersions:output_type -> terraform1.ProviderPackageVersions.Response + 151, // 190: terraform1.Packages.FetchProviderPackage:output_type -> terraform1.FetchProviderPackage.Response + 154, // 191: terraform1.Packages.ModulePackageVersions:output_type -> terraform1.ModulePackageVersions.Response + 156, // 192: terraform1.Packages.ModulePackageSourceAddr:output_type -> terraform1.ModulePackageSourceAddr.Response + 158, // 193: terraform1.Packages.FetchModulePackage:output_type -> terraform1.FetchModulePackage.Response + 168, // [168:194] is the sub-list for method output_type + 142, // [142:168] is the sub-list for method input_type + 142, // [142:142] is the sub-list for extension type_name + 142, // [142:142] is the sub-list for extension extendee + 0, // [0:142] is the sub-list for field type_name } func init() { file_terraform1_proto_init() } @@ -10448,7 +10572,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenSourceBundle); i { + switch v := v.(*Config); i { case 0: return &v.state case 1: @@ -10460,7 +10584,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseSourceBundle); i { + switch v := v.(*HostCredential); i { case 0: return &v.state case 1: @@ -10472,7 +10596,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenDependencyLockFile); i { + switch v := v.(*OpenSourceBundle); i { case 0: return &v.state case 1: @@ -10484,7 +10608,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateDependencyLocks); i { + switch v := v.(*CloseSourceBundle); i { case 0: return &v.state case 1: @@ -10496,7 +10620,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseDependencyLocks); i { + switch v := v.(*OpenDependencyLockFile); i { case 0: return &v.state case 1: @@ -10508,7 +10632,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLockedProviderDependencies); i { + switch v := v.(*CreateDependencyLocks); i { case 0: return &v.state case 1: @@ -10520,7 +10644,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache); i { + switch v := v.(*CloseDependencyLocks); i { case 0: return &v.state case 1: @@ -10532,7 +10656,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenProviderPluginCache); i { + switch v := v.(*GetLockedProviderDependencies); i { case 0: return &v.state case 1: @@ -10544,7 +10668,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseProviderPluginCache); i { + switch v := v.(*BuildProviderPluginCache); i { case 0: return &v.state case 1: @@ -10556,7 +10680,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCachedProviders); i { + switch v := v.(*OpenProviderPluginCache); i { case 0: return &v.state case 1: @@ -10568,7 +10692,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBuiltInProviders); i { + switch v := v.(*CloseProviderPluginCache); i { case 0: return &v.state case 1: @@ -10580,7 +10704,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetProviderSchema); i { + switch v := v.(*GetCachedProviders); i { case 0: return &v.state case 1: @@ -10592,7 +10716,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProviderPackage); i { + switch v := v.(*GetBuiltInProviders); i { case 0: return &v.state case 1: @@ -10604,7 +10728,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProviderSchema); i { + switch v := v.(*GetProviderSchema); i { case 0: return &v.state case 1: @@ -10616,7 +10740,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenStackConfiguration); i { + switch v := v.(*ProviderPackage); i { case 0: return &v.state case 1: @@ -10628,7 +10752,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseStackConfiguration); i { + switch v := v.(*ProviderSchema); i { case 0: return &v.state case 1: @@ -10640,7 +10764,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateStackConfiguration); i { + switch v := v.(*OpenStackConfiguration); i { case 0: return &v.state case 1: @@ -10652,7 +10776,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindStackConfigurationComponents); i { + switch v := v.(*CloseStackConfiguration); i { case 0: return &v.state case 1: @@ -10664,7 +10788,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PlanStackChanges); i { + switch v := v.(*ValidateStackConfiguration); i { case 0: return &v.state case 1: @@ -10676,7 +10800,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApplyStackChanges); i { + switch v := v.(*FindStackConfigurationComponents); i { case 0: return &v.state case 1: @@ -10688,7 +10812,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenStackInspector); i { + switch v := v.(*PlanStackChanges); i { case 0: return &v.state case 1: @@ -10700,7 +10824,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InspectExpressionResult); i { + switch v := v.(*ApplyStackChanges); i { case 0: return &v.state case 1: @@ -10712,7 +10836,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DynamicValue); i { + switch v := v.(*OpenStackInspector); i { case 0: return &v.state case 1: @@ -10724,7 +10848,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DynamicValueChange); i { + switch v := v.(*InspectExpressionResult); i { case 0: return &v.state case 1: @@ -10736,7 +10860,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DynamicValueWithSource); i { + switch v := v.(*DynamicValue); i { case 0: return &v.state case 1: @@ -10748,7 +10872,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttributePath); i { + switch v := v.(*DynamicValueChange); i { case 0: return &v.state case 1: @@ -10760,7 +10884,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ComponentInstanceInStackAddr); i { + switch v := v.(*DynamicValueWithSource); i { case 0: return &v.state case 1: @@ -10772,7 +10896,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceInstanceInStackAddr); i { + switch v := v.(*AttributePath); i { case 0: return &v.state case 1: @@ -10784,7 +10908,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceInstanceObjectInStackAddr); i { + switch v := v.(*ComponentInstanceInStackAddr); i { case 0: return &v.state case 1: @@ -10796,7 +10920,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SourceAddress); i { + switch v := v.(*ResourceInstanceInStackAddr); i { case 0: return &v.state case 1: @@ -10808,7 +10932,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PlannedChange); i { + switch v := v.(*ResourceInstanceObjectInStackAddr); i { case 0: return &v.state case 1: @@ -10820,7 +10944,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppliedChange); i { + switch v := v.(*SourceAddress); i { case 0: return &v.state case 1: @@ -10832,7 +10956,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StackChangeProgress); i { + switch v := v.(*PlannedChange); i { case 0: return &v.state case 1: @@ -10844,7 +10968,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Diagnostic); i { + switch v := v.(*AppliedChange); i { case 0: return &v.state case 1: @@ -10856,7 +10980,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SourceRange); i { + switch v := v.(*StackChangeProgress); i { case 0: return &v.state case 1: @@ -10868,7 +10992,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SourcePos); i { + switch v := v.(*Diagnostic); i { case 0: return &v.state case 1: @@ -10880,7 +11004,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Schema); i { + switch v := v.(*SourceRange); i { case 0: return &v.state case 1: @@ -10892,7 +11016,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProviderPackageVersions); i { + switch v := v.(*SourcePos); i { case 0: return &v.state case 1: @@ -10904,7 +11028,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FetchProviderPackage); i { + switch v := v.(*Schema); i { case 0: return &v.state case 1: @@ -10916,7 +11040,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ModulePackageVersions); i { + switch v := v.(*ProviderPackageVersions); i { case 0: return &v.state case 1: @@ -10928,7 +11052,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ModulePackageSourceAddr); i { + switch v := v.(*FetchProviderPackage); i { case 0: return &v.state case 1: @@ -10940,7 +11064,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FetchModulePackage); i { + switch v := v.(*ModulePackageVersions); i { case 0: return &v.state case 1: @@ -10952,7 +11076,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Handshake_Request); i { + switch v := v.(*ModulePackageSourceAddr); i { case 0: return &v.state case 1: @@ -10964,7 +11088,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Handshake_Response); i { + switch v := v.(*FetchModulePackage); i { case 0: return &v.state case 1: @@ -10976,7 +11100,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenSourceBundle_Request); i { + switch v := v.(*Handshake_Request); i { case 0: return &v.state case 1: @@ -10988,19 +11112,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenSourceBundle_Response); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_terraform1_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseSourceBundle_Request); i { + switch v := v.(*Handshake_Response); i { case 0: return &v.state case 1: @@ -11012,7 +11124,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseSourceBundle_Response); i { + switch v := v.(*OpenSourceBundle_Request); i { case 0: return &v.state case 1: @@ -11024,7 +11136,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenDependencyLockFile_Request); i { + switch v := v.(*OpenSourceBundle_Response); i { case 0: return &v.state case 1: @@ -11036,7 +11148,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenDependencyLockFile_Response); i { + switch v := v.(*CloseSourceBundle_Request); i { case 0: return &v.state case 1: @@ -11048,7 +11160,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateDependencyLocks_Request); i { + switch v := v.(*CloseSourceBundle_Response); i { case 0: return &v.state case 1: @@ -11060,7 +11172,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateDependencyLocks_Response); i { + switch v := v.(*OpenDependencyLockFile_Request); i { case 0: return &v.state case 1: @@ -11072,7 +11184,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseDependencyLocks_Request); i { + switch v := v.(*OpenDependencyLockFile_Response); i { case 0: return &v.state case 1: @@ -11084,7 +11196,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseDependencyLocks_Response); i { + switch v := v.(*CreateDependencyLocks_Request); i { case 0: return &v.state case 1: @@ -11096,7 +11208,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLockedProviderDependencies_Request); i { + switch v := v.(*CreateDependencyLocks_Response); i { case 0: return &v.state case 1: @@ -11108,7 +11220,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLockedProviderDependencies_Response); i { + switch v := v.(*CloseDependencyLocks_Request); i { case 0: return &v.state case 1: @@ -11120,7 +11232,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Request); i { + switch v := v.(*CloseDependencyLocks_Response); i { case 0: return &v.state case 1: @@ -11132,7 +11244,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Event); i { + switch v := v.(*GetLockedProviderDependencies_Request); i { case 0: return &v.state case 1: @@ -11144,7 +11256,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Request_InstallMethod); i { + switch v := v.(*GetLockedProviderDependencies_Response); i { case 0: return &v.state case 1: @@ -11156,7 +11268,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Event_Pending); i { + switch v := v.(*BuildProviderPluginCache_Request); i { case 0: return &v.state case 1: @@ -11168,7 +11280,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Event_ProviderConstraints); i { + switch v := v.(*BuildProviderPluginCache_Event); i { case 0: return &v.state case 1: @@ -11180,7 +11292,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Event_ProviderVersion); i { + switch v := v.(*BuildProviderPluginCache_Request_InstallMethod); i { case 0: return &v.state case 1: @@ -11192,7 +11304,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Event_ProviderWarnings); i { + switch v := v.(*BuildProviderPluginCache_Event_Pending); i { case 0: return &v.state case 1: @@ -11204,7 +11316,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Event_FetchBegin); i { + switch v := v.(*BuildProviderPluginCache_Event_ProviderConstraints); i { case 0: return &v.state case 1: @@ -11216,7 +11328,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Event_FetchComplete); i { + switch v := v.(*BuildProviderPluginCache_Event_ProviderVersion); i { case 0: return &v.state case 1: @@ -11228,7 +11340,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenProviderPluginCache_Request); i { + switch v := v.(*BuildProviderPluginCache_Event_ProviderWarnings); i { case 0: return &v.state case 1: @@ -11240,7 +11352,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenProviderPluginCache_Response); i { + switch v := v.(*BuildProviderPluginCache_Event_FetchBegin); i { case 0: return &v.state case 1: @@ -11252,7 +11364,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseProviderPluginCache_Request); i { + switch v := v.(*BuildProviderPluginCache_Event_FetchComplete); i { case 0: return &v.state case 1: @@ -11264,7 +11376,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseProviderPluginCache_Response); i { + switch v := v.(*OpenProviderPluginCache_Request); i { case 0: return &v.state case 1: @@ -11276,7 +11388,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCachedProviders_Request); i { + switch v := v.(*OpenProviderPluginCache_Response); i { case 0: return &v.state case 1: @@ -11288,7 +11400,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCachedProviders_Response); i { + switch v := v.(*CloseProviderPluginCache_Request); i { case 0: return &v.state case 1: @@ -11300,7 +11412,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBuiltInProviders_Request); i { + switch v := v.(*CloseProviderPluginCache_Response); i { case 0: return &v.state case 1: @@ -11312,7 +11424,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBuiltInProviders_Response); i { + switch v := v.(*GetCachedProviders_Request); i { case 0: return &v.state case 1: @@ -11324,7 +11436,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetProviderSchema_Request); i { + switch v := v.(*GetCachedProviders_Response); i { case 0: return &v.state case 1: @@ -11336,7 +11448,31 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetProviderSchema_Response); i { + switch v := v.(*GetBuiltInProviders_Request); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBuiltInProviders_Response); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetProviderSchema_Request); i { case 0: return &v.state case 1: @@ -11348,31 +11484,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenStackConfiguration_Request); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_terraform1_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenStackConfiguration_Response); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_terraform1_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseStackConfiguration_Request); i { + switch v := v.(*GetProviderSchema_Response); i { case 0: return &v.state case 1: @@ -11384,7 +11496,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseStackConfiguration_Response); i { + switch v := v.(*OpenStackConfiguration_Request); i { case 0: return &v.state case 1: @@ -11396,7 +11508,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateStackConfiguration_Request); i { + switch v := v.(*OpenStackConfiguration_Response); i { case 0: return &v.state case 1: @@ -11408,7 +11520,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateStackConfiguration_Response); i { + switch v := v.(*CloseStackConfiguration_Request); i { case 0: return &v.state case 1: @@ -11420,7 +11532,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindStackConfigurationComponents_Request); i { + switch v := v.(*CloseStackConfiguration_Response); i { case 0: return &v.state case 1: @@ -11432,7 +11544,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindStackConfigurationComponents_Response); i { + switch v := v.(*ValidateStackConfiguration_Request); i { case 0: return &v.state case 1: @@ -11444,7 +11556,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindStackConfigurationComponents_StackConfig); i { + switch v := v.(*ValidateStackConfiguration_Response); i { case 0: return &v.state case 1: @@ -11456,7 +11568,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindStackConfigurationComponents_EmbeddedStack); i { + switch v := v.(*FindStackConfigurationComponents_Request); i { case 0: return &v.state case 1: @@ -11468,7 +11580,31 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindStackConfigurationComponents_Component); i { + switch v := v.(*FindStackConfigurationComponents_Response); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FindStackConfigurationComponents_StackConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FindStackConfigurationComponents_EmbeddedStack); i { case 0: return &v.state case 1: @@ -11480,6 +11616,18 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FindStackConfigurationComponents_Component); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlanStackChanges_Request); i { case 0: return &v.state @@ -11491,7 +11639,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlanStackChanges_Event); i { case 0: return &v.state @@ -11503,7 +11651,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ApplyStackChanges_Request); i { case 0: return &v.state @@ -11515,7 +11663,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ApplyStackChanges_Event); i { case 0: return &v.state @@ -11527,7 +11675,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenStackInspector_Request); i { case 0: return &v.state @@ -11539,7 +11687,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenStackInspector_Response); i { case 0: return &v.state @@ -11551,7 +11699,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InspectExpressionResult_Request); i { case 0: return &v.state @@ -11563,7 +11711,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InspectExpressionResult_Response); i { case 0: return &v.state @@ -11575,7 +11723,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AttributePath_Step); i { case 0: return &v.state @@ -11587,7 +11735,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlannedChange_ChangeDescription); i { case 0: return &v.state @@ -11599,7 +11747,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlannedChange_ComponentInstance); i { case 0: return &v.state @@ -11611,7 +11759,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlannedChange_ResourceInstance); i { case 0: return &v.state @@ -11623,7 +11771,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlannedChange_OutputValue); i { case 0: return &v.state @@ -11635,7 +11783,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlannedChange_ResourceInstance_Moved); i { case 0: return &v.state @@ -11647,7 +11795,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlannedChange_ResourceInstance_Imported); i { case 0: return &v.state @@ -11659,7 +11807,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppliedChange_RawChange); i { case 0: return &v.state @@ -11671,7 +11819,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppliedChange_ChangeDescription); i { case 0: return &v.state @@ -11683,7 +11831,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppliedChange_ResourceInstance); i { case 0: return &v.state @@ -11695,7 +11843,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppliedChange_ComponentInstance); i { case 0: return &v.state @@ -11707,7 +11855,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppliedChange_OutputValue); i { case 0: return &v.state @@ -11719,7 +11867,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppliedChange_Nothing); i { case 0: return &v.state @@ -11731,7 +11879,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ComponentInstanceStatus); i { case 0: return &v.state @@ -11743,7 +11891,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ResourceInstanceStatus); i { case 0: return &v.state @@ -11755,7 +11903,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ResourceInstancePlannedChange); i { case 0: return &v.state @@ -11767,7 +11915,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ProvisionerStatus); i { case 0: return &v.state @@ -11779,7 +11927,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ProvisionerOutput); i { case 0: return &v.state @@ -11791,7 +11939,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ComponentInstanceChanges); i { case 0: return &v.state @@ -11803,7 +11951,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ComponentInstances); i { case 0: return &v.state @@ -11815,7 +11963,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ResourceInstancePlannedChange_Moved); i { case 0: return &v.state @@ -11827,7 +11975,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ResourceInstancePlannedChange_Imported); i { case 0: return &v.state @@ -11839,7 +11987,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Schema_Block); i { case 0: return &v.state @@ -11851,7 +11999,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Schema_Attribute); i { case 0: return &v.state @@ -11863,7 +12011,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Schema_NestedBlock); i { case 0: return &v.state @@ -11875,7 +12023,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Schema_Object); i { case 0: return &v.state @@ -11887,7 +12035,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Schema_DocString); i { case 0: return &v.state @@ -11899,7 +12047,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProviderPackageVersions_Request); i { case 0: return &v.state @@ -11911,7 +12059,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProviderPackageVersions_Response); i { case 0: return &v.state @@ -11923,7 +12071,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FetchProviderPackage_Request); i { case 0: return &v.state @@ -11935,7 +12083,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FetchProviderPackage_Response); i { case 0: return &v.state @@ -11947,7 +12095,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FetchProviderPackage_PlatformResult); i { case 0: return &v.state @@ -11959,7 +12107,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ModulePackageVersions_Request); i { case 0: return &v.state @@ -11971,7 +12119,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ModulePackageVersions_Response); i { case 0: return &v.state @@ -11983,7 +12131,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ModulePackageSourceAddr_Request); i { case 0: return &v.state @@ -11995,7 +12143,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ModulePackageSourceAddr_Response); i { case 0: return &v.state @@ -12007,7 +12155,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FetchModulePackage_Request); i { case 0: return &v.state @@ -12019,7 +12167,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FetchModulePackage_Response); i { case 0: return &v.state @@ -12032,7 +12180,7 @@ func file_terraform1_proto_init() { } } } - file_terraform1_proto_msgTypes[35].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[37].OneofWrappers = []interface{}{ (*StackChangeProgress_ComponentInstanceStatus_)(nil), (*StackChangeProgress_ResourceInstanceStatus_)(nil), (*StackChangeProgress_ResourceInstancePlannedChange_)(nil), @@ -12041,7 +12189,7 @@ func file_terraform1_proto_init() { (*StackChangeProgress_ComponentInstanceChanges_)(nil), (*StackChangeProgress_ComponentInstances_)(nil), } - file_terraform1_proto_msgTypes[60].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[63].OneofWrappers = []interface{}{ (*BuildProviderPluginCache_Event_Pending_)(nil), (*BuildProviderPluginCache_Event_AlreadyInstalled)(nil), (*BuildProviderPluginCache_Event_BuiltIn)(nil), @@ -12052,33 +12200,33 @@ func file_terraform1_proto_init() { (*BuildProviderPluginCache_Event_FetchComplete_)(nil), (*BuildProviderPluginCache_Event_Diagnostic)(nil), } - file_terraform1_proto_msgTypes[61].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[64].OneofWrappers = []interface{}{ (*BuildProviderPluginCache_Request_InstallMethod_Direct)(nil), (*BuildProviderPluginCache_Request_InstallMethod_LocalMirrorDir)(nil), (*BuildProviderPluginCache_Request_InstallMethod_NetworkMirrorUrl)(nil), } - file_terraform1_proto_msgTypes[94].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[97].OneofWrappers = []interface{}{ (*PlanStackChanges_Event_PlannedChange)(nil), (*PlanStackChanges_Event_Diagnostic)(nil), (*PlanStackChanges_Event_Progress)(nil), } - file_terraform1_proto_msgTypes[98].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[101].OneofWrappers = []interface{}{ (*ApplyStackChanges_Event_AppliedChange)(nil), (*ApplyStackChanges_Event_Diagnostic)(nil), (*ApplyStackChanges_Event_Progress)(nil), } - file_terraform1_proto_msgTypes[105].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[108].OneofWrappers = []interface{}{ (*AttributePath_Step_AttributeName)(nil), (*AttributePath_Step_ElementKeyString)(nil), (*AttributePath_Step_ElementKeyInt)(nil), } - file_terraform1_proto_msgTypes[106].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[109].OneofWrappers = []interface{}{ (*PlannedChange_ChangeDescription_ComponentInstancePlanned)(nil), (*PlannedChange_ChangeDescription_ResourceInstancePlanned)(nil), (*PlannedChange_ChangeDescription_OutputValuePlanned)(nil), (*PlannedChange_ChangeDescription_PlanApplyable)(nil), } - file_terraform1_proto_msgTypes[113].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[116].OneofWrappers = []interface{}{ (*AppliedChange_ChangeDescription_Deleted)(nil), (*AppliedChange_ChangeDescription_ResourceInstance)(nil), (*AppliedChange_ChangeDescription_OutputValue)(nil), @@ -12090,7 +12238,7 @@ func file_terraform1_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_terraform1_proto_rawDesc, NumEnums: 12, - NumMessages: 144, + NumMessages: 147, NumExtensions: 0, NumServices: 4, }, diff --git a/internal/rpcapi/terraform1/terraform1.proto b/internal/rpcapi/terraform1/terraform1.proto index 9ed67444d5..b7d48196cd 100644 --- a/internal/rpcapi/terraform1/terraform1.proto +++ b/internal/rpcapi/terraform1/terraform1.proto @@ -18,6 +18,7 @@ service Setup { message Handshake { message Request { ClientCapabilities capabilities = 1; + Config config = 2; } message Response { ServerCapabilities capabilities = 2; @@ -112,6 +113,14 @@ service Dependencies { rpc GetProviderSchema(GetProviderSchema.Request) returns (GetProviderSchema.Response); } +message Config { + map credentials = 1; +} + +message HostCredential { + string token = 1; +} + message OpenSourceBundle { message Request { string local_path = 1; From ad8691745a0face23ce0040f09056d651766ba75 Mon Sep 17 00:00:00 2001 From: Jack Whitter-Jones <40804987+jwhitt3r@users.noreply.github.com> Date: Sat, 18 May 2024 11:00:09 +0100 Subject: [PATCH 093/161] Update architecture.md Updated a broken link due to spelling mistake --- docs/architecture.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture.md b/docs/architecture.md index 69f68231eb..80a0bbe06c 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -280,7 +280,7 @@ a plan operation would include the following high-level steps: this operation. Each execution step for a vertex is an implementation of -[`terraform.Execute`](https://pkg.go.dev/github.com/hashicorp/terraform/internal/erraform#Execute). +[`terraform.Execute`](https://pkg.go.dev/github.com/hashicorp/terraform/internal/terraform#Execute). As with graph transforms, the behavior of these implementations varies widely: whereas graph transforms can take any action against the graph, an `Execute` implementation can take any action against the `EvalContext`. From 9dd28fc2e5866e38983faed9d0a2c81210a8e940 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Fri, 17 May 2024 16:10:09 -0700 Subject: [PATCH 094/161] funcs: Don't panic if templatefile path is sensitive Previously we were partially propagating any marks from the path, but not going all the way so we still ran into trouble when trying to use the string containing the file contents. Now we'll have loadTmpl also return the marks it had to read through to actually parse the template, and then we'll use those (instead of the original path marks) to mark the result. In practice the pathMarks and the tmplMarks should always match today, but this is intentionally structured to make the data flow clearer -- the marks always travel along with whatever they related to -- so we're less likely to break this accidentally under future maintenence. --- internal/lang/funcs/filesystem.go | 15 ++++++++------- internal/lang/funcs/filesystem_test.go | 12 ++++++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/internal/lang/funcs/filesystem.go b/internal/lang/funcs/filesystem.go index 4092cd5046..2257d5d91c 100644 --- a/internal/lang/funcs/filesystem.go +++ b/internal/lang/funcs/filesystem.go @@ -72,20 +72,21 @@ func MakeFileFunc(baseDir string, encBase64 bool) function.Function { // the templatefile function, since that would risk the same file being // included into itself indefinitely. func MakeTemplateFileFunc(baseDir string, funcsCb func() (funcs map[string]function.Function, fsFuncs collections.Set[string], templateFuncs collections.Set[string])) function.Function { - loadTmpl := func(fn string, marks cty.ValueMarks) (hcl.Expression, error) { + loadTmpl := func(fn string, marks cty.ValueMarks) (hcl.Expression, cty.ValueMarks, error) { // We re-use File here to ensure the same filename interpretation // as it does, along with its other safety checks. tmplVal, err := File(baseDir, cty.StringVal(fn).WithMarks(marks)) if err != nil { - return nil, err + return nil, nil, err } + tmplVal, marks = tmplVal.Unmark() expr, diags := hclsyntax.ParseTemplate([]byte(tmplVal.AsString()), fn, hcl.Pos{Line: 1, Column: 1}) if diags.HasErrors() { - return nil, diags + return nil, nil, diags } - return expr, nil + return expr, marks, nil } renderTmpl := makeRenderTemplateFunc(funcsCb, true) @@ -112,7 +113,7 @@ func MakeTemplateFileFunc(baseDir string, funcsCb func() (funcs map[string]funct // return any type. pathArg, pathMarks := args[0].Unmark() - expr, err := loadTmpl(pathArg.AsString(), pathMarks) + expr, _, err := loadTmpl(pathArg.AsString(), pathMarks) if err != nil { return cty.DynamicPseudoType, err } @@ -124,12 +125,12 @@ func MakeTemplateFileFunc(baseDir string, funcsCb func() (funcs map[string]funct }, Impl: func(args []cty.Value, retType cty.Type) (cty.Value, error) { pathArg, pathMarks := args[0].Unmark() - expr, err := loadTmpl(pathArg.AsString(), pathMarks) + expr, tmplMarks, err := loadTmpl(pathArg.AsString(), pathMarks) if err != nil { return cty.DynamicVal, err } result, err := renderTmpl(expr, args[1]) - return result.WithMarks(pathMarks), err + return result.WithMarks(tmplMarks), err }, }) diff --git a/internal/lang/funcs/filesystem_test.go b/internal/lang/funcs/filesystem_test.go index cab8f27976..4b65560fa0 100644 --- a/internal/lang/funcs/filesystem_test.go +++ b/internal/lang/funcs/filesystem_test.go @@ -187,6 +187,18 @@ func TestTemplateFile(t *testing.T) { cty.True, // since this template contains only an interpolation, its true value shines through ``, }, + { + // If the template filename is sensitive then we also treat the + // rendered result as sensitive, because the rendered result + // is likely to imply which filename was used. + // (Sensitive filenames seem pretty unlikely, but if they do + // crop up then we should handle them consistently with our + // usual sensitivity rules.) + cty.StringVal("testdata/hello.txt").Mark(marks.Sensitive), + cty.EmptyObjectVal, + cty.StringVal("Hello World").Mark(marks.Sensitive), + ``, + }, } funcs := map[string]function.Function{ From 69991ff41feaa0db6711b20b6d2ec18b148c56aa Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Mon, 20 May 2024 08:35:53 -0700 Subject: [PATCH 095/161] Update CHANGELOG.md --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 090c760520..2923f932d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,9 +13,10 @@ ENHANCEMENTS: BUG FIXES: -* `remote-exec`: Each remote connection will now be closed immediately after use. ([#34137](https://github.com/hashicorp/terraform/issues/34137)) -* `backend/s3`: Fixed the digest value displayed for DynamoDB/S3 state checksum mismatches. ([#34387](https://github.com/hashicorp/terraform/issues/34387)) +* remote-exec: Each remote connection will now be closed immediately after use. ([#34137](https://github.com/hashicorp/terraform/issues/34137)) +* backend/s3: Fixed the digest value displayed for DynamoDB/S3 state checksum mismatches. ([#34387](https://github.com/hashicorp/terraform/issues/34387)) * `terraform test`: Fix bug in which non-Hashicorp providers required by testing modules and initialised within the test files were assigned incorrect registry addresses. ([#35161](https://github.com/hashicorp/terraform/issues/35161)) +* config: The `templatefile` function no longer returns a "panic" error if the template file path is marked as sensitive. Instead, the template rendering result is also marked as sensitive. ([#35180](https://github.com/hashicorp/terraform/issues/35180)) UPGRADE NOTES: From af4a734262b3fcc1a8139db2b43adc0486ee0281 Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Tue, 21 May 2024 16:28:19 +0200 Subject: [PATCH 096/161] import: only filter id attribute at root level when generating configuration (#35220) --- internal/configs/configschema/filter.go | 39 +++++---- .../terraform/context_plan_import_test.go | 85 ++++++++++++++++--- 2 files changed, 98 insertions(+), 26 deletions(-) diff --git a/internal/configs/configschema/filter.go b/internal/configs/configschema/filter.go index 35aeba714c..e8abd17c03 100644 --- a/internal/configs/configschema/filter.go +++ b/internal/configs/configschema/filter.go @@ -3,33 +3,35 @@ package configschema -type FilterT[T any] func(string, T) bool +import "github.com/zclconf/go-cty/cty" + +type FilterT[T any] func(cty.Path, T) bool var ( - FilterReadOnlyAttribute = func(name string, attribute *Attribute) bool { + FilterReadOnlyAttribute = func(path cty.Path, attribute *Attribute) bool { return attribute.Computed && !attribute.Optional } - FilterHelperSchemaIdAttribute = func(name string, attribute *Attribute) bool { - if name == "id" && attribute.Computed && attribute.Optional { + FilterHelperSchemaIdAttribute = func(path cty.Path, attribute *Attribute) bool { + if path.Equals(cty.GetAttrPath("id")) && attribute.Computed && attribute.Optional { return true } return false } - FilterDeprecatedAttribute = func(name string, attribute *Attribute) bool { + FilterDeprecatedAttribute = func(path cty.Path, attribute *Attribute) bool { return attribute.Deprecated } - FilterDeprecatedBlock = func(name string, block *NestedBlock) bool { + FilterDeprecatedBlock = func(path cty.Path, block *NestedBlock) bool { return block.Deprecated } ) func FilterOr[T any](filters ...FilterT[T]) FilterT[T] { - return func(name string, value T) bool { + return func(path cty.Path, value T) bool { for _, f := range filters { - if f(name, value) { + if f(path, value) { return true } } @@ -38,6 +40,10 @@ func FilterOr[T any](filters ...FilterT[T]) FilterT[T] { } func (b *Block) Filter(filterAttribute FilterT[*Attribute], filterBlock FilterT[*NestedBlock]) *Block { + return b.filter(nil, filterAttribute, filterBlock) +} + +func (b *Block) filter(path cty.Path, filterAttribute FilterT[*Attribute], filterBlock FilterT[*NestedBlock]) *Block { ret := &Block{ Description: b.Description, DescriptionKind: b.DescriptionKind, @@ -48,10 +54,11 @@ func (b *Block) Filter(filterAttribute FilterT[*Attribute], filterBlock FilterT[ ret.Attributes = make(map[string]*Attribute, len(b.Attributes)) } for name, attrS := range b.Attributes { - if filterAttribute == nil || !filterAttribute(name, attrS) { + path := path.GetAttr(name) + if filterAttribute == nil || !filterAttribute(path, attrS) { ret.Attributes[name] = attrS if attrS.NestedType != nil { - ret.Attributes[name].NestedType = filterNestedType(attrS.NestedType, filterAttribute) + ret.Attributes[name].NestedType = filterNestedType(attrS.NestedType, path, filterAttribute) } } } @@ -60,8 +67,9 @@ func (b *Block) Filter(filterAttribute FilterT[*Attribute], filterBlock FilterT[ ret.BlockTypes = make(map[string]*NestedBlock, len(b.BlockTypes)) } for name, blockS := range b.BlockTypes { - if filterBlock == nil || !filterBlock(name, blockS) { - block := blockS.Filter(filterAttribute, filterBlock) + path := path.GetAttr(name) + if filterBlock == nil || !filterBlock(path, blockS) { + block := blockS.filter(path, filterAttribute, filterBlock) ret.BlockTypes[name] = &NestedBlock{ Block: *block, Nesting: blockS.Nesting, @@ -74,7 +82,7 @@ func (b *Block) Filter(filterAttribute FilterT[*Attribute], filterBlock FilterT[ return ret } -func filterNestedType(obj *Object, filterAttribute FilterT[*Attribute]) *Object { +func filterNestedType(obj *Object, path cty.Path, filterAttribute FilterT[*Attribute]) *Object { if obj == nil { return nil } @@ -85,10 +93,11 @@ func filterNestedType(obj *Object, filterAttribute FilterT[*Attribute]) *Object } for name, attrS := range obj.Attributes { - if filterAttribute == nil || !filterAttribute(name, attrS) { + path := path.GetAttr(name) + if filterAttribute == nil || !filterAttribute(path, attrS) { ret.Attributes[name] = attrS if attrS.NestedType != nil { - ret.Attributes[name].NestedType = filterNestedType(attrS.NestedType, filterAttribute) + ret.Attributes[name].NestedType = filterNestedType(attrS.NestedType, path, filterAttribute) } } } diff --git a/internal/terraform/context_plan_import_test.go b/internal/terraform/context_plan_import_test.go index 91248baca4..611e4cf025 100644 --- a/internal/terraform/context_plan_import_test.go +++ b/internal/terraform/context_plan_import_test.go @@ -671,6 +671,80 @@ func TestContext2Plan_importIdInvalidUnknown(t *testing.T) { } } +func TestContext2Plan_generateConfigWithNestedId(t *testing.T) { + m := testModuleInline(t, map[string]string{ + "main.tf": ` +import { + to = test_object.a + id = "foo" +} +`, + }) + + p := simpleMockProvider() + + p.GetProviderSchemaResponse.ResourceTypes = map[string]providers.Schema{ + "test_object": { + Block: &configschema.Block{ + Attributes: map[string]*configschema.Attribute{ + "test_id": { + Type: cty.String, + Required: true, + }, + "list_val": { + Optional: true, + NestedType: &configschema.Object{ + Nesting: configschema.NestingList, + Attributes: map[string]*configschema.Attribute{ + "id": { + Type: cty.String, + Optional: true, + Computed: true, + }, + }, + }, + }, + }, + }, + }, + } + + ctx := testContext2(t, &ContextOpts{ + Providers: map[addrs.Provider]providers.Factory{ + addrs.NewDefaultProvider("test"): testProviderFuncFixed(p), + }, + }) + p.ReadResourceResponse = &providers.ReadResourceResponse{ + NewState: cty.ObjectVal(map[string]cty.Value{ + "test_id": cty.StringVal("foo"), + "list_val": cty.ListVal([]cty.Value{ + cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("list_id"), + }), + }), + }), + } + p.ImportResourceStateResponse = &providers.ImportResourceStateResponse{ + ImportedResources: []providers.ImportedResource{ + { + TypeName: "test_object", + State: cty.ObjectVal(map[string]cty.Value{ + "test_id": cty.StringVal("foo"), + }), + }, + }, + } + + // Actual plan doesn't matter, just want to make sure there are no errors. + _, diags := ctx.Plan(m, states.NewState(), &PlanOpts{ + Mode: plans.NormalMode, + GenerateConfigPath: "generated.tf", // Actual value here doesn't matter, as long as it is not empty. + }) + if diags.HasErrors() { + t.Fatalf("unexpected errors\n%s", diags.Err().Error()) + } +} + func TestContext2Plan_importIntoModuleWithGeneratedConfig(t *testing.T) { m := testModuleInline(t, map[string]string{ "main.tf": ` @@ -717,17 +791,6 @@ resource "test_object" "a" { }, } - p.ImportResourceStateResponse = &providers.ImportResourceStateResponse{ - ImportedResources: []providers.ImportedResource{ - { - TypeName: "test_object", - State: cty.ObjectVal(map[string]cty.Value{ - "test_string": cty.StringVal("foo"), - }), - }, - }, - } - plan, diags := ctx.Plan(m, states.NewState(), &PlanOpts{ Mode: plans.NormalMode, GenerateConfigPath: "generated.tf", // Actual value here doesn't matter, as long as it is not empty. From c61201dd10783be70480b7159faba1ba94051f36 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Tue, 21 May 2024 13:25:46 -0400 Subject: [PATCH 097/161] udpate CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2923f932d1..d06a5c7526 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ ENHANCEMENTS: * Performance improvement during graph building for configurations with an extremely large number of `resource` blocks. ([#35088](https://github.com/hashicorp/terraform/pull/35088)) * Reduced copying of state to improve performance with larges numbers of resources. [GH-35164] * `terraform_data`: Enabled `moved` configuration refactoring from the `hashicorp/null` provider `null_resource` managed resource ([#35163](https://github.com/hashicorp/terraform/pull/35163)) +* `terraform output` with `cloud` block: terraform no longer suggests that data loss could occur when outputs are not available [GH-35143] BUG FIXES: From 5e545ff427a31dfe5b60d91dab367c4a7e7e5a2b Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Thu, 29 Feb 2024 16:14:31 -0800 Subject: [PATCH 098/161] configs: Provisioners in "removed" blocks When the removed_provisioners experiment is active, removed blocks referring to managed resources are allowed to include "connection" and "provisioner" blocks, as long as all of the "provisioner" blocks specify when = destroy to indicate that they should execute as part of the resource's "destroy" action. This commit only deals with parsing the configuration. The logic to react to this during the apply phase will follow in later commits. --- internal/configs/removed.go | 81 +++++++++++- internal/configs/removed_test.go | 208 +++++++++++++++++++++++++++++++ 2 files changed, 286 insertions(+), 3 deletions(-) diff --git a/internal/configs/removed.go b/internal/configs/removed.go index 7ec39f0191..dadaee17ba 100644 --- a/internal/configs/removed.go +++ b/internal/configs/removed.go @@ -4,6 +4,8 @@ package configs import ( + "fmt" + "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/hcl/v2" @@ -19,6 +21,12 @@ type Removed struct { // from state. Defaults to true. Destroy bool + // Managed captures a number of metadata fields that are applicable only + // for managed resources, and not for other resource modes. + // + // "removed" blocks support only a subset of the fields in [ManagedResource]. + Managed *ManagedResource + DeclRange hcl.Range } @@ -31,6 +39,8 @@ func decodeRemovedBlock(block *hcl.Block) (*Removed, hcl.Diagnostics) { content, moreDiags := block.Body.Content(removedBlockSchema) diags = append(diags, moreDiags...) + var targetKind addrs.RemoveTargetKind + var resourceMode addrs.ResourceMode // only valid if targetKind is addrs.RemoveTargetResource if attr, exists := content.Attributes["from"]; exists { from, traversalDiags := hcl.AbsTraversalForExpr(attr.Expr) diags = append(diags, traversalDiags...) @@ -38,11 +48,21 @@ func decodeRemovedBlock(block *hcl.Block) (*Removed, hcl.Diagnostics) { from, fromDiags := addrs.ParseRemoveTarget(from) diags = append(diags, fromDiags.ToHCL()...) removed.From = from + if removed.From != nil { + targetKind = removed.From.ObjectKind() + if targetKind == addrs.RemoveTargetResource { + resourceMode = removed.From.RelSubject.(addrs.ConfigResource).Resource.Mode + } + } } } removed.Destroy = true + if resourceMode == addrs.ManagedResourceMode { + removed.Managed = &ManagedResource{} + } + var seenConnection *hcl.Block for _, block := range content.Blocks { switch block.Type { case "lifecycle": @@ -53,6 +73,61 @@ func decodeRemovedBlock(block *hcl.Block) (*Removed, hcl.Diagnostics) { valDiags := gohcl.DecodeExpression(attr.Expr, nil, &removed.Destroy) diags = append(diags, valDiags...) } + + case "connection": + if removed.Managed == nil { + // target is not a managed resource, then + diags = append(diags, &hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Invalid connection block", + Detail: "Provisioner connection configuration is valid only when a removed block targets a managed resource.", + Subject: &block.DefRange, + }) + continue + } + + if seenConnection != nil { + diags = append(diags, &hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Duplicate connection block", + Detail: fmt.Sprintf("This \"removed\" block already has a connection block at %s.", seenConnection.DefRange), + Subject: &block.DefRange, + }) + continue + } + seenConnection = block + + removed.Managed.Connection = &Connection{ + Config: block.Body, + DeclRange: block.DefRange, + } + + case "provisioner": + if removed.Managed == nil { + // target is not a managed resource, then + diags = append(diags, &hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Invalid provisioner block", + Detail: "Provisioners are valid only when a removed block targets a managed resource.", + Subject: &block.DefRange, + }) + continue + } + + pv, pvDiags := decodeProvisionerBlock(block) + diags = append(diags, pvDiags...) + if pv != nil { + removed.Managed.Provisioners = append(removed.Managed.Provisioners, pv) + + if pv.When != ProvisionerWhenDestroy { + diags = append(diags, &hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Invalid provisioner block", + Detail: "Only destroy-time provisioners are valid in \"removed\" blocks. To declare a destroy-time provisioner, use:\n when = destroy", + Subject: &block.DefRange, + }) + } + } } } @@ -67,9 +142,9 @@ var removedBlockSchema = &hcl.BodySchema{ }, }, Blocks: []hcl.BlockHeaderSchema{ - { - Type: "lifecycle", - }, + {Type: "lifecycle"}, + {Type: "connection"}, + {Type: "provisioner", LabelNames: []string{"type"}}, }, } diff --git a/internal/configs/removed_test.go b/internal/configs/removed_test.go index 5ac1480f05..dc43225b8f 100644 --- a/internal/configs/removed_test.go +++ b/internal/configs/removed_test.go @@ -60,6 +60,7 @@ func TestRemovedBlock_decode(t *testing.T) { &Removed{ From: mustRemoveEndpointFromExpr(foo_expr), Destroy: true, + Managed: &ManagedResource{}, DeclRange: blockRange, }, ``, @@ -93,10 +94,155 @@ func TestRemovedBlock_decode(t *testing.T) { &Removed{ From: mustRemoveEndpointFromExpr(foo_expr), Destroy: false, + Managed: &ManagedResource{}, DeclRange: blockRange, }, ``, }, + "provisioner when = destroy": { + &hcl.Block{ + Type: "removed", + Body: hcltest.MockBody(&hcl.BodyContent{ + Attributes: hcl.Attributes{ + "from": { + Name: "from", + Expr: foo_expr, + }, + }, + Blocks: hcl.Blocks{ + &hcl.Block{ + Type: "provisioner", + Labels: []string{"remote-exec"}, + LabelRanges: []hcl.Range{{}}, + Body: hcltest.MockBody(&hcl.BodyContent{ + Attributes: hcl.Attributes{ + "when": { + Name: "when", + Expr: hcltest.MockExprTraversalSrc("destroy"), + }, + }, + }), + }, + }, + }), + DefRange: blockRange, + }, + &Removed{ + From: mustRemoveEndpointFromExpr(foo_expr), + Destroy: true, + Managed: &ManagedResource{ + Provisioners: []*Provisioner{ + { + Type: "remote-exec", + Config: hcltest.MockBody(&hcl.BodyContent{ + Attributes: hcl.Attributes{}, + Blocks: hcl.Blocks{}, + }), + When: ProvisionerWhenDestroy, + OnFailure: ProvisionerOnFailureFail, + }, + }, + }, + DeclRange: blockRange, + }, + ``, + }, + "provisioner when = create": { + &hcl.Block{ + Type: "removed", + Body: hcltest.MockBody(&hcl.BodyContent{ + Attributes: hcl.Attributes{ + "from": { + Name: "from", + Expr: foo_expr, + }, + }, + Blocks: hcl.Blocks{ + &hcl.Block{ + Type: "provisioner", + Labels: []string{"local-exec"}, + LabelRanges: []hcl.Range{{}}, + Body: hcltest.MockBody(&hcl.BodyContent{ + Attributes: hcl.Attributes{ + "when": { + Name: "when", + Expr: hcltest.MockExprTraversalSrc("create"), + }, + }, + }), + }, + }, + }), + DefRange: blockRange, + }, + &Removed{ + From: mustRemoveEndpointFromExpr(foo_expr), + Destroy: true, + Managed: &ManagedResource{ + Provisioners: []*Provisioner{ + { + Type: "local-exec", + Config: hcltest.MockBody(&hcl.BodyContent{ + Attributes: hcl.Attributes{}, + Blocks: hcl.Blocks{}, + }), + When: ProvisionerWhenCreate, + OnFailure: ProvisionerOnFailureFail, + }, + }, + }, + DeclRange: blockRange, + }, + `Invalid provisioner block`, + }, + "provisioner no when": { + &hcl.Block{ + Type: "removed", + Body: hcltest.MockBody(&hcl.BodyContent{ + Attributes: hcl.Attributes{ + "from": { + Name: "from", + Expr: foo_expr, + }, + }, + Blocks: hcl.Blocks{ + &hcl.Block{ + Type: "connection", + Body: hcltest.MockBody(&hcl.BodyContent{}), + }, + &hcl.Block{ + Type: "provisioner", + Labels: []string{"local-exec"}, + LabelRanges: []hcl.Range{{}}, + Body: hcltest.MockBody(&hcl.BodyContent{}), + }, + }, + }), + DefRange: blockRange, + }, + &Removed{ + From: mustRemoveEndpointFromExpr(foo_expr), + Destroy: true, + Managed: &ManagedResource{ + Connection: &Connection{ + Config: hcltest.MockBody(&hcl.BodyContent{}), + }, + Provisioners: []*Provisioner{ + { + Type: "local-exec", + Config: hcltest.MockBody(&hcl.BodyContent{ + Attributes: hcl.Attributes{}, + Blocks: hcl.Blocks{}, + }), + When: ProvisionerWhenCreate, + OnFailure: ProvisionerOnFailureFail, + }, + }, + }, + DeclRange: blockRange, + }, + `Invalid provisioner block`, + }, "modules": { &hcl.Block{ Type: "removed", @@ -130,6 +276,67 @@ func TestRemovedBlock_decode(t *testing.T) { }, ``, }, + "provisioner for module": { + &hcl.Block{ + Type: "removed", + Body: hcltest.MockBody(&hcl.BodyContent{ + Attributes: hcl.Attributes{ + "from": { + Name: "from", + Expr: mod_foo_expr, + }, + }, + Blocks: hcl.Blocks{ + &hcl.Block{ + Type: "provisioner", + Labels: []string{"local-exec"}, + LabelRanges: []hcl.Range{{}}, + Body: hcltest.MockBody(&hcl.BodyContent{ + Attributes: hcl.Attributes{ + "when": { + Name: "when", + Expr: hcltest.MockExprTraversalSrc("destroy"), + }, + }, + }), + }, + }, + }), + DefRange: blockRange, + }, + &Removed{ + From: mustRemoveEndpointFromExpr(mod_foo_expr), + Destroy: true, + DeclRange: blockRange, + }, + `Invalid provisioner block`, + }, + "connection for module": { + &hcl.Block{ + Type: "removed", + Body: hcltest.MockBody(&hcl.BodyContent{ + Attributes: hcl.Attributes{ + "from": { + Name: "from", + Expr: mod_foo_expr, + }, + }, + Blocks: hcl.Blocks{ + &hcl.Block{ + Type: "connection", + Body: hcltest.MockBody(&hcl.BodyContent{}), + }, + }, + }), + DefRange: blockRange, + }, + &Removed{ + From: mustRemoveEndpointFromExpr(mod_foo_expr), + Destroy: true, + DeclRange: blockRange, + }, + `Invalid connection block`, + }, // KEM Unspecified behaviour "no lifecycle block": { &hcl.Block{ @@ -147,6 +354,7 @@ func TestRemovedBlock_decode(t *testing.T) { &Removed{ From: mustRemoveEndpointFromExpr(foo_expr), Destroy: true, + Managed: &ManagedResource{}, DeclRange: blockRange, }, ``, From 1b9c0cbe5d9cd03074b86f00a0026f341e571f77 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Thu, 29 Feb 2024 17:46:23 -0800 Subject: [PATCH 099/161] terraform: Basic support for provisioners in "removed" blocks During the apply phase, we'll check if there are provisioners either in the matching "resource" block or the matching "removed" block -- whichever of the two is present -- and execute the destroy-time subset of them either way. This also establishes a standard way to attach a "removed" block to a NodeResourceAbstract when one is defined, which is likely to be useful for supporting other resource-related meta arguments in "removed" blocks in future. One known limitation and design question from this initial implementation is: how should each.key, each.value, and count.index behave when used as part of a provisioner configuration in a "removed" block? This is a tricky question because whereas a "resource" block allows us to determine from the configuration whether we're using count, for_each, or neither, removed blocks must accept whatever happens to be in the state and so in unusual cases there might even be a mixture of numeric instance keys and string instance keys for the same resource, making it impossible to write a provisioner configuration that would work with both. --- internal/terraform/context_apply_test.go | 51 +++++++++++++++++++ internal/terraform/node_resource_abstract.go | 9 +++- .../node_resource_abstract_instance.go | 28 ++++++---- .../apply-provisioner-destroy-removed/main.tf | 8 +++ .../transform_attach_config_resource.go | 31 +++++++++-- 5 files changed, 111 insertions(+), 16 deletions(-) create mode 100644 internal/terraform/testdata/apply-provisioner-destroy-removed/main.tf diff --git a/internal/terraform/context_apply_test.go b/internal/terraform/context_apply_test.go index f9a753a486..a8b2cc15e3 100644 --- a/internal/terraform/context_apply_test.go +++ b/internal/terraform/context_apply_test.go @@ -4908,6 +4908,57 @@ func TestContext2Apply_provisionerDestroy(t *testing.T) { } } +func TestContext2Apply_provisionerDestroyRemoved(t *testing.T) { + m := testModule(t, "apply-provisioner-destroy-removed") + p := testProvider("aws") + pr := testProvisioner() + p.PlanResourceChangeFn = testDiffFn + pr.ProvisionResourceFn = func(req provisioners.ProvisionResourceRequest) (resp provisioners.ProvisionResourceResponse) { + val := req.Config.GetAttr("command").AsString() + // The following is "destroy ${each.key} ${self.foo}" + if val != "destroy a bar" { + t.Fatalf("wrong value for command: %q", val) + } + + return + } + + state := states.NewState() + root := state.RootModule() + root.SetResourceInstanceCurrent( + mustResourceInstanceAddr(`aws_instance.foo["a"]`).Resource, + &states.ResourceInstanceObjectSrc{ + Status: states.ObjectReady, + AttrsJSON: []byte(`{"id":"bar","foo":"bar"}`), + }, + mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`), + ) + + ctx := testContext2(t, &ContextOpts{ + Providers: map[addrs.Provider]providers.Factory{ + addrs.NewDefaultProvider("aws"): testProviderFuncFixed(p), + }, + Provisioners: map[string]provisioners.Factory{ + "shell": testProvisionerFuncFixed(pr), + }, + }) + + plan, diags := ctx.Plan(m, state, SimplePlanOpts(plans.NormalMode, testInputValuesUnset(m.Module.Variables))) + assertNoErrors(t, diags) + + state, diags = ctx.Apply(plan, m, nil) + if diags.HasErrors() { + t.Fatalf("diags: %s", diags.Err()) + } + + checkStateString(t, state, ``) + + // Verify apply was invoked + if !pr.ProvisionResourceCalled { + t.Fatalf("provisioner not invoked") + } +} + // Verify that on destroy provisioner failure, nothing happens to the instance func TestContext2Apply_provisionerDestroyFail(t *testing.T) { m := testModule(t, "apply-provisioner-destroy") diff --git a/internal/terraform/node_resource_abstract.go b/internal/terraform/node_resource_abstract.go index c29e74c2aa..b5f940d877 100644 --- a/internal/terraform/node_resource_abstract.go +++ b/internal/terraform/node_resource_abstract.go @@ -55,7 +55,11 @@ type NodeAbstractResource struct { Schema *configschema.Block // Schema for processing the configuration body SchemaVersion uint64 // Schema version of "Schema", as decided by the provider - Config *configs.Resource // Config is the resource in the config + + // Config and RemovedConfig are mutally-exclusive, because a + // resource can't be both declared and removed at the same time. + Config *configs.Resource // Config is the resource in the config, if any + RemovedConfig *configs.Removed // RemovedConfig is the "removed" block for this resource, if any // ProviderMetas is the provider_meta configs for the module this resource belongs to ProviderMetas map[addrs.Provider]*configs.ProviderMeta @@ -359,8 +363,9 @@ func (n *NodeAbstractResource) AttachDataResourceDependsOn(deps []addrs.ConfigRe } // GraphNodeAttachResourceConfig -func (n *NodeAbstractResource) AttachResourceConfig(c *configs.Resource) { +func (n *NodeAbstractResource) AttachResourceConfig(c *configs.Resource, rc *configs.Removed) { n.Config = c + n.RemovedConfig = rc } // GraphNodeAttachResourceSchema impl diff --git a/internal/terraform/node_resource_abstract_instance.go b/internal/terraform/node_resource_abstract_instance.go index 7b442a714d..d298961ff5 100644 --- a/internal/terraform/node_resource_abstract_instance.go +++ b/internal/terraform/node_resource_abstract_instance.go @@ -2091,7 +2091,15 @@ func (n *NodeAbstractResourceInstance) evalApplyProvisioners(ctx EvalContext, st return nil } - provs := filterProvisioners(n.Config, when) + var allProvs []*configs.Provisioner + switch { + case n.Config != nil && n.Config.Managed != nil: + allProvs = n.Config.Managed.Provisioners + case n.RemovedConfig != nil && n.RemovedConfig.Managed != nil: + allProvs = n.RemovedConfig.Managed.Provisioners + } + + provs := filterProvisioners(allProvs, when) if len(provs) == 0 { // We have no provisioners, so don't do anything return nil @@ -2121,18 +2129,13 @@ func (n *NodeAbstractResourceInstance) evalApplyProvisioners(ctx EvalContext, st // filterProvisioners filters the provisioners on the resource to only // the provisioners specified by the "when" option. -func filterProvisioners(config *configs.Resource, when configs.ProvisionerWhen) []*configs.Provisioner { - // Fast path the zero case - if config == nil || config.Managed == nil { +func filterProvisioners(configured []*configs.Provisioner, when configs.ProvisionerWhen) []*configs.Provisioner { + if len(configured) == 0 { return nil } - if len(config.Managed.Provisioners) == 0 { - return nil - } - - result := make([]*configs.Provisioner, 0, len(config.Managed.Provisioners)) - for _, p := range config.Managed.Provisioners { + result := make([]*configs.Provisioner, 0, len(configured)) + for _, p := range configured { if p.When == when { result = append(result, p) } @@ -2161,8 +2164,11 @@ func (n *NodeAbstractResourceInstance) applyProvisioners(ctx EvalContext, state // then it'll serve as a base connection configuration for all of the // provisioners. var baseConn hcl.Body - if n.Config.Managed != nil && n.Config.Managed.Connection != nil { + switch { + case n.Config != nil && n.Config.Managed != nil && n.Config.Managed.Connection != nil: baseConn = n.Config.Managed.Connection.Config + case n.RemovedConfig != nil && n.RemovedConfig.Managed != nil && n.RemovedConfig.Managed.Connection != nil: + baseConn = n.RemovedConfig.Managed.Connection.Config } for _, prov := range provs { diff --git a/internal/terraform/testdata/apply-provisioner-destroy-removed/main.tf b/internal/terraform/testdata/apply-provisioner-destroy-removed/main.tf new file mode 100644 index 0000000000..a050d3ce63 --- /dev/null +++ b/internal/terraform/testdata/apply-provisioner-destroy-removed/main.tf @@ -0,0 +1,8 @@ +removed { + from = aws_instance.foo + + provisioner "shell" { + when = "destroy" + command = "destroy ${each.key} ${self.foo}" + } +} diff --git a/internal/terraform/transform_attach_config_resource.go b/internal/terraform/transform_attach_config_resource.go index c582ad9fd0..cbd8d57f2e 100644 --- a/internal/terraform/transform_attach_config_resource.go +++ b/internal/terraform/transform_attach_config_resource.go @@ -6,6 +6,7 @@ package terraform import ( "log" + "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/configs" "github.com/hashicorp/terraform/internal/dag" ) @@ -15,8 +16,11 @@ import ( type GraphNodeAttachResourceConfig interface { GraphNodeConfigResource - // Sets the configuration - AttachResourceConfig(*configs.Resource) + // Sets the configuration, either to a present resource block or to + // a "removed" block commemorating a resource that has since been + // removed. Callers should always leave at least one of these + // arguments set to nil. + AttachResourceConfig(*configs.Resource, *configs.Removed) } // AttachResourceConfigTransformer goes through the graph and attaches @@ -51,7 +55,7 @@ func (t *AttachResourceConfigTransformer) Transform(g *Graph) error { if r := config.Module.ResourceByAddr(addr.Resource); r != nil { log.Printf("[TRACE] AttachResourceConfigTransformer: attaching to %q (%T) config from %#v", dag.VertexName(v), v, r.DeclRange) - arn.AttachResourceConfig(r) + arn.AttachResourceConfig(r, nil) if gnapmc, ok := v.(GraphNodeAttachProviderMetaConfigs); ok { log.Printf("[TRACE] AttachResourceConfigTransformer: attaching provider meta configs to %s", dag.VertexName(v)) if config.Module.ProviderMetas != nil { @@ -61,6 +65,27 @@ func (t *AttachResourceConfigTransformer) Transform(g *Graph) error { } } } + + for _, r := range config.Module.Removed { + crAddr, ok := r.From.RelSubject.(addrs.ConfigResource) + if !ok { + // Not for a resource at all, so can't possibly match + continue + } + rAddr := crAddr.Resource + if rAddr != addr.Resource { + // Not the same resource + continue + } + + log.Printf("[TRACE] AttachResourceConfigTransformer: attaching to %q (%T) removed block from %#v", dag.VertexName(v), v, r.DeclRange) + + // Validation ensures that there can't be both a resource/data block + // and a removed block referring to the same configuration, so + // we can assume that this isn't clobbering a non-removed resource + // configuration we already attached above. + arn.AttachResourceConfig(nil, r) + } } return nil From ef355930f2de9f862728fa34b88fab268dde267b Mon Sep 17 00:00:00 2001 From: Jamie White Date: Wed, 22 May 2024 15:51:07 +0200 Subject: [PATCH 100/161] Fix inconsistent `moved` snippets in docs --- website/docs/language/moved.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/language/moved.mdx b/website/docs/language/moved.mdx index 57989c9de4..0f61090217 100644 --- a/website/docs/language/moved.mdx +++ b/website/docs/language/moved.mdx @@ -24,7 +24,7 @@ The following list outlines field hierarchy, language-specific data types, and r When every field is defined, a `moved` block has the following form: ```hcl -moved = { +moved { from = to = } From 78623e88f437b0203c02413059b88f8bc753a09f Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Fri, 5 Apr 2024 15:42:01 -0700 Subject: [PATCH 101/161] terraform: lang.Data fake for use in unit tests Our real implementation of the lang.Data interface depends on just about everything else in the modules runtime to implement its behavior, and so it's not really appropriate to use in unit tests. This new implementation is considerably simpler, just returning values predefined in a set of fixed tables. This is appropriate for unit tests of features that perform expression evaluation as a side-effect of their work but that don't contribute their own values to the real evaluation data implementation. --- internal/terraform/evaluate_test.go | 100 ++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/internal/terraform/evaluate_test.go b/internal/terraform/evaluate_test.go index 7dbabb4672..1a497db007 100644 --- a/internal/terraform/evaluate_test.go +++ b/internal/terraform/evaluate_test.go @@ -4,6 +4,7 @@ package terraform import ( + "fmt" "testing" "github.com/davecgh/go-spew/spew" @@ -617,3 +618,102 @@ func evaluatorForModule(stateSync *states.SyncState, changesSync *plans.ChangesS NamedValues: namedvals.NewState(), } } + +// fakeEvaluationData is an implementation of [lang.Data] that answers most +// questions just by returning data directly from the maps stored inside it. +type fakeEvaluationData struct { + checkBlocks map[addrs.Check]cty.Value + countAttrs map[addrs.CountAttr]cty.Value + forEachAttrs map[addrs.ForEachAttr]cty.Value + inputVariables map[addrs.InputVariable]cty.Value + localValues map[addrs.LocalValue]cty.Value + modules map[addrs.ModuleCall]cty.Value + outputValues map[addrs.OutputValue]cty.Value + pathAttrs map[addrs.PathAttr]cty.Value + resources map[addrs.Resource]cty.Value + runBlocks map[addrs.Run]cty.Value + terraformAttrs map[addrs.TerraformAttr]cty.Value + + // staticValidateRefs optionally implements [lang.Data.StaticValidateReferences], + // but can be left as nil to just skip static validation altogether. + staticValidateRefs func(refs []*addrs.Reference, self addrs.Referenceable, source addrs.Referenceable) tfdiags.Diagnostics +} + +var _ lang.Data = (*fakeEvaluationData)(nil) + +func fakeEvaluationDataLookup[Addr interface { + comparable + addrs.Referenceable +}](addr Addr, _ tfdiags.SourceRange, table map[Addr]cty.Value) (cty.Value, tfdiags.Diagnostics) { + ret, ok := table[addr] + if !ok { + var diags tfdiags.Diagnostics + diags = diags.Append(fmt.Errorf("fakeEvaluationData does not know about %s", addr)) + return cty.DynamicVal, diags + } + return ret, nil +} + +// GetCheckBlock implements lang.Data. +func (d *fakeEvaluationData) GetCheckBlock(addr addrs.Check, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { + return fakeEvaluationDataLookup(addr, rng, d.checkBlocks) +} + +// GetCountAttr implements lang.Data. +func (d *fakeEvaluationData) GetCountAttr(addr addrs.CountAttr, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { + return fakeEvaluationDataLookup(addr, rng, d.countAttrs) +} + +// GetForEachAttr implements lang.Data. +func (d *fakeEvaluationData) GetForEachAttr(addr addrs.ForEachAttr, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { + return fakeEvaluationDataLookup(addr, rng, d.forEachAttrs) +} + +// GetInputVariable implements lang.Data. +func (d *fakeEvaluationData) GetInputVariable(addr addrs.InputVariable, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { + return fakeEvaluationDataLookup(addr, rng, d.inputVariables) +} + +// GetLocalValue implements lang.Data. +func (d *fakeEvaluationData) GetLocalValue(addr addrs.LocalValue, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { + return fakeEvaluationDataLookup(addr, rng, d.localValues) +} + +// GetModule implements lang.Data. +func (d *fakeEvaluationData) GetModule(addr addrs.ModuleCall, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { + return fakeEvaluationDataLookup(addr, rng, d.modules) +} + +// GetOutput implements lang.Data. +func (d *fakeEvaluationData) GetOutput(addr addrs.OutputValue, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { + return fakeEvaluationDataLookup(addr, rng, d.outputValues) +} + +// GetPathAttr implements lang.Data. +func (d *fakeEvaluationData) GetPathAttr(addr addrs.PathAttr, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { + return fakeEvaluationDataLookup(addr, rng, d.pathAttrs) +} + +// GetResource implements lang.Data. +func (d *fakeEvaluationData) GetResource(addr addrs.Resource, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { + return fakeEvaluationDataLookup(addr, rng, d.resources) +} + +// GetRunBlock implements lang.Data. +func (d *fakeEvaluationData) GetRunBlock(addr addrs.Run, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { + return fakeEvaluationDataLookup(addr, rng, d.runBlocks) +} + +// GetTerraformAttr implements lang.Data. +func (d *fakeEvaluationData) GetTerraformAttr(addr addrs.TerraformAttr, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { + return fakeEvaluationDataLookup(addr, rng, d.terraformAttrs) +} + +// StaticValidateReferences implements lang.Data. +func (d *fakeEvaluationData) StaticValidateReferences(refs []*addrs.Reference, self addrs.Referenceable, source addrs.Referenceable) tfdiags.Diagnostics { + if d.staticValidateRefs == nil { + // By default we just skip static validation + return nil + } + return d.staticValidateRefs(refs, self, source) +} From 3b620bfe69a8ea67a02b38ce39440ffe60acc565 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Fri, 5 Apr 2024 15:48:29 -0700 Subject: [PATCH 102/161] terraform: Stabilize the variable_validation_crossref experiment Previously we introduced a language experiment that would permit variable validation rules to refer to other objects declared in the same module as the variable. Now that experiment is concluded and its behavior is available for all modules. This final version deviates slightly from the experiment: we learned from the experimental implementation that we accidentally made the "validate" command able to validate constant-valued input variables in child modules despite the usual rule that input variables are unknown during validation, because the previous compromise bypassed the main expression evaluator and built its own evaluation context directly. Even though that behavior was not intended, it's a useful behavior that is protected by our compatibility promises and so this commit includes a slightly hacky emulation of that behavior, in eval_variable.go, that fetches the variable value in the same way the old implementation would have and then modifies the hcl evaluation context to include that value, while preserving anything else that our standard evaluation context builder put in there. That narrowly preserves the old behavior for expressions that compare the variable value directly to a constant, while treating all other references (which were previously totally invalid) in the standard way. This quirk was already covered by the existing test TestContext2Validate_variableCustomValidationsFail, which fails if the special workaround is removed. --- internal/configs/experiments.go | 14 -- internal/configs/named_values.go | 73 +--------- ...variable-validation-condition-crossref.tf} | 4 +- internal/experiments/experiment.go | 2 +- internal/terraform/context_plan_test.go | 7 - internal/terraform/eval_variable.go | 101 ++++++-------- internal/terraform/eval_variable_test.go | 24 +++- internal/terraform/graph_builder_apply.go | 4 +- internal/terraform/graph_builder_eval.go | 4 +- internal/terraform/graph_builder_plan.go | 4 +- internal/terraform/node_root_variable_test.go | 126 +++++++++++++----- .../terraform/node_variable_validation.go | 32 +---- .../transform_variable_validation.go | 16 +-- .../expressions/custom-conditions.mdx | 4 +- 14 files changed, 168 insertions(+), 247 deletions(-) rename internal/configs/testdata/{invalid-modules/variable-validation-condition-badref/variable-validation-condition-badref.tf => valid-files/variable-validation-condition-crossref.tf} (53%) diff --git a/internal/configs/experiments.go b/internal/configs/experiments.go index 8f0433a083..163e75e6d1 100644 --- a/internal/configs/experiments.go +++ b/internal/configs/experiments.go @@ -208,19 +208,5 @@ func checkModuleExperiments(m *Module) hcl.Diagnostics { } */ - if !m.ActiveExperiments.Has(experiments.VariableValidationCrossRef) { - // Without this experiment, validation rules are subject to the old - // rule that they can only refer to the variable whose value they - // are checking. This experiment removes that constraint, and makes - // the modules runtime responsible for validating and evaluating - // the conditions and error messages, just as we'd do for any other - // dynamic expression. - for varName, vc := range m.Variables { - for _, vv := range vc.Validations { - diags = append(diags, checkVariableValidationBlock(varName, vv)...) - } - } - } - return diags } diff --git a/internal/configs/named_values.go b/internal/configs/named_values.go index 2c733d9593..286c507a11 100644 --- a/internal/configs/named_values.go +++ b/internal/configs/named_values.go @@ -178,7 +178,7 @@ func decodeVariableBlock(block *hcl.Block, override bool) (*Variable, hcl.Diagno switch block.Type { case "validation": - vv, moreDiags := decodeVariableValidationBlock(block, override) + vv, moreDiags := decodeCheckRuleBlock(block, override) diags = append(diags, moreDiags...) v.Validations = append(v.Validations, vv) @@ -324,77 +324,6 @@ func (m VariableParsingMode) Parse(name, value string) (cty.Value, hcl.Diagnosti } } -// decodeVariableValidationBlock is a wrapper around decodeCheckRuleBlock -// that imposes the additional rule that the condition expression can refer -// only to an input variable of the given name. -func decodeVariableValidationBlock(block *hcl.Block, override bool) (*CheckRule, hcl.Diagnostics) { - return decodeCheckRuleBlock(block, override) -} - -func checkVariableValidationBlock(varName string, vv *CheckRule) hcl.Diagnostics { - var diags hcl.Diagnostics - - if vv.Condition != nil { - // The validation condition can only refer to the variable itself, - // to ensure that the variable declaration can't create additional - // edges in the dependency graph. - goodRefs := 0 - for _, traversal := range vv.Condition.Variables() { - ref, moreDiags := addrs.ParseRef(traversal) - if !moreDiags.HasErrors() { - if addr, ok := ref.Subject.(addrs.InputVariable); ok { - if addr.Name == varName { - goodRefs++ - continue // Reference is valid - } - } - } - // If we fall out here then the reference is invalid. - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: "Invalid reference in variable validation", - Detail: fmt.Sprintf("The condition for variable %q can only refer to the variable itself, using var.%s.", varName, varName), - Subject: traversal.SourceRange().Ptr(), - }) - } - if goodRefs < 1 { - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: "Invalid variable validation condition", - Detail: fmt.Sprintf("The condition for variable %q must refer to var.%s in order to test incoming values.", varName, varName), - Subject: vv.Condition.Range().Ptr(), - }) - } - } - - if vv.ErrorMessage != nil { - // The same applies to the validation error message, except that - // references are not required. A string literal is a valid error - // message. - goodRefs := 0 - for _, traversal := range vv.ErrorMessage.Variables() { - ref, moreDiags := addrs.ParseRef(traversal) - if !moreDiags.HasErrors() { - if addr, ok := ref.Subject.(addrs.InputVariable); ok { - if addr.Name == varName { - goodRefs++ - continue // Reference is valid - } - } - } - // If we fall out here then the reference is invalid. - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: "Invalid reference in variable validation", - Detail: fmt.Sprintf("The error message for variable %q can only refer to the variable itself, using var.%s.", varName, varName), - Subject: traversal.SourceRange().Ptr(), - }) - } - } - - return diags -} - // Output represents an "output" block in a module or file. type Output struct { Name string diff --git a/internal/configs/testdata/invalid-modules/variable-validation-condition-badref/variable-validation-condition-badref.tf b/internal/configs/testdata/valid-files/variable-validation-condition-crossref.tf similarity index 53% rename from internal/configs/testdata/invalid-modules/variable-validation-condition-badref/variable-validation-condition-badref.tf rename to internal/configs/testdata/valid-files/variable-validation-condition-crossref.tf index 9b9e935767..adfdd7c31e 100644 --- a/internal/configs/testdata/invalid-modules/variable-validation-condition-badref/variable-validation-condition-badref.tf +++ b/internal/configs/testdata/valid-files/variable-validation-condition-crossref.tf @@ -5,7 +5,7 @@ locals { variable "validation" { validation { - condition = local.foo == var.validation # ERROR: Invalid reference in variable validation + condition = local.foo == var.validation error_message = "Must be five." } } @@ -13,6 +13,6 @@ variable "validation" { variable "validation_error_expression" { validation { condition = var.validation_error_expression != 1 - error_message = "Cannot equal ${local.foo}." # ERROR: Invalid reference in variable validation + error_message = "Cannot equal ${local.foo}." } } diff --git a/internal/experiments/experiment.go b/internal/experiments/experiment.go index 7fa4b902f0..8a7b770962 100644 --- a/internal/experiments/experiment.go +++ b/internal/experiments/experiment.go @@ -31,7 +31,7 @@ func init() { // a current or a concluded experiment. registerConcludedExperiment(UnknownInstances, "Unknown instances are being rolled into a larger feature for deferring unready resources and modules.") registerConcludedExperiment(VariableValidation, "Custom variable validation can now be used by default, without enabling an experiment.") - registerCurrentExperiment(VariableValidationCrossRef) + registerConcludedExperiment(VariableValidationCrossRef, "Input variable validation rules may now refer to other objects in the same module without enabling any experiment.") registerConcludedExperiment(SuppressProviderSensitiveAttrs, "Provider-defined sensitive attributes are now redacted by default, without enabling an experiment.") registerCurrentExperiment(TemplateStringFunc) registerConcludedExperiment(ConfigDrivenMove, "Declarations of moved resource instances using \"moved\" blocks can now be used by default, without enabling an experiment.") diff --git a/internal/terraform/context_plan_test.go b/internal/terraform/context_plan_test.go index 8c4ff65099..d0b8220d0c 100644 --- a/internal/terraform/context_plan_test.go +++ b/internal/terraform/context_plan_test.go @@ -6921,8 +6921,6 @@ resource "test_resource" "foo" { } func TestContext2Plan_variableCustomValidationsSimple(t *testing.T) { - // This test is dealing with validation rules that refer to other objects - // in the same module. m := testModuleInline(t, map[string]string{ "main.tf": ` variable "a" { @@ -6978,11 +6976,6 @@ func TestContext2Plan_variableCustomValidationsCrossRef(t *testing.T) { // in the same module. m := testModuleInline(t, map[string]string{ "main.tf": ` - # Validation cross-references are currently experimental - terraform { - experiments = [variable_validation_crossref] - } - variable "a" { type = string } diff --git a/internal/terraform/eval_variable.go b/internal/terraform/eval_variable.go index 8c65256aca..fc34598a92 100644 --- a/internal/terraform/eval_variable.go +++ b/internal/terraform/eval_variable.go @@ -215,67 +215,6 @@ func evalVariableValidations(addr addrs.AbsInputVariableInstance, ctx EvalContex return diags } - // Validation expressions are statically validated (during configuration - // loading) to refer only to the variable being validated, so we can - // bypass our usual evaluation machinery here and just produce a minimal - // evaluation context containing just the required value. - val := ctx.NamedValues().GetInputVariableValue(addr) - if val == cty.NilVal { - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: "No final value for variable", - Detail: fmt.Sprintf("Terraform doesn't have a final value for %s during validation. This is a bug in Terraform; please report it!", addr), - }) - return diags - } - hclCtx := &hcl.EvalContext{ - Variables: map[string]cty.Value{ - "var": cty.ObjectVal(map[string]cty.Value{ - addr.Variable.Name: val, - }), - }, - Functions: ctx.EvaluationScope(nil, nil, EvalDataForNoInstanceKey).Functions(), - } - - for ix, validation := range rules { - result, ruleDiags := evalVariableValidation(validation, hclCtx, valueRng, addr, ix) - diags = diags.Append(ruleDiags) - - log.Printf("[TRACE] evalVariableValidations: %s status is now %s", addr, result.Status) - if result.Status == checks.StatusFail { - checkState.ReportCheckFailure(addr, addrs.InputValidation, ix, result.FailureMessage) - } else { - checkState.ReportCheckResult(addr, addrs.InputValidation, ix, result.Status) - } - } - - return diags -} - -// evalVariableValidationsCrossRef is an experimental variant of -// [evalVariableValidations] that allows arbitrary references to any object -// declared in the same module as the variable. -// -// If the experiment is successful, this function should replace -// [evalVariableValidations], but it's currently written separately to minimize -// the risk of the experiment impacting non-opted modules. -func evalVariableValidationsCrossRef(addr addrs.AbsInputVariableInstance, ctx EvalContext, rules []*configs.CheckRule, valueRng hcl.Range) (diags tfdiags.Diagnostics) { - if len(rules) == 0 { - log.Printf("[TRACE] evalVariableValidations: no validation rules declared for %s, so skipping", addr) - return nil - } - log.Printf("[TRACE] evalVariableValidations: validating %s", addr) - - checkState := ctx.Checks() - if !checkState.ConfigHasChecks(addr.ConfigCheckable()) { - // We have nothing to do if this object doesn't have any checks, - // but the "rules" slice should agree that we don't. - if ct := len(rules); ct != 0 { - panic(fmt.Sprintf("check state says that %s should have no rules, but it has %d", addr, ct)) - } - return diags - } - // We'll build just one evaluation context covering the data needed by // all of the rules together, since that'll minimize lock contention // on the state, plan, etc. @@ -300,6 +239,46 @@ func evalVariableValidationsCrossRef(addr addrs.AbsInputVariableInstance, ctx Ev return diags } + // HACK: Historically we manually built a very constrained hcl.EvalContext + // here, which only included the value of the one specific input variable + // we're validating, since we didn't yet support referring to anything + // else. That accidentally bypassed our rule that input variables are + // always unknown during the validate walk, and thus accidentally created + // a useful behavior of actually checking constant-only values against + // their validation rules just during "terraform validate", rather than + // having to run "terraform plan". + // + // Although that behavior was accidental, it makes simple validation rules + // more useful and is protected by compatibility promises, and so we'll + // fake it here by overwriting the unknown value that scope.EvalContext + // will have inserted with a possibly-more-known value using the same + // strategy our special code used to use. + ourVal := ctx.NamedValues().GetInputVariableValue(addr) + if ourVal != cty.NilVal { + // (it would be weird for ourVal to be nil here, but we'll tolerate it + // because it was scope.EvalContext's responsibility to check for the + // absent final value, and even if it didn't we'll just get an + // evaluation error when evaluating the expressions below anyway.) + + // Our goal here is to make sure that a reference to the variable + // we're checking will evaluate to ourVal, regardless of what else + // scope.EvalContext might have put in the variables table. + if hclCtx.Variables == nil { + hclCtx.Variables = make(map[string]cty.Value) + } + if varsVal, ok := hclCtx.Variables["var"]; ok { + // Unfortunately we need to unpack and repack the object here, + // because cty values are immutable. + attrs := varsVal.AsValueMap() + attrs[addr.Variable.Name] = ourVal + hclCtx.Variables["var"] = cty.ObjectVal(attrs) + } else { + hclCtx.Variables["var"] = cty.ObjectVal(map[string]cty.Value{ + addr.Variable.Name: ourVal, + }) + } + } + for ix, validation := range rules { result, ruleDiags := evalVariableValidation(validation, hclCtx, valueRng, addr, ix) diags = diags.Append(ruleDiags) diff --git a/internal/terraform/eval_variable_test.go b/internal/terraform/eval_variable_test.go index 3a6738e626..7781b35381 100644 --- a/internal/terraform/eval_variable_test.go +++ b/internal/terraform/eval_variable_test.go @@ -1173,7 +1173,13 @@ func TestEvalVariableValidations_jsonErrorMessageEdgeCase(t *testing.T) { // We need a minimal scope to allow basic functions to be passed to // the HCL scope - ctx.EvaluationScopeScope = &lang.Scope{} + ctx.EvaluationScopeScope = &lang.Scope{ + Data: &fakeEvaluationData{ + inputVariables: map[addrs.InputVariable]cty.Value{ + varAddr.Variable: test.given, + }, + }, + } ctx.NamedValuesState = namedvals.NewState() ctx.NamedValuesState.SetInputVariableValue(varAddr, test.given) ctx.ChecksState = checks.NewState(cfg) @@ -1322,13 +1328,19 @@ variable "bar" { // We need a minimal scope to allow basic functions to be passed to // the HCL scope - ctx.EvaluationScopeScope = &lang.Scope{} - ctx.NamedValuesState = namedvals.NewState() + varVal := test.given if varCfg.Sensitive { - ctx.NamedValuesState.SetInputVariableValue(varAddr, test.given.Mark(marks.Sensitive)) - } else { - ctx.NamedValuesState.SetInputVariableValue(varAddr, test.given) + varVal = varVal.Mark(marks.Sensitive) } + ctx.EvaluationScopeScope = &lang.Scope{ + Data: &fakeEvaluationData{ + inputVariables: map[addrs.InputVariable]cty.Value{ + varAddr.Variable: varVal, + }, + }, + } + ctx.NamedValuesState = namedvals.NewState() + ctx.NamedValuesState.SetInputVariableValue(varAddr, varVal) ctx.ChecksState = checks.NewState(cfg) ctx.ChecksState.ReportCheckableObjects(varAddr.ConfigCheckable(), addrs.MakeSet[addrs.Checkable](varAddr)) diff --git a/internal/terraform/graph_builder_apply.go b/internal/terraform/graph_builder_apply.go index fa337a2290..3289d0dc7c 100644 --- a/internal/terraform/graph_builder_apply.go +++ b/internal/terraform/graph_builder_apply.go @@ -125,9 +125,7 @@ func (b *ApplyGraphBuilder) Steps() []GraphTransformer { Config: b.Config, DestroyApply: b.Operation == walkDestroy, }, - &variableValidationTransformer{ - config: b.Config, - }, + &variableValidationTransformer{}, &LocalTransformer{Config: b.Config}, &OutputTransformer{ Config: b.Config, diff --git a/internal/terraform/graph_builder_eval.go b/internal/terraform/graph_builder_eval.go index 1a35ded13f..697b66fee0 100644 --- a/internal/terraform/graph_builder_eval.go +++ b/internal/terraform/graph_builder_eval.go @@ -76,9 +76,7 @@ func (b *EvalGraphBuilder) Steps() []GraphTransformer { // Add dynamic values &RootVariableTransformer{Config: b.Config, RawValues: b.RootVariableValues, Planning: true}, &ModuleVariableTransformer{Config: b.Config, Planning: true}, - &variableValidationTransformer{ - config: b.Config, - }, + &variableValidationTransformer{}, &LocalTransformer{Config: b.Config}, &OutputTransformer{ Config: b.Config, diff --git a/internal/terraform/graph_builder_plan.go b/internal/terraform/graph_builder_plan.go index 23455b5f15..ba7bc7507c 100644 --- a/internal/terraform/graph_builder_plan.go +++ b/internal/terraform/graph_builder_plan.go @@ -159,9 +159,7 @@ func (b *PlanGraphBuilder) Steps() []GraphTransformer { Planning: true, DestroyApply: false, // always false for planning }, - &variableValidationTransformer{ - config: b.Config, - }, + &variableValidationTransformer{}, &LocalTransformer{Config: b.Config}, &OutputTransformer{ Config: b.Config, diff --git a/internal/terraform/node_root_variable_test.go b/internal/terraform/node_root_variable_test.go index e894eae320..d22d15cc8d 100644 --- a/internal/terraform/node_root_variable_test.go +++ b/internal/terraform/node_root_variable_test.go @@ -62,39 +62,56 @@ func TestNodeRootVariableExecute(t *testing.T) { ctx.NamedValuesState = namedvals.NewState() - // The variable validation function gets called with Terraform's - // built-in functions available, so we need a minimal scope just for - // it to get the functions from. - ctx.EvaluationScopeScope = &lang.Scope{} + // We need a minimal scope that knows just enough to complete evaluation + // of this input variable. + varAddr := addrs.InputVariable{Name: "foo"} + varValue := cty.StringVal("5") + ctx.EvaluationScopeScope = &lang.Scope{ + Data: &fakeEvaluationData{ + inputVariables: map[addrs.InputVariable]cty.Value{ + // Nothing here to start, since in realistic use it + // would be NodeRootVariable that decides the final + // value to populate in here. + }, + }, + } n := &NodeRootVariable{ - Addr: addrs.InputVariable{Name: "foo"}, + Addr: varAddr, Config: &configs.Variable{ - Name: "foo", + Name: varAddr.Name, Type: cty.Number, ConstraintType: cty.Number, Validations: []*configs.CheckRule{ { - Condition: fakeHCLExpressionFunc(func(ctx *hcl.EvalContext) (cty.Value, hcl.Diagnostics) { - // This returns true only if the given variable value - // is exactly cty.Number, which allows us to verify - // that we were given the value _after_ type - // conversion. - // This had previously not been handled correctly, - // as reported in: - // https://github.com/hashicorp/terraform/issues/29899 - vars := ctx.Variables["var"] - if vars == cty.NilVal || !vars.Type().IsObjectType() || !vars.Type().HasAttribute("foo") { - t.Logf("var.foo isn't available") - return cty.False, nil - } - val := vars.GetAttr("foo") - if val == cty.NilVal || val.Type() != cty.Number { - t.Logf("var.foo is %#v; want a number", val) - return cty.False, nil - } - return cty.True, nil - }), + Condition: fakeHCLExpression( + []hcl.Traversal{ + { + hcl.TraverseRoot{Name: "var"}, + hcl.TraverseAttr{Name: varAddr.Name}, + }, + }, + func(ctx *hcl.EvalContext) (cty.Value, hcl.Diagnostics) { + // This returns true only if the given variable value + // is exactly cty.Number, which allows us to verify + // that we were given the value _after_ type + // conversion. + // This had previously not been handled correctly, + // as reported in: + // https://github.com/hashicorp/terraform/issues/29899 + vars := ctx.Variables["var"] + if vars == cty.NilVal || !vars.Type().IsObjectType() || !vars.Type().HasAttribute(varAddr.Name) { + t.Logf("%s isn't available", varAddr) + return cty.False, nil + } + val := vars.GetAttr(varAddr.Name) + if val == cty.NilVal || val.Type() != cty.Number { + t.Logf("%s is %#v; want a number", varAddr, val) + return cty.False, nil + } + return cty.True, nil + }, + ), ErrorMessage: hcltest.MockExprLiteral(cty.StringVal("Must be a number.")), }, }, @@ -102,7 +119,7 @@ func TestNodeRootVariableExecute(t *testing.T) { RawValue: &InputValue{ // Note: This is a string, but the variable's type constraint // is number so it should be converted before use. - Value: cty.StringVal("5"), + Value: varValue, SourceType: ValueFromUnknown, }, Planning: true, @@ -117,7 +134,7 @@ func TestNodeRootVariableExecute(t *testing.T) { ctx.ChecksState = checks.NewState(&configs.Config{ Module: &configs.Module{ Variables: map[string]*configs.Variable{ - "foo": n.Config, + varAddr.Name: n.Config, }, }, }) @@ -126,12 +143,9 @@ func TestNodeRootVariableExecute(t *testing.T) { if diags.HasErrors() { t.Fatalf("unexpected error from NodeRootVariable: %s", diags.Err()) } - diags = validateN.Execute(ctx, walkApply) - if diags.HasErrors() { - t.Fatalf("unexpected error from nodeVariableValidation: %s", diags.Err()) - } - absAddr := addrs.RootModuleInstance.InputVariable(n.Addr.Name) + // We should now have a final value for the variable, pending validation. + absAddr := varAddr.Absolute(addrs.RootModuleInstance) if !ctx.NamedValues().HasInputVariableValue(absAddr) { t.Fatalf("no result value for input variable") } @@ -139,8 +153,23 @@ func TestNodeRootVariableExecute(t *testing.T) { // NOTE: The given value was cty.Bool but the type constraint was // cty.String, so it was NodeRootVariable's responsibility to convert // as part of preparing the "final value". - t.Errorf("wrong value for ctx.SetRootModuleArgument\ngot: %#v\nwant: %#v", got, want) + t.Fatalf("wrong value for ctx.SetRootModuleArgument\ngot: %#v\nwant: %#v", got, want) + } else { + // Our evaluation scope would now, if using the _real_ + // evaluationStateData implementation, include that final value. + // + // There are also integration tests covering the fully-integrated + // form of this test, using the real evaluation data implementation: + // TestContext2Plan_variableCustomValidationsSimple + // TestContext2Plan_variableCustomValidationsCrossRef + ctx.EvaluationScopeScope.Data.(*fakeEvaluationData).inputVariables[varAddr] = got } + + diags = validateN.Execute(ctx, walkApply) + if diags.HasErrors() { + t.Fatalf("unexpected error from nodeVariableValidation: %s", diags.Err()) + } + if status := ctx.Checks().ObjectCheckStatus(n.Addr.Absolute(addrs.RootModuleInstance)); status != checks.StatusPass { t.Errorf("expected checks to pass but go %s instead", status) } @@ -178,3 +207,32 @@ func (f fakeHCLExpressionFunc) Range() hcl.Range { func (f fakeHCLExpressionFunc) StartRange() hcl.Range { return f.Range() } + +// fakeHCLExpressionFuncWithTraversals extends [fakeHCLExpressionFunc] with +// a set of traversals that it reports from the [hcl.Expression.Variables] +// method, thereby allowing the expression to also ask Terraform to include +// specific data in the evaluation context that'll eventually be passed +// to the callback function. +type fakeHCLExpressionFuncWithTraversals struct { + fakeHCLExpressionFunc + traversals []hcl.Traversal +} + +// fakeHCLExpression returns a [fakeHCLExpressionFuncWithTraversals] that +// announces that it requires the traversals given in required, and then +// calls the eval callback when asked to evaluate itself. +// +// If the evaluation callback expects to find any variables in the given +// HCL evaluation context then the corresponding traversals MUST be given +// in "required", because Terraform typically populates the context only +// with the minimum required data for a given expression. +func fakeHCLExpression(required []hcl.Traversal, eval fakeHCLExpressionFunc) fakeHCLExpressionFuncWithTraversals { + return fakeHCLExpressionFuncWithTraversals{ + fakeHCLExpressionFunc: eval, + traversals: required, + } +} + +func (f fakeHCLExpressionFuncWithTraversals) Variables() []hcl.Traversal { + return f.traversals +} diff --git a/internal/terraform/node_variable_validation.go b/internal/terraform/node_variable_validation.go index b2c7aede27..4322e35902 100644 --- a/internal/terraform/node_variable_validation.go +++ b/internal/terraform/node_variable_validation.go @@ -34,13 +34,6 @@ type nodeVariableValidation struct { // set from a non-configuration location like an environment variable -- // it's acceptable to use the declaration location instead. defnRange hcl.Range - - // allowGeneralReference is set for nodes that are associated with input - // variables that belong to modules participating in the - // "variable_validation_crossref" language experiment, which allows - // validation rules to refer to other objects declared in the same - // module as the variable. - allowGeneralReferences bool } var _ GraphNodeModulePath = (*nodeVariableValidation)(nil) @@ -114,25 +107,12 @@ func (n *nodeVariableValidation) Execute(globalCtx EvalContext, op walkOperation for _, modInst := range expander.ExpandModule(n.configAddr.Module, false) { addr := n.configAddr.Variable.Absolute(modInst) moduleCtx := globalCtx.withScope(evalContextModuleInstance{Addr: addr.Module}) - if n.allowGeneralReferences { - // This is a more general form that's currently available only - // as an opt-in language experiment. Hopefully eventually this - // evalVariableValidationsCrossRef function replaces the - // old evalVariableValidations and we remove the experiment. - diags = diags.Append(evalVariableValidationsCrossRef( - addr, - moduleCtx, - n.rules, - n.defnRange, - )) - } else { - diags = diags.Append(evalVariableValidations( - addr, - moduleCtx, - n.rules, - n.defnRange, - )) - } + diags = diags.Append(evalVariableValidations( + addr, + moduleCtx, + n.rules, + n.defnRange, + )) } return diags diff --git a/internal/terraform/transform_variable_validation.go b/internal/terraform/transform_variable_validation.go index ad57c3b411..7c6ae820d4 100644 --- a/internal/terraform/transform_variable_validation.go +++ b/internal/terraform/transform_variable_validation.go @@ -11,7 +11,6 @@ import ( "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/configs" "github.com/hashicorp/terraform/internal/dag" - "github.com/hashicorp/terraform/internal/experiments" ) // graphNodeValidatableVariable is implemented by nodes that represent @@ -54,7 +53,6 @@ var _ graphNodeValidatableVariable = (*nodeExpandModuleVariable)(nil) // with the new [nodeVariableValidation] nodes to prevent downstream nodes // from relying on unvalidated values. type variableValidationTransformer struct { - config *configs.Config } var _ GraphTransformer = (*variableValidationTransformer)(nil) @@ -67,19 +65,11 @@ func (t *variableValidationTransformer) Transform(g *Graph) error { continue // irrelevant node } - crossRefAllowed := false configAddr, rules, defnRange := v.variableValidationRules() - if moduleConfig := t.config.Descendent(configAddr.Module); moduleConfig != nil { - if moduleConfig.Module.ActiveExperiments.Has(experiments.VariableValidationCrossRef) { - crossRefAllowed = true - } - } - newV := &nodeVariableValidation{ - configAddr: configAddr, - rules: rules, - defnRange: defnRange, - allowGeneralReferences: crossRefAllowed, + configAddr: configAddr, + rules: rules, + defnRange: defnRange, } if len(rules) != 0 { diff --git a/website/docs/language/expressions/custom-conditions.mdx b/website/docs/language/expressions/custom-conditions.mdx index d68107664e..6f658ad36b 100644 --- a/website/docs/language/expressions/custom-conditions.mdx +++ b/website/docs/language/expressions/custom-conditions.mdx @@ -29,9 +29,9 @@ For more information on when to use certain custom conditions, see [Choosing Bet ## Input Variable Validation --> **Note:** Input variable validation is available in Terraform v0.13.0 and later. +-> **Note:** Input variable validation is available in Terraform v0.13.0 and later. Before Terraform v1.9.0, validation rules can refer only to the variable being validated, and not to any other variables. -Add one or more `validation` blocks within the `variable` block to specify custom conditions. Each validation requires a [`condition` argument](#condition-expressions), an expression that must use the value of the variable to return `true` if the value is valid, or `false` if it is invalid. The expression can refer only to the containing variable and must not produce errors. +Add one or more `validation` blocks within the `variable` block to specify custom conditions. Each validation requires a [`condition` argument](#condition-expressions), an expression that must use the value of the variable to return `true` if the value is valid, or `false` if it is invalid. The expression must not cause errors directly itself. If the condition evaluates to `false`, Terraform produces an [error message](#error-messages) that includes the result of the `error_message` expression. If you declare multiple validations, Terraform returns error messages for all failed conditions. From ddd7ddd1ed2c38d84f6f70eff52dd0b650c953b1 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Wed, 22 May 2024 11:20:51 -0400 Subject: [PATCH 103/161] use try() in removed provisioner test This records in a test that both `count.index` and `each.key` will validate properly within a `removed` block provisioner. --- .../testdata/apply-provisioner-destroy-removed/main.tf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/internal/terraform/testdata/apply-provisioner-destroy-removed/main.tf b/internal/terraform/testdata/apply-provisioner-destroy-removed/main.tf index a050d3ce63..541fce3040 100644 --- a/internal/terraform/testdata/apply-provisioner-destroy-removed/main.tf +++ b/internal/terraform/testdata/apply-provisioner-destroy-removed/main.tf @@ -3,6 +3,10 @@ removed { provisioner "shell" { when = "destroy" - command = "destroy ${each.key} ${self.foo}" + + // Capture that we can reference either count.index or each.key from a + // removed block, and it's up to the user to ensure the provisioner is + // correct for the now removed resources. + command = "destroy ${try(count.index, each.key)} ${self.foo}" } } From 8e5f2bdd6a1ea2231f3eec19c80527eb9fb5064f Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Wed, 22 May 2024 08:29:42 -0700 Subject: [PATCH 104/161] Update CHANGELOG.md --- CHANGELOG.md | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d06a5c7526..3e24c77b06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,20 +1,25 @@ ## 1.9.0 (Unreleased) +NEW FEATURES: + +* **Input variable validation rules can refer to other objects**: Previously input variable validation rules could refer only to the variable being validated. Now they are general expressions, similar to those elsewhere in a module, which can refer to other input variables and to other objects such as data resources. + ENHANCEMENTS: -* `terraform console`: Now has basic support for multi-line input in interactive mode. ([#34822](https://github.com/hashicorp/terraform/pull/34822)) - If an entered line contains opening parentheses/etc that are not closed, Terraform will await another line of input to complete the expression. This initial implementation is primarily intended to support pasting in multi-line expressions from elsewhere, rather than for manual multi-line editing, so the interactive editing support is currently limited. * `terraform plan`: Improved presentation of OPA and Sentinel policy evaluations in HCP Terraform remote runs, for logical separation. * `terraform init` now accepts a `-json` option. If specified, enables the machine readable JSON output. ([#34886](https://github.com/hashicorp/terraform/pull/34886)) * `terraform test`: Test runs can now pass sensitive values to input variables while preserving their dynamic sensitivity. Previously sensitivity would be preserved only for variables statically declared as being sensitive, using `sensitive = true`. ([#35021](https://github.com/hashicorp/terraform/pull/35021)) -* Performance improvement during graph building for configurations with an extremely large number of `resource` blocks. ([#35088](https://github.com/hashicorp/terraform/pull/35088)) -* Reduced copying of state to improve performance with larges numbers of resources. [GH-35164] -* `terraform_data`: Enabled `moved` configuration refactoring from the `hashicorp/null` provider `null_resource` managed resource ([#35163](https://github.com/hashicorp/terraform/pull/35163)) -* `terraform output` with `cloud` block: terraform no longer suggests that data loss could occur when outputs are not available [GH-35143] +* config: Input variable validation rules can now refer to other objects in the same module. ([#34955](https://github.com/hashicorp/terraform/pull/34955)) +* core: Performance improvement during graph building for configurations with an extremely large number of `resource` blocks. ([#35088](https://github.com/hashicorp/terraform/pull/35088)) +* built-in `terraform` provider: Allows `moved` block refactoring from the `hashicorp/null` provider `null_resource` resource type to the `terraform_data` resource type. ([#35163](https://github.com/hashicorp/terraform/pull/35163)) +* `terraform output` with `cloud` block: Terraform no longer suggests that data loss could occur when outputs are not available. [GH-35143] +* `terraform console`: Now has basic support for multi-line input in interactive mode. ([#34822](https://github.com/hashicorp/terraform/pull/34822)) + If an entered line contains opening parentheses/etc that are not closed, Terraform will await another line of input to complete the expression. This initial implementation is primarily intended to support pasting in multi-line expressions from elsewhere, rather than for manual multi-line editing, so the interactive editing support is currently limited. +* cli: Reduced copying of state to improve performance with larges numbers of resources. [GH-35164] BUG FIXES: -* remote-exec: Each remote connection will now be closed immediately after use. ([#34137](https://github.com/hashicorp/terraform/issues/34137)) +* `remote-exec` provisioner: Each remote connection will now be closed immediately after use. ([#34137](https://github.com/hashicorp/terraform/issues/34137)) * backend/s3: Fixed the digest value displayed for DynamoDB/S3 state checksum mismatches. ([#34387](https://github.com/hashicorp/terraform/issues/34387)) * `terraform test`: Fix bug in which non-Hashicorp providers required by testing modules and initialised within the test files were assigned incorrect registry addresses. ([#35161](https://github.com/hashicorp/terraform/issues/35161)) * config: The `templatefile` function no longer returns a "panic" error if the template file path is marked as sensitive. Instead, the template rendering result is also marked as sensitive. ([#35180](https://github.com/hashicorp/terraform/issues/35180)) From 0101cf50dbfa7cceaadaa1ddbd4916205e5f7e04 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Wed, 22 May 2024 08:30:34 -0700 Subject: [PATCH 105/161] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e24c77b06..0222ee414d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,11 +32,11 @@ EXPERIMENTS: Experiments are only enabled in alpha releases of Terraform CLI. The following features are not yet available in stable releases. -* `variable_validation_crossref`: This [language experiment](https://developer.hashicorp.com/terraform/language/settings#experimental-language-features) allows `validation` blocks inside input variable declarations to refer to other objects inside the module where the variable is declared, including to the values of other input variables in the same module. * `template_string_func`: This [language experiment](https://developer.hashicorp.com/terraform/language/settings#experimental-language-features) introduces a new built-in function named `templatestring` which is similar to `templatefile` but designed to render templates obtained dynamically, such as from a data resource result. * `terraform test` accepts a new option `-junit-xml=FILENAME`. If specified, and if the test configuration is valid enough to begin executing, then Terraform writes a JUnit XML test result report to the given filename, describing similar information as included in the normal test output. ([#34291](https://github.com/hashicorp/terraform/issues/34291)) * The new command `terraform rpcapi` exposes some Terraform Core functionality through an RPC interface compatible with [`go-plugin`](https://github.com/hashicorp/go-plugin). The exact RPC API exposed here is currently subject to change at any time, because it's here primarily as a vehicle to support the [Terraform Stacks](https://www.hashicorp.com/blog/terraform-stacks-explained) private preview and so will be broken if necessary to respond to feedback from private preview participants, or possibly for other reasons. Do not use this mechanism yet outside of Terraform Stacks private preview. * The experimental "deferred actions" feature, enabled by passing the `-allow-deferral` option to `terraform plan`, permits `count` and `for_each` arguments in `module`, `resource`, and `data` blocks to have unknown values and allows providers to react more flexibly to unknown values. This experiment is under active development, and so it's not yet useful to participate in this experiment. +* `variable_validation_crossref`: This [language experiment](https://developer.hashicorp.com/terraform/language/settings#experimental-language-features) previously allowed `validation` blocks inside input variable declarations to refer to other objects inside the module where the variable is declared. This experiment has now been stabilized, so you no longer need to enable this experiment. ## Previous Releases From 844268f4b91080c501869393abe48759992162d6 Mon Sep 17 00:00:00 2001 From: Mark DeCrane Date: Wed, 22 May 2024 16:01:34 -0400 Subject: [PATCH 106/161] Update ModuleVersion to include new deprecated fields --- internal/registry/response/module_versions.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/internal/registry/response/module_versions.go b/internal/registry/response/module_versions.go index a2dafa0238..8272ed268b 100644 --- a/internal/registry/response/module_versions.go +++ b/internal/registry/response/module_versions.go @@ -20,9 +20,16 @@ type ModuleProviderVersions struct { // ModuleVersion is the output metadata for a given version needed by CLI to // resolve candidate versions to satisfy requirements. type ModuleVersion struct { - Version string `json:"version"` - Root VersionSubmodule `json:"root"` - Submodules []*VersionSubmodule `json:"submodules"` + Version string `json:"version"` + Root VersionSubmodule `json:"root"` + Submodules []*VersionSubmodule `json:"submodules"` + Deprecation *Deprecation `json:"deprecation"` +} + +// Deprecation holds the user provided reason and link for the specific module version deprecation +type Deprecation struct { + Reason string `json:"reason"` + Link string `json:"link"` } // VersionSubmodule is the output metadata for a submodule within a given From 724adea97af871adde51db8a4bfc9f40b6f5a053 Mon Sep 17 00:00:00 2001 From: Mark DeCrane Date: Wed, 22 May 2024 17:56:09 -0400 Subject: [PATCH 107/161] Surface deprecation warnings for module to be installed and already installed modules --- internal/initwd/module_install.go | 96 ++++++++++++++++++++++++++----- 1 file changed, 82 insertions(+), 14 deletions(-) diff --git a/internal/initwd/module_install.go b/internal/initwd/module_install.go index fbcfc0774a..76e3a279fb 100644 --- a/internal/initwd/module_install.go +++ b/internal/initwd/module_install.go @@ -254,6 +254,50 @@ func (i *ModuleInstaller) moduleInstallWalker(ctx context.Context, manifest mods } log.Printf("[TRACE] ModuleInstaller: Module installer: %s %s already installed in %s", key, record.Version, record.Dir) + + // Checking for module deprecations in the case no new module versions need installation + if addr, isRegistryModule := req.SourceAddr.(addrs.ModuleSourceRegistry); isRegistryModule { + regClient := i.reg + + regsrcAddr := regsrc.ModuleFromRegistryPackageAddr(addr.Package) + resp, err := regClient.ModuleVersions(ctx, regsrcAddr) + if err != nil { + log.Printf("[DEBUG] Deprecation for %s could not be checked: call to registry failed: %v", addr.Package.Namespace, err) + + } else { + found: + for _, modProviderVersions := range resp.Modules { + for _, modVersion := range modProviderVersions.Versions { + vm, _ := version.NewVersion(modVersion.Version) + if vm.Equal(record.Version) { + if modVersion.Deprecation != nil { + var additionalInfo []string + if modVersion.Deprecation.Reason != "" { + additionalInfo = append(additionalInfo, modVersion.Deprecation.Reason) + } + if modVersion.Deprecation.Link != "" { + additionalInfo = append(additionalInfo, fmt.Sprintf("More information: %s", modVersion.Deprecation.Link)) + } + var detail string + if len(additionalInfo) == 1 { + detail = additionalInfo[0] + } else { + detail = strings.Join(additionalInfo, "\n\n") + } + diags = append(diags, &hcl.Diagnostic{ + Severity: hcl.DiagWarning, + Summary: fmt.Sprintf("Module version %s of %s is deprecated", modVersion.Version, req.Name), + Detail: detail, + Subject: req.CallRange.Ptr(), + }) + } + break found + } + } + } + } + } + return mod, record.Version, diags } } @@ -480,7 +524,8 @@ func (i *ModuleInstaller) installRegistryModule(ctx context.Context, req *config modMeta := resp.Modules[0] - var latestMatch *version.Version + var latestMatch *response.ModuleVersion + var latestMatchVersion *version.Version var latestVersion *version.Version for _, mv := range modMeta.Versions { v, err := version.NewVersion(mv.Version) @@ -545,8 +590,9 @@ func (i *ModuleInstaller) installRegistryModule(ctx context.Context, req *config } if req.VersionConstraint.Required.Check(v) { - if latestMatch == nil || v.GreaterThan(latestMatch) { - latestMatch = v + if latestMatch == nil || v.GreaterThan(latestMatchVersion) { + latestMatch = mv + latestMatchVersion = v } } } @@ -571,23 +617,45 @@ func (i *ModuleInstaller) installRegistryModule(ctx context.Context, req *config return nil, nil, diags } + if latestMatch.Deprecation != nil { + var additionalInfo []string + if latestMatch.Deprecation.Reason != "" { + additionalInfo = append(additionalInfo, latestMatch.Deprecation.Reason) + } + if latestMatch.Deprecation.Link != "" { + additionalInfo = append(additionalInfo, fmt.Sprintf("More information: %s", latestMatch.Deprecation.Link)) + } + var detail string + if len(additionalInfo) == 1 { + detail = additionalInfo[0] + } else { + detail = strings.Join(additionalInfo, "\n\n") + } + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagWarning, + Summary: fmt.Sprintf("Module version %s of %s is deprecated", latestMatch.Version, req.Name), + Detail: detail, + Subject: req.CallRange.Ptr(), + }) + } + // Report up to the caller that we're about to start downloading. - hooks.Download(key, packageAddr.String(), latestMatch) + hooks.Download(key, packageAddr.String(), latestMatchVersion) // If we manage to get down here then we've found a suitable version to // install, so we need to ask the registry where we should download it from. // The response to this is a go-getter-style address string. // first check the cache for the download URL - moduleAddr := moduleVersion{module: packageAddr, version: latestMatch.String()} + moduleAddr := moduleVersion{module: packageAddr, version: latestMatchVersion.String()} if _, exists := i.registryPackageSources[moduleAddr]; !exists { - realAddrRaw, err := reg.ModuleLocation(ctx, regsrcAddr, latestMatch.String()) + realAddrRaw, err := reg.ModuleLocation(ctx, regsrcAddr, latestMatchVersion.String()) if err != nil { - log.Printf("[ERROR] %s from %s %s: %s", key, addr, latestMatch, err) + log.Printf("[ERROR] %s from %s %s: %s", key, addr, latestMatchVersion, err) diags = diags.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, Summary: "Error accessing remote module registry", - Detail: fmt.Sprintf("Failed to retrieve a download URL for %s %s from %s: %s", addr, latestMatch, hostname, err), + Detail: fmt.Sprintf("Failed to retrieve a download URL for %s %s from %s: %s", addr, latestMatchVersion, hostname, err), }) return nil, nil, diags } @@ -596,7 +664,7 @@ func (i *ModuleInstaller) installRegistryModule(ctx context.Context, req *config diags = diags.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, Summary: "Invalid package location from module registry", - Detail: fmt.Sprintf("Module registry %s returned invalid source location %q for %s %s: %s.", hostname, realAddrRaw, addr, latestMatch, err), + Detail: fmt.Sprintf("Module registry %s returned invalid source location %q for %s %s: %s.", hostname, realAddrRaw, addr, latestMatchVersion, err), }) return nil, nil, diags } @@ -611,7 +679,7 @@ func (i *ModuleInstaller) installRegistryModule(ctx context.Context, req *config diags = diags.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, Summary: "Invalid package location from module registry", - Detail: fmt.Sprintf("Module registry %s returned invalid source location %q for %s %s: must be a direct remote package address.", hostname, realAddrRaw, addr, latestMatch), + Detail: fmt.Sprintf("Module registry %s returned invalid source location %q for %s %s: must be a direct remote package address.", hostname, realAddrRaw, addr, latestMatchVersion), }) return nil, nil, diags } @@ -619,7 +687,7 @@ func (i *ModuleInstaller) installRegistryModule(ctx context.Context, req *config dlAddr := i.registryPackageSources[moduleAddr] - log.Printf("[TRACE] ModuleInstaller: %s %s %s is available at %q", key, packageAddr, latestMatch, dlAddr.Package) + log.Printf("[TRACE] ModuleInstaller: %s %s %s is available at %q", key, packageAddr, latestMatchVersion, dlAddr.Package) err := fetcher.FetchPackage(ctx, instPath, dlAddr.Package.String()) if errors.Is(err, context.Canceled) { @@ -681,14 +749,14 @@ func (i *ModuleInstaller) installRegistryModule(ctx context.Context, req *config // Note the local location in our manifest. manifest[key] = modsdir.Record{ Key: key, - Version: latestMatch, + Version: latestMatchVersion, Dir: modDir, SourceAddr: req.SourceAddr.String(), } log.Printf("[DEBUG] Module installer: %s installed at %s", key, modDir) - hooks.Install(key, latestMatch, modDir) + hooks.Install(key, latestMatchVersion, modDir) - return mod, latestMatch, diags + return mod, latestMatchVersion, diags } func (i *ModuleInstaller) installGoGetterModule(ctx context.Context, req *configs.ModuleRequest, key string, instPath string, manifest modsdir.Manifest, hooks ModuleInstallHooks, fetcher *getmodules.PackageFetcher) (*configs.Module, hcl.Diagnostics) { From 1e7c29243e5c27a5f02349540cbde59c82999a5e Mon Sep 17 00:00:00 2001 From: Mark DeCrane Date: Wed, 22 May 2024 18:06:00 -0400 Subject: [PATCH 108/161] Added Extra field for TFC diagnostic processing --- internal/command/views/json/diagnostic.go | 8 ++++++ internal/initwd/module_install.go | 30 +++++++++++++++++++++++ internal/tfdiags/diagnostic.go | 5 ++++ website/docs/cli/commands/validate.mdx | 3 +++ 4 files changed, 46 insertions(+) diff --git a/internal/command/views/json/diagnostic.go b/internal/command/views/json/diagnostic.go index 4b5f7f4abc..17ff4e12b7 100644 --- a/internal/command/views/json/diagnostic.go +++ b/internal/command/views/json/diagnostic.go @@ -38,6 +38,7 @@ type Diagnostic struct { Address string `json:"address,omitempty"` Range *DiagnosticRange `json:"range,omitempty"` Snippet *DiagnosticSnippet `json:"snippet,omitempty"` + Extra any `json:"extra,omitempty"` } // Pos represents a position in the source code. @@ -144,11 +145,18 @@ func NewDiagnostic(diag tfdiags.Diagnostic, sources map[string][]byte) *Diagnost desc := diag.Description() + extra := diag.ExtraInfo() + var publicExtra tfdiags.PublicExtraInfo + if e, ok := extra.(tfdiags.PublicExtraInfo); ok { + publicExtra = e + } + diagnostic := &Diagnostic{ Severity: sev, Summary: desc.Summary, Detail: desc.Detail, Address: desc.Address, + Extra: publicExtra, } sourceRefs := diag.Source() diff --git a/internal/initwd/module_install.go b/internal/initwd/module_install.go index 76e3a279fb..f7dbd5eece 100644 --- a/internal/initwd/module_install.go +++ b/internal/initwd/module_install.go @@ -49,6 +49,22 @@ type moduleVersion struct { version string } +type TypeDiagnosticExtra string + +const TypeModuleVersionDeprecation = "module_version_deprecation" + +type ModuleVersionDeprecationDiagnosticExtra struct { + Type TypeDiagnosticExtra `json:"type"` + Version string `json:"version"` + SourceName string `json:"source_name"` + DeprecationMessage string `json:"deprecation_message"` + Link string `json:"link"` +} + +func (m ModuleVersionDeprecationDiagnosticExtra) IsPublic() { + // NOP +} + func NewModuleInstaller(modsDir string, loader *configload.Loader, reg *registry.Client) *ModuleInstaller { return &ModuleInstaller{ modsDir: modsDir, @@ -289,6 +305,13 @@ func (i *ModuleInstaller) moduleInstallWalker(ctx context.Context, manifest mods Summary: fmt.Sprintf("Module version %s of %s is deprecated", modVersion.Version, req.Name), Detail: detail, Subject: req.CallRange.Ptr(), + Extra: &ModuleVersionDeprecationDiagnosticExtra{ + Type: TypeModuleVersionDeprecation, + Version: modVersion.Version, + SourceName: req.Name, + DeprecationMessage: modVersion.Deprecation.Reason, + Link: modVersion.Deprecation.Link, + }, }) } break found @@ -636,6 +659,13 @@ func (i *ModuleInstaller) installRegistryModule(ctx context.Context, req *config Summary: fmt.Sprintf("Module version %s of %s is deprecated", latestMatch.Version, req.Name), Detail: detail, Subject: req.CallRange.Ptr(), + Extra: &ModuleVersionDeprecationDiagnosticExtra{ + Type: TypeModuleVersionDeprecation, + Version: latestMatch.Version, + SourceName: req.Name, + DeprecationMessage: latestMatch.Deprecation.Reason, + Link: latestMatch.Deprecation.Link, + }, }) } diff --git a/internal/tfdiags/diagnostic.go b/internal/tfdiags/diagnostic.go index c50c81890c..528ba11a42 100644 --- a/internal/tfdiags/diagnostic.go +++ b/internal/tfdiags/diagnostic.go @@ -65,3 +65,8 @@ type FromExpr struct { Expression hcl.Expression EvalContext *hcl.EvalContext } + +// PublicExtraInfo is an interface for marking Extra field that contain public extra information +type PublicExtraInfo interface { + IsPublic() +} diff --git a/website/docs/cli/commands/validate.mdx b/website/docs/cli/commands/validate.mdx index 1ae22f36b1..8b688a5862 100644 --- a/website/docs/cli/commands/validate.mdx +++ b/website/docs/cli/commands/validate.mdx @@ -178,6 +178,9 @@ The nested objects in `diagnostics` have the following properties: which may be useful in understanding the source of a diagnostic in a complex expression. These expression value objects are described below. + - `extra` (object): An optional object that serves as an extension point for additional + machine-readable information about the problem. + ### Source Position A source position object, as used in the `range` property of a diagnostic From 0beb62b13f2e4cdbd6a1abaf0279d86842242428 Mon Sep 17 00:00:00 2001 From: Mark DeCrane Date: Wed, 22 May 2024 18:38:39 -0400 Subject: [PATCH 109/161] Test for surfacing of deprecation warning --- internal/initwd/module_install_test.go | 67 +++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/internal/initwd/module_install_test.go b/internal/initwd/module_install_test.go index 217b6cfd8f..5bab3a43ff 100644 --- a/internal/initwd/module_install_test.go +++ b/internal/initwd/module_install_test.go @@ -25,6 +25,7 @@ import ( "github.com/hashicorp/terraform/internal/configs/configload" "github.com/hashicorp/terraform/internal/copy" "github.com/hashicorp/terraform/internal/registry" + "github.com/hashicorp/terraform/internal/registry/response" "github.com/hashicorp/terraform/internal/tfdiags" _ "github.com/hashicorp/terraform/internal/logging" @@ -595,6 +596,70 @@ func TestLoaderInstallModules_registry(t *testing.T) { } +func TestLoaderInstallModules_registry_deprecated(t *testing.T) { + fixtureDir := filepath.Clean("testdata/registry-module-from-test") + tmpDir, done := tempChdir(t, fixtureDir) + // the module installer runs filepath.EvalSymlinks() on the destination + // directory before copying files, and the resultant directory is what is + // returned by the install hooks. Without this, tests could fail on machines + // where the default temp dir was a symlink. + dir, err := filepath.EvalSymlinks(tmpDir) + if err != nil { + t.Error(err) + } + + defer done() + + hooks := &testInstallHooks{} + modulesDir := filepath.Join(dir, ".terraform/modules") + + loader, close := configload.NewLoaderForTests(t) + defer close() + + inst := NewModuleInstaller(modulesDir, loader, registry.NewClient(nil, nil)) + + // Avoid actual registry lookup by populating registry cache + packageAddr := addrs.ModuleRegistryPackage{ + Host: svchost.Hostname("registry.terraform.io"), + Namespace: "hashicorp", + Name: "module-installer-acctest", + TargetSystem: "aws", + } + + inst.registryPackageVersions[packageAddr] = &response.ModuleVersions{ + Modules: []*response.ModuleProviderVersions{ + { + Source: "", + Versions: []*response.ModuleVersion{ + { + Version: "0.0.1", + Root: response.VersionSubmodule{}, + Submodules: []*response.VersionSubmodule{}, + Deprecation: &response.Deprecation{ + Reason: "This module is deprecated", + Link: "https://example.com/deprecation", + }, + }, + }, + }, + }, + } + + _, diags := inst.InstallModules(context.Background(), dir, "tests", false, false, hooks) + + if !diags.HasWarnings() { + t.Fatal("expected warning") + } else { + assertDiagnosticCount(t, diags, 1) + assertDiagnosticSummary(t, diags, "Module version 0.0.1 of setup is deprecated") + + wantDetail := "This module is deprecated\n\nMore information: https://example.com/deprecation" + if diags[0].Description().Detail != wantDetail { + t.Errorf("wrong deprecation detail\nwant: %s\ngot: %s", wantDetail, diags[0].Description().Detail) + } + } +} + func TestLoaderInstallModules_goGetter(t *testing.T) { if os.Getenv("TF_ACC") == "" { t.Skip("this test accesses github.com; set TF_ACC=1 to run it") @@ -968,7 +1033,7 @@ func assertDiagnosticCount(t *testing.T, diags tfdiags.Diagnostics, want int) bo if len(diags) != want { t.Errorf("wrong number of diagnostics %d; want %d", len(diags), want) for _, diag := range diags { - t.Logf("- %#v", diag) + t.Logf("- %#v", diag.Description().Summary) } return true } From 3258744166e8ae3d78a56b934ec7c64c8a034264 Mon Sep 17 00:00:00 2001 From: MicahKimel Date: Thu, 23 May 2024 04:32:39 -0400 Subject: [PATCH 110/161] Remove invalid warning during cleanup phase (#35172) * stop invalid warning during cleanup phase * stop invalid warning during cleanup phase * invalid warning during cleanup phase * remove unwanted comment * update GetVariables parameter for including warnings * invalid warning during cleanup phase test case * update invalid warnings in cleanup test case to throw a warning for the validation variable before cleanup phase * remove unwanted warnings --- internal/backend/local/test.go | 28 +++---- internal/command/test_test.go | 78 +++++++++++++++++++ .../test/invalid-cleanup-warnings/main.tf | 8 ++ .../invalid-cleanup-warnings/main.tftest.hcl | 13 ++++ 4 files changed, 111 insertions(+), 16 deletions(-) create mode 100644 internal/command/testdata/test/invalid-cleanup-warnings/main.tf create mode 100644 internal/command/testdata/test/invalid-cleanup-warnings/main.tftest.hcl diff --git a/internal/backend/local/test.go b/internal/backend/local/test.go index aff0f90229..4027c9fec3 100644 --- a/internal/backend/local/test.go +++ b/internal/backend/local/test.go @@ -431,7 +431,7 @@ func (runner *TestFileRunner) run(run *moduletest.Run, file *moduletest.File, st return state, false } - variables, variableDiags := runner.GetVariables(config, run, references) + variables, variableDiags := runner.GetVariables(config, run, references, true) run.Diagnostics = run.Diagnostics.Append(variableDiags) if variableDiags.HasErrors() { run.Status = moduletest.Error @@ -544,12 +544,6 @@ func (runner *TestFileRunner) run(run *moduletest.Run, file *moduletest.File, st resetVariables := runner.AddVariablesToConfig(config, variables) defer resetVariables() - run.Diagnostics = run.Diagnostics.Append(variableDiags) - if variableDiags.HasErrors() { - run.Status = moduletest.Error - return updated, true - } - if runner.Suite.Verbose { schemas, diags := tfCtx.Schemas(config, updated) @@ -637,7 +631,7 @@ func (runner *TestFileRunner) destroy(config *configs.Config, state *states.Stat var diags tfdiags.Diagnostics - variables, variableDiags := runner.GetVariables(config, run, nil) + variables, variableDiags := runner.GetVariables(config, run, nil, false) diags = diags.Append(variableDiags) if diags.HasErrors() { @@ -1004,7 +998,7 @@ func (runner *TestFileRunner) cleanup(file *moduletest.File) { // more variables than are required by the config. FilterVariablesToConfig // should be called before trying to use these variables within a Terraform // plan, apply, or destroy operation. -func (runner *TestFileRunner) GetVariables(config *configs.Config, run *moduletest.Run, references []*addrs.Reference) (terraform.InputValues, tfdiags.Diagnostics) { +func (runner *TestFileRunner) GetVariables(config *configs.Config, run *moduletest.Run, references []*addrs.Reference, includeWarnings bool) (terraform.InputValues, tfdiags.Diagnostics) { var diags tfdiags.Diagnostics // relevantVariables contains the variables that are of interest to this @@ -1071,13 +1065,15 @@ func (runner *TestFileRunner) GetVariables(config *configs.Config, run *modulete // wrote in the variable expression. But, we don't want to actually use // it if it's not actually relevant. if _, exists := relevantVariables[name]; !exists { - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagWarning, - Summary: "Value for undeclared variable", - Detail: fmt.Sprintf("The module under test does not declare a variable named %q, but it is declared in run block %q.", name, run.Name), - Subject: expr.Range().Ptr(), - }) - + // Do not display warnings during cleanup phase + if includeWarnings { + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagWarning, + Summary: "Value for undeclared variable", + Detail: fmt.Sprintf("The module under test does not declare a variable named %q, but it is declared in run block %q.", name, run.Name), + Subject: expr.Range().Ptr(), + }) + } continue // Don't add it to our final set of variables. } diff --git a/internal/command/test_test.go b/internal/command/test_test.go index 7ac4f9655e..a81f9554bc 100644 --- a/internal/command/test_test.go +++ b/internal/command/test_test.go @@ -1270,6 +1270,84 @@ Success! 2 passed, 0 failed. } } +// There should not be warnings in clean-up +func TestTest_InvalidWarningsInCleanup(t *testing.T) { + td := t.TempDir() + testCopyDir(t, testFixturePath(path.Join("test", "invalid-cleanup-warnings")), td) + defer testChdir(t, td)() + + provider := testing_command.NewProvider(nil) + providerSource, close := newMockProviderSource(t, map[string][]string{ + "test": {"1.0.0"}, + }) + defer close() + + streams, done := terminal.StreamsForTesting(t) + view := views.NewView(streams) + ui := new(cli.MockUi) + + meta := Meta{ + testingOverrides: metaOverridesForProvider(provider.Provider), + Ui: ui, + View: view, + Streams: streams, + ProviderSource: providerSource, + } + + init := &InitCommand{ + Meta: meta, + } + + output := done(t) + + if code := init.Run(nil); code != 0 { + t.Fatalf("expected status code 0 but got %d: %s", code, output.All()) + } + + // Reset the streams for the next command. + streams, done = terminal.StreamsForTesting(t) + meta.Streams = streams + meta.View = views.NewView(streams) + + c := &TestCommand{ + Meta: meta, + } + + code := c.Run([]string{"-no-color"}) + output = done(t) + + if code != 0 { + t.Errorf("expected status code 0 but got %d", code) + } + + expected := `main.tftest.hcl... in progress + run "test"... pass + +Warning: Value for undeclared variable + + on main.tftest.hcl line 6, in run "test": + 6: validation = "Hello, world!" + +The module under test does not declare a variable named "validation", but it +is declared in run block "test". + +main.tftest.hcl... tearing down +main.tftest.hcl... pass + +Success! 1 passed, 0 failed. +` + + actual := output.All() + + if diff := cmp.Diff(actual, expected); len(diff) > 0 { + t.Errorf("output didn't match expected:\nexpected:\n%s\nactual:\n%s\ndiff:\n%s", expected, actual, diff) + } + + if provider.ResourceCount() > 0 { + t.Errorf("should have deleted all resources on completion but left %v", provider.ResourceString()) + } +} + func TestTest_BadReferences(t *testing.T) { td := t.TempDir() testCopyDir(t, testFixturePath(path.Join("test", "bad-references")), td) diff --git a/internal/command/testdata/test/invalid-cleanup-warnings/main.tf b/internal/command/testdata/test/invalid-cleanup-warnings/main.tf new file mode 100644 index 0000000000..25878f33d4 --- /dev/null +++ b/internal/command/testdata/test/invalid-cleanup-warnings/main.tf @@ -0,0 +1,8 @@ +# main.tf + +variable "input" {} + +resource "test_resource" "resource" { + value = var.input +} + diff --git a/internal/command/testdata/test/invalid-cleanup-warnings/main.tftest.hcl b/internal/command/testdata/test/invalid-cleanup-warnings/main.tftest.hcl new file mode 100644 index 0000000000..2f778e2704 --- /dev/null +++ b/internal/command/testdata/test/invalid-cleanup-warnings/main.tftest.hcl @@ -0,0 +1,13 @@ +# main.tftest.hcl + +run "test" { + variables { + input = "Hello, world!" + validation = "Hello, world!" + } + assert { + condition = test_resource.resource.value == "Hello, world!" + error_message = "bad!" + } +} + From 9b6fc3b1fdcbffb6939bcbc832e2f5c7f3a145bc Mon Sep 17 00:00:00 2001 From: Mark DeCrane Date: Thu, 23 May 2024 10:39:23 -0400 Subject: [PATCH 111/161] corrected naming in test --- internal/initwd/module_install_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/initwd/module_install_test.go b/internal/initwd/module_install_test.go index 5bab3a43ff..083d61d0b8 100644 --- a/internal/initwd/module_install_test.go +++ b/internal/initwd/module_install_test.go @@ -636,7 +636,7 @@ func TestLoaderInstallModules_registry_deprecated(t *testing.T) { Root: response.VersionSubmodule{}, Submodules: []*response.VersionSubmodule{}, Deprecation: &response.Deprecation{ - Reason: "This module is deprecated", + Reason: "This module version is deprecated", Link: "https://example.com/deprecation", }, }, @@ -653,7 +653,7 @@ func TestLoaderInstallModules_registry_deprecated(t *testing.T) { assertDiagnosticCount(t, diags, 1) assertDiagnosticSummary(t, diags, "Module version 0.0.1 of setup is deprecated") - wantDetail := "This module is deprecated\n\nMore information: https://example.com/deprecation" + wantDetail := "This module version is deprecated\n\nMore information: https://example.com/deprecation" if diags[0].Description().Detail != wantDetail { t.Errorf("wrong deprecation detail\nwant: %s\ngot: %s", wantDetail, diags[0].Description().Detail) } From cacc5dffa2a2aeeb2906c337384bebf8ee0da0e8 Mon Sep 17 00:00:00 2001 From: Mark DeCrane Date: Thu, 23 May 2024 11:04:42 -0400 Subject: [PATCH 112/161] DRY up the code --- internal/initwd/module_install.go | 83 ++++++++++++------------------- 1 file changed, 31 insertions(+), 52 deletions(-) diff --git a/internal/initwd/module_install.go b/internal/initwd/module_install.go index f7dbd5eece..219d10c988 100644 --- a/internal/initwd/module_install.go +++ b/internal/initwd/module_install.go @@ -287,32 +287,7 @@ func (i *ModuleInstaller) moduleInstallWalker(ctx context.Context, manifest mods vm, _ := version.NewVersion(modVersion.Version) if vm.Equal(record.Version) { if modVersion.Deprecation != nil { - var additionalInfo []string - if modVersion.Deprecation.Reason != "" { - additionalInfo = append(additionalInfo, modVersion.Deprecation.Reason) - } - if modVersion.Deprecation.Link != "" { - additionalInfo = append(additionalInfo, fmt.Sprintf("More information: %s", modVersion.Deprecation.Link)) - } - var detail string - if len(additionalInfo) == 1 { - detail = additionalInfo[0] - } else { - detail = strings.Join(additionalInfo, "\n\n") - } - diags = append(diags, &hcl.Diagnostic{ - Severity: hcl.DiagWarning, - Summary: fmt.Sprintf("Module version %s of %s is deprecated", modVersion.Version, req.Name), - Detail: detail, - Subject: req.CallRange.Ptr(), - Extra: &ModuleVersionDeprecationDiagnosticExtra{ - Type: TypeModuleVersionDeprecation, - Version: modVersion.Version, - SourceName: req.Name, - DeprecationMessage: modVersion.Deprecation.Reason, - Link: modVersion.Deprecation.Link, - }, - }) + diags = append(diags, buildModuleVersionDeprecationWarning(modVersion, req)) } break found } @@ -641,32 +616,7 @@ func (i *ModuleInstaller) installRegistryModule(ctx context.Context, req *config } if latestMatch.Deprecation != nil { - var additionalInfo []string - if latestMatch.Deprecation.Reason != "" { - additionalInfo = append(additionalInfo, latestMatch.Deprecation.Reason) - } - if latestMatch.Deprecation.Link != "" { - additionalInfo = append(additionalInfo, fmt.Sprintf("More information: %s", latestMatch.Deprecation.Link)) - } - var detail string - if len(additionalInfo) == 1 { - detail = additionalInfo[0] - } else { - detail = strings.Join(additionalInfo, "\n\n") - } - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagWarning, - Summary: fmt.Sprintf("Module version %s of %s is deprecated", latestMatch.Version, req.Name), - Detail: detail, - Subject: req.CallRange.Ptr(), - Extra: &ModuleVersionDeprecationDiagnosticExtra{ - Type: TypeModuleVersionDeprecation, - Version: latestMatch.Version, - SourceName: req.Name, - DeprecationMessage: latestMatch.Deprecation.Reason, - Link: latestMatch.Deprecation.Link, - }, - }) + diags = diags.Append(buildModuleVersionDeprecationWarning(latestMatch, req)) } // Report up to the caller that we're about to start downloading. @@ -1034,3 +984,32 @@ func splitAddrSubdir(addr addrs.ModuleSource) (string, string) { return addr.String(), "" } } + +func buildModuleVersionDeprecationWarning(modVersion *response.ModuleVersion, req *configs.ModuleRequest) *hcl.Diagnostic { + var additionalInfo []string + if modVersion.Deprecation.Reason != "" { + additionalInfo = append(additionalInfo, modVersion.Deprecation.Reason) + } + if modVersion.Deprecation.Link != "" { + additionalInfo = append(additionalInfo, fmt.Sprintf("More information: %s", modVersion.Deprecation.Link)) + } + var detail string + if len(additionalInfo) == 1 { + detail = additionalInfo[0] + } else { + detail = strings.Join(additionalInfo, "\n\n") + } + return &hcl.Diagnostic{ + Severity: hcl.DiagWarning, + Summary: fmt.Sprintf("Module version %s of %s is deprecated", modVersion.Version, req.Name), + Detail: detail, + Subject: req.CallRange.Ptr(), + Extra: &ModuleVersionDeprecationDiagnosticExtra{ + Type: TypeModuleVersionDeprecation, + Version: modVersion.Version, + SourceName: req.Name, + DeprecationMessage: modVersion.Deprecation.Reason, + Link: modVersion.Deprecation.Link, + }, + } +} From 1368c93862d046729782fc91107ce683191be0c3 Mon Sep 17 00:00:00 2001 From: Mark DeCrane Date: Thu, 23 May 2024 12:10:49 -0400 Subject: [PATCH 113/161] Add godoc comments related to portions pertaining to public API --- internal/initwd/module_install.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/internal/initwd/module_install.go b/internal/initwd/module_install.go index 219d10c988..f56af16c5b 100644 --- a/internal/initwd/module_install.go +++ b/internal/initwd/module_install.go @@ -49,10 +49,15 @@ type moduleVersion struct { version string } +// TypeModuleVersionDeprecation is a constant of TypeDiagnosticExtra indicating +// that a Warning is related to a deprecated module version is in use. type TypeDiagnosticExtra string const TypeModuleVersionDeprecation = "module_version_deprecation" +// ModuleVersionDeprecationDiagnosticExtra holds the diagnostic information +// about the deprecation of a module version. This ends up being serialized as extra data within a +// diagnostic and should be considered public API. type ModuleVersionDeprecationDiagnosticExtra struct { Type TypeDiagnosticExtra `json:"type"` Version string `json:"version"` @@ -61,6 +66,7 @@ type ModuleVersionDeprecationDiagnosticExtra struct { Link string `json:"link"` } +// IsPublic confirms the visibility of the extra field in the public API. func (m ModuleVersionDeprecationDiagnosticExtra) IsPublic() { // NOP } From 7dd73600076f942118a48a8fbe215aee515708ee Mon Sep 17 00:00:00 2001 From: Mark DeCrane Date: Thu, 23 May 2024 12:19:40 -0400 Subject: [PATCH 114/161] Use package addr instead of mod name in warning, promote failed registry call log message to WARN --- internal/initwd/module_install.go | 14 +++++++------- internal/initwd/module_install_test.go | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/internal/initwd/module_install.go b/internal/initwd/module_install.go index f56af16c5b..8d54b79b53 100644 --- a/internal/initwd/module_install.go +++ b/internal/initwd/module_install.go @@ -61,7 +61,7 @@ const TypeModuleVersionDeprecation = "module_version_deprecation" type ModuleVersionDeprecationDiagnosticExtra struct { Type TypeDiagnosticExtra `json:"type"` Version string `json:"version"` - SourceName string `json:"source_name"` + SourceAddr string `json:"source_name"` DeprecationMessage string `json:"deprecation_message"` Link string `json:"link"` } @@ -284,7 +284,7 @@ func (i *ModuleInstaller) moduleInstallWalker(ctx context.Context, manifest mods regsrcAddr := regsrc.ModuleFromRegistryPackageAddr(addr.Package) resp, err := regClient.ModuleVersions(ctx, regsrcAddr) if err != nil { - log.Printf("[DEBUG] Deprecation for %s could not be checked: call to registry failed: %v", addr.Package.Namespace, err) + log.Printf("[WARN] Deprecation for %s could not be checked: call to registry failed: %v", addr.Package.String(), err) } else { found: @@ -293,7 +293,7 @@ func (i *ModuleInstaller) moduleInstallWalker(ctx context.Context, manifest mods vm, _ := version.NewVersion(modVersion.Version) if vm.Equal(record.Version) { if modVersion.Deprecation != nil { - diags = append(diags, buildModuleVersionDeprecationWarning(modVersion, req)) + diags = append(diags, buildModuleVersionDeprecationWarning(modVersion, req, addr.Package.String())) } break found } @@ -622,7 +622,7 @@ func (i *ModuleInstaller) installRegistryModule(ctx context.Context, req *config } if latestMatch.Deprecation != nil { - diags = diags.Append(buildModuleVersionDeprecationWarning(latestMatch, req)) + diags = diags.Append(buildModuleVersionDeprecationWarning(latestMatch, req, addr.Package.String())) } // Report up to the caller that we're about to start downloading. @@ -991,7 +991,7 @@ func splitAddrSubdir(addr addrs.ModuleSource) (string, string) { } } -func buildModuleVersionDeprecationWarning(modVersion *response.ModuleVersion, req *configs.ModuleRequest) *hcl.Diagnostic { +func buildModuleVersionDeprecationWarning(modVersion *response.ModuleVersion, req *configs.ModuleRequest, packageAddr string) *hcl.Diagnostic { var additionalInfo []string if modVersion.Deprecation.Reason != "" { additionalInfo = append(additionalInfo, modVersion.Deprecation.Reason) @@ -1007,13 +1007,13 @@ func buildModuleVersionDeprecationWarning(modVersion *response.ModuleVersion, re } return &hcl.Diagnostic{ Severity: hcl.DiagWarning, - Summary: fmt.Sprintf("Module version %s of %s is deprecated", modVersion.Version, req.Name), + Summary: fmt.Sprintf("Module version %s of %s is deprecated", modVersion.Version, packageAddr), Detail: detail, Subject: req.CallRange.Ptr(), Extra: &ModuleVersionDeprecationDiagnosticExtra{ Type: TypeModuleVersionDeprecation, Version: modVersion.Version, - SourceName: req.Name, + SourceAddr: packageAddr, DeprecationMessage: modVersion.Deprecation.Reason, Link: modVersion.Deprecation.Link, }, diff --git a/internal/initwd/module_install_test.go b/internal/initwd/module_install_test.go index 083d61d0b8..81ba5c6bf8 100644 --- a/internal/initwd/module_install_test.go +++ b/internal/initwd/module_install_test.go @@ -651,7 +651,7 @@ func TestLoaderInstallModules_registry_deprecated(t *testing.T) { t.Fatal("expected warning") } else { assertDiagnosticCount(t, diags, 1) - assertDiagnosticSummary(t, diags, "Module version 0.0.1 of setup is deprecated") + assertDiagnosticSummary(t, diags, "Module version 0.0.1 of registry.terraform.io/hashicorp/module-installer-acctest/aws is deprecated") wantDetail := "This module version is deprecated\n\nMore information: https://example.com/deprecation" if diags[0].Description().Detail != wantDetail { From 75950a4681ec9ac37c9af2d90660247e848555a1 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Thu, 23 May 2024 14:41:57 -0400 Subject: [PATCH 115/161] update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0222ee414d..3a74171697 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ ENHANCEMENTS: * `terraform console`: Now has basic support for multi-line input in interactive mode. ([#34822](https://github.com/hashicorp/terraform/pull/34822)) If an entered line contains opening parentheses/etc that are not closed, Terraform will await another line of input to complete the expression. This initial implementation is primarily intended to support pasting in multi-line expressions from elsewhere, rather than for manual multi-line editing, so the interactive editing support is currently limited. * cli: Reduced copying of state to improve performance with larges numbers of resources. [GH-35164] +* `removed` blocks can now declare destroy-time provisioners which will be executed when the associated resource instances are destroyed. [GH-35230] BUG FIXES: From 64f385fbb12bd24444c2945e255b31e4ba86dc7a Mon Sep 17 00:00:00 2001 From: Mark DeCrane Date: Thu, 23 May 2024 15:27:18 -0400 Subject: [PATCH 116/161] Apply suggestions from @nfagerlund code review Co-authored-by: Nick Fagerlund --- internal/initwd/module_install.go | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/internal/initwd/module_install.go b/internal/initwd/module_install.go index 8d54b79b53..796837b94d 100644 --- a/internal/initwd/module_install.go +++ b/internal/initwd/module_install.go @@ -53,7 +53,7 @@ type moduleVersion struct { // that a Warning is related to a deprecated module version is in use. type TypeDiagnosticExtra string -const TypeModuleVersionDeprecation = "module_version_deprecation" +const TypeModuleVersionDeprecation TypeDiagnosticExtra = "module_version_deprecation" // ModuleVersionDeprecationDiagnosticExtra holds the diagnostic information // about the deprecation of a module version. This ends up being serialized as extra data within a @@ -999,12 +999,7 @@ func buildModuleVersionDeprecationWarning(modVersion *response.ModuleVersion, re if modVersion.Deprecation.Link != "" { additionalInfo = append(additionalInfo, fmt.Sprintf("More information: %s", modVersion.Deprecation.Link)) } - var detail string - if len(additionalInfo) == 1 { - detail = additionalInfo[0] - } else { - detail = strings.Join(additionalInfo, "\n\n") - } + detail := strings.Join(additionalInfo, "\n\n") return &hcl.Diagnostic{ Severity: hcl.DiagWarning, Summary: fmt.Sprintf("Module version %s of %s is deprecated", modVersion.Version, packageAddr), From d2b4ab7250a53407ecfc437d3cb13c03c7634a4a Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Fri, 24 May 2024 08:39:20 +0200 Subject: [PATCH 117/161] deferred actions: remove resource graph (#35235) * deferred actions: remove resource graph * improve comments given recent changes --- internal/plans/deferring/deferred.go | 52 ++++--------- internal/plans/deferring/deferred_test.go | 73 ++++++++++--------- internal/terraform/context_walk.go | 12 +-- .../node_resource_abstract_instance_test.go | 6 +- .../terraform/node_resource_plan_instance.go | 2 +- 5 files changed, 59 insertions(+), 86 deletions(-) diff --git a/internal/plans/deferring/deferred.go b/internal/plans/deferring/deferred.go index ccd9d3494f..c78d71b47d 100644 --- a/internal/plans/deferring/deferred.go +++ b/internal/plans/deferring/deferred.go @@ -15,24 +15,8 @@ import ( // Deferred keeps track of deferrals that have already happened, to help // guide decisions about whether downstream operations might also need to be -// deferred, and to provide some placeholder data for performing downstream -// checks against the subset of data we know despite the deferrals. -// -// This type only tracks information about object types that can _cause_ -// deferred changes. Everything in the language can be _affected_ by deferred -// changes, such as by referring to an object whose changes were deferred or -// being declared in a module that was only partially-expanded, but we track -// the information about the other object types in other locations that are -// thematically closer to the type of object in question. +// deferred. type Deferred struct { - // resourceGraph is provided by the caller when instantiating a [Deferred], - // and describes the dependency relationships between the static resource - // declarations in the configuration. - // - // We use this as part of the rules for deciding whether a downstream - // resource instance that could potentially be planned should be deferred - // anyway due to its dependencies not yet being fully planned. - resourceGraph addrs.DirectedGraph[addrs.ConfigResource] // deferralAllowed marks whether deferred actions are supported by the // current runtime. At time of writing, the modules runtime does not support @@ -118,15 +102,11 @@ type Deferred struct { partialExpandedModulesDeferred addrs.Set[addrs.PartialExpandedModule] } -// NewDeferred constructs a new [Deferred] that assumes that the given resource -// graph accurately describes all of the dependencies between static resource -// blocks in the configuration. -// -// Callers must not modify anything reachable through resourceGraph after -// calling this function. -func NewDeferred(resourceGraph addrs.DirectedGraph[addrs.ConfigResource], enabled bool) *Deferred { +// NewDeferred constructs a new empty [Deferred] object. The enabled argument +// controls whether the receiver will actually track any deferrals. If false, +// all methods will return false and no deferrals will be recorded. +func NewDeferred(enabled bool) *Deferred { return &Deferred{ - resourceGraph: resourceGraph, deferralAllowed: enabled, resourceInstancesDeferred: addrs.MakeMap[addrs.ConfigResource, addrs.Map[addrs.AbsResourceInstance, *plans.DeferredResourceInstanceChange]](), dataSourceInstancesDeferred: addrs.MakeMap[addrs.ConfigResource, addrs.Set[addrs.AbsResourceInstance]](), @@ -237,9 +217,14 @@ func (d *Deferred) IsResourceInstanceDeferred(addr addrs.AbsResourceInstance) bo // It's invalid to call this method for an address that was already reported // as deferred using [Deferred.ReportResourceInstanceDeferred], and so this // method will panic in that case. Callers should always test whether a resource -// instance action should be deferred _before_ reporting that it has been by calling -// [Deferred.IsResourceInstanceDeferred]. -func (d *Deferred) ShouldDeferResourceInstanceChanges(addr addrs.AbsResourceInstance) bool { +// instance action should be deferred _before_ reporting that it has been by +// calling [Deferred.IsResourceInstanceDeferred]. +// +// The deps argument should be the set of configuration blocks that the given +// resource instance depends on. This is then compared against the set of +// deferred resources to determine if the given resource instance should be +// deferred. +func (d *Deferred) ShouldDeferResourceInstanceChanges(addr addrs.AbsResourceInstance, deps []addrs.ConfigResource) bool { if !d.deferralAllowed { return false } @@ -265,7 +250,7 @@ func (d *Deferred) ShouldDeferResourceInstanceChanges(addr addrs.AbsResourceInst return false } - // Our resource graph describes relationships between the static resource + // For now, we simply track relationships between static resource // configuration blocks, not their dynamic instances, so we need to start // with the config address that the given instance belongs to. configAddr := addr.ConfigResource() @@ -278,13 +263,6 @@ func (d *Deferred) ShouldDeferResourceInstanceChanges(addr addrs.AbsResourceInst panic(fmt.Sprintf("checking whether %s should be deferred when it was already deferred", addr)) } - // We use DirectDependenciesOf rather than TransitiveDependenciesOf because - // the reports to this object are driven by the modules runtime's existing - // graph walk and so all of our direct dependencies should already have - // had the opportunity to report themselves as deferred by the time this - // question is being asked. - configDeps := d.resourceGraph.DirectDependenciesOf(configAddr) - // For this initial implementation we're taking the shortcut of assuming // that all of the configDeps are required. It would be better to do a // more precise analysis that takes into account how data could possibly @@ -305,7 +283,7 @@ func (d *Deferred) ShouldDeferResourceInstanceChanges(addr addrs.AbsResourceInst // depending on an object for another instance, but we'll need to make sure // any additional logic here is well-reasoned to avoid violating dependency // invariants.) - for _, configDep := range configDeps { + for _, configDep := range deps { if d.resourceInstancesDeferred.Has(configDep) || d.dataSourceInstancesDeferred.Has(configDep) { // For now we don't consider exactly which instances of that // configuration block were deferred; there being at least diff --git a/internal/plans/deferring/deferred_test.go b/internal/plans/deferring/deferred_test.go index 531501f784..729de3da74 100644 --- a/internal/plans/deferring/deferred_test.go +++ b/internal/plans/deferring/deferred_test.go @@ -14,11 +14,7 @@ import ( ) func TestDeferred_externalDependency(t *testing.T) { - // The resource graph is irrelevant for this case, because we're going to - // defer any resource instance changes regardless. Therefore an empty - // graph is just fine. - resourceGraph := addrs.NewDirectedGraph[addrs.ConfigResource]() - deferred := NewDeferred(resourceGraph, true) + deferred := NewDeferred(true) // This reports that something outside of the modules runtime knows that // everything in this configuration depends on some elsewhere-action @@ -37,7 +33,7 @@ func TestDeferred_externalDependency(t *testing.T) { Name: "really-anything", }, }, - }) + }, nil) if !got { t.Errorf("did not report that the instance should have its changes deferred; should have") } @@ -75,16 +71,19 @@ func TestDeferred_absResourceInstanceDeferred(t *testing.T) { }, } - resourceGraph := addrs.NewDirectedGraph[addrs.ConfigResource]() - resourceGraph.AddDependency(instCAddr.ConfigResource(), instBAddr.ConfigResource()) - resourceGraph.AddDependency(instCAddr.ConfigResource(), instAAddr.ConfigResource()) - deferred := NewDeferred(resourceGraph, true) + dependencies := addrs.MakeMap[addrs.ConfigResource, []addrs.ConfigResource]( + addrs.MapElem[addrs.ConfigResource, []addrs.ConfigResource]{ + Key: instCAddr.ConfigResource(), + Value: []addrs.ConfigResource{instBAddr.ConfigResource(), instAAddr.ConfigResource()}, + }) + + deferred := NewDeferred(true) // Before we report anything, all three addresses should indicate that // they don't need to have their actions deferred. t.Run("without any deferrals yet", func(t *testing.T) { for _, instAddr := range []addrs.AbsResourceInstance{instAAddr, instBAddr, instCAddr} { - if deferred.ShouldDeferResourceInstanceChanges(instAddr) { + if deferred.ShouldDeferResourceInstanceChanges(instAddr, dependencies.Get(instAddr.ConfigResource())) { t.Errorf("%s reported as needing deferred; should not be, yet", instAddr) } } @@ -100,10 +99,10 @@ func TestDeferred_absResourceInstanceDeferred(t *testing.T) { }) t.Run("with one resource instance deferred", func(t *testing.T) { - if !deferred.ShouldDeferResourceInstanceChanges(instCAddr) { + if !deferred.ShouldDeferResourceInstanceChanges(instCAddr, dependencies.Get(instCAddr.ConfigResource())) { t.Errorf("%s was not reported as needing deferred; should be deferred", instCAddr) } - if deferred.ShouldDeferResourceInstanceChanges(instBAddr) { + if deferred.ShouldDeferResourceInstanceChanges(instBAddr, dependencies.Get(instBAddr.ConfigResource())) { t.Errorf("%s reported as needing deferred; should not be", instCAddr) } }) @@ -141,16 +140,18 @@ func TestDeferred_absDataSourceInstanceDeferred(t *testing.T) { }, } - resourceGraph := addrs.NewDirectedGraph[addrs.ConfigResource]() - resourceGraph.AddDependency(instCAddr.ConfigResource(), instBAddr.ConfigResource()) - resourceGraph.AddDependency(instCAddr.ConfigResource(), instAAddr.ConfigResource()) - deferred := NewDeferred(resourceGraph, true) + dependencies := addrs.MakeMap[addrs.ConfigResource, []addrs.ConfigResource]( + addrs.MapElem[addrs.ConfigResource, []addrs.ConfigResource]{ + Key: instCAddr.ConfigResource(), + Value: []addrs.ConfigResource{instBAddr.ConfigResource(), instAAddr.ConfigResource()}, + }) + deferred := NewDeferred(true) // Before we report anything, all three addresses should indicate that // they don't need to have their actions deferred. t.Run("without any deferrals yet", func(t *testing.T) { for _, instAddr := range []addrs.AbsResourceInstance{instAAddr, instBAddr, instCAddr} { - if deferred.ShouldDeferResourceInstanceChanges(instAddr) { + if deferred.ShouldDeferResourceInstanceChanges(instAddr, dependencies.Get(instAddr.ConfigResource())) { t.Errorf("%s reported as needing deferred; should not be, yet", instAddr) } } @@ -160,10 +161,10 @@ func TestDeferred_absDataSourceInstanceDeferred(t *testing.T) { deferred.ReportDataSourceInstanceDeferred(instAAddr) t.Run("with one resource instance deferred", func(t *testing.T) { - if !deferred.ShouldDeferResourceInstanceChanges(instCAddr) { + if !deferred.ShouldDeferResourceInstanceChanges(instCAddr, dependencies.Get(instCAddr.ConfigResource())) { t.Errorf("%s was not reported as needing deferred; should be deferred", instCAddr) } - if deferred.ShouldDeferResourceInstanceChanges(instBAddr) { + if deferred.ShouldDeferResourceInstanceChanges(instBAddr, dependencies.Get(instBAddr.ConfigResource())) { t.Errorf("%s reported as needing deferred; should not be", instCAddr) } }) @@ -204,16 +205,18 @@ func TestDeferred_partialExpandedDatasource(t *testing.T) { UnexpandedChild(addrs.ModuleCall{Name: "foo"}). Resource(instAAddr.Resource.Resource) - resourceGraph := addrs.NewDirectedGraph[addrs.ConfigResource]() - resourceGraph.AddDependency(instCAddr.ConfigResource(), instBAddr.ConfigResource()) - resourceGraph.AddDependency(instCAddr.ConfigResource(), instAAddr.ConfigResource()) - deferred := NewDeferred(resourceGraph, true) + dependencies := addrs.MakeMap[addrs.ConfigResource, []addrs.ConfigResource]( + addrs.MapElem[addrs.ConfigResource, []addrs.ConfigResource]{ + Key: instCAddr.ConfigResource(), + Value: []addrs.ConfigResource{instBAddr.ConfigResource(), instAAddr.ConfigResource()}, + }) + deferred := NewDeferred(true) // Before we report anything, all three addresses should indicate that // they don't need to have their actions deferred. t.Run("without any deferrals yet", func(t *testing.T) { for _, instAddr := range []addrs.AbsResourceInstance{instAAddr, instBAddr, instCAddr} { - if deferred.ShouldDeferResourceInstanceChanges(instAddr) { + if deferred.ShouldDeferResourceInstanceChanges(instAddr, dependencies.Get(instAddr.ConfigResource())) { t.Errorf("%s reported as needing deferred; should not be, yet", instAddr) } } @@ -223,10 +226,10 @@ func TestDeferred_partialExpandedDatasource(t *testing.T) { deferred.ReportDataSourceExpansionDeferred(instAPartial) t.Run("with one resource instance deferred", func(t *testing.T) { - if !deferred.ShouldDeferResourceInstanceChanges(instCAddr) { + if !deferred.ShouldDeferResourceInstanceChanges(instCAddr, dependencies.Get(instCAddr.ConfigResource())) { t.Errorf("%s was not reported as needing deferred; should be deferred", instCAddr) } - if deferred.ShouldDeferResourceInstanceChanges(instBAddr) { + if deferred.ShouldDeferResourceInstanceChanges(instBAddr, dependencies.Get(instBAddr.ConfigResource())) { t.Errorf("%s reported as needing deferred; should not be", instCAddr) } }) @@ -268,16 +271,18 @@ func TestDeferred_partialExpandedResource(t *testing.T) { UnexpandedChild(addrs.ModuleCall{Name: "foo"}). Resource(instAAddr.Resource.Resource) - resourceGraph := addrs.NewDirectedGraph[addrs.ConfigResource]() - resourceGraph.AddDependency(instCAddr.ConfigResource(), instBAddr.ConfigResource()) - resourceGraph.AddDependency(instCAddr.ConfigResource(), instAAddr.ConfigResource()) - deferred := NewDeferred(resourceGraph, true) + dependencies := addrs.MakeMap[addrs.ConfigResource, []addrs.ConfigResource]( + addrs.MapElem[addrs.ConfigResource, []addrs.ConfigResource]{ + Key: instCAddr.ConfigResource(), + Value: []addrs.ConfigResource{instBAddr.ConfigResource(), instAAddr.ConfigResource()}, + }) + deferred := NewDeferred(true) // Before we report anything, all three addresses should indicate that // they don't need to have their actions deferred. t.Run("without any deferrals yet", func(t *testing.T) { for _, instAddr := range []addrs.AbsResourceInstance{instAAddr, instBAddr, instCAddr} { - if deferred.ShouldDeferResourceInstanceChanges(instAddr) { + if deferred.ShouldDeferResourceInstanceChanges(instAddr, dependencies.Get(instAddr.ConfigResource())) { t.Errorf("%s reported as needing deferred; should not be, yet", instAddr) } } @@ -293,10 +298,10 @@ func TestDeferred_partialExpandedResource(t *testing.T) { }) t.Run("with one resource instance deferred", func(t *testing.T) { - if !deferred.ShouldDeferResourceInstanceChanges(instCAddr) { + if !deferred.ShouldDeferResourceInstanceChanges(instCAddr, dependencies.Get(instCAddr.ConfigResource())) { t.Errorf("%s was not reported as needing deferred; should be deferred", instCAddr) } - if deferred.ShouldDeferResourceInstanceChanges(instBAddr) { + if deferred.ShouldDeferResourceInstanceChanges(instBAddr, dependencies.Get(instBAddr.ConfigResource())) { t.Errorf("%s reported as needing deferred; should not be", instCAddr) } }) diff --git a/internal/terraform/context_walk.go b/internal/terraform/context_walk.go index 8bc78481a0..4cf70b6769 100644 --- a/internal/terraform/context_walk.go +++ b/internal/terraform/context_walk.go @@ -168,17 +168,7 @@ func (c *Context) graphWalker(graph *Graph, operation walkOperation, opts *graph } } - var resourceGraph addrs.DirectedGraph[addrs.ConfigResource] - if opts.DeferralAllowed && (operation == walkPlan || operation == walkPlanDestroy) { - // We'll produce a derived graph that only includes the static resource - // blocks, since we need that for deferral tracking. - resourceGraph = graph.ResourceGraph() - } else { - // Temporary (hopefully) optimization: skip building the expensive resource graph. - resourceGraph = addrs.NewDirectedGraph[addrs.ConfigResource]() - } - - deferred := deferring.NewDeferred(resourceGraph, opts.DeferralAllowed) + deferred := deferring.NewDeferred(opts.DeferralAllowed) if opts.ExternalDependencyDeferred { deferred.SetExternalDependencyDeferred() } diff --git a/internal/terraform/node_resource_abstract_instance_test.go b/internal/terraform/node_resource_abstract_instance_test.go index 3002cb4c84..79810b81a1 100644 --- a/internal/terraform/node_resource_abstract_instance_test.go +++ b/internal/terraform/node_resource_abstract_instance_test.go @@ -7,13 +7,14 @@ import ( "fmt" "testing" + "github.com/zclconf/go-cty/cty" + "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/configs" "github.com/hashicorp/terraform/internal/configs/configschema" "github.com/hashicorp/terraform/internal/plans/deferring" "github.com/hashicorp/terraform/internal/providers" "github.com/hashicorp/terraform/internal/states" - "github.com/zclconf/go-cty/cty" ) func TestNodeAbstractResourceInstanceProvider(t *testing.T) { @@ -229,8 +230,7 @@ func TestNodeAbstractResourceInstance_refresh_with_deferred_read(t *testing.T) { } evalCtx.ProviderProvider = mockProvider evalCtx.ProviderSchemaSchema = mockProvider.GetProviderSchema() - resourceGraph := addrs.NewDirectedGraph[addrs.ConfigResource]() - evalCtx.DeferralsState = deferring.NewDeferred(resourceGraph, true) + evalCtx.DeferralsState = deferring.NewDeferred(true) rio, deferred, diags := node.refresh(evalCtx, states.NotDeposed, obj, true) if diags.HasErrors() { diff --git a/internal/terraform/node_resource_plan_instance.go b/internal/terraform/node_resource_plan_instance.go index 814325119b..e8f314e452 100644 --- a/internal/terraform/node_resource_plan_instance.go +++ b/internal/terraform/node_resource_plan_instance.go @@ -311,7 +311,7 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext) // refresh or planning stage. We'll report the deferral and // store what we could produce in the deferral tracker. deferrals.ReportResourceInstanceDeferred(addr, deferred.Reason, change) - } else if !deferrals.ShouldDeferResourceInstanceChanges(n.Addr) { + } else if !deferrals.ShouldDeferResourceInstanceChanges(n.Addr, n.Dependencies) { // We intentionally write the change before the subsequent checks, because // all of the checks below this point are for problems caused by the // context surrounding the change, rather than the change itself, and From 91c88f4705cc61712866eec34cf12af475042db2 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Fri, 17 May 2024 17:48:55 -0700 Subject: [PATCH 118/161] go.mod: go get github.com/apparentlymart/go-versions@v1.0.2 This includes a fix in the handling of conflicting constraints referring to prereleases, like "1.0.0-beta.1, !1.0.0-beta.1". Previously the library would incorrectly treat that as a positive match, rather than having the negative override the positive as happens in all other cases. --- go.mod | 2 +- go.sum | 4 ++-- internal/backend/remote-state/azure/go.mod | 2 +- internal/backend/remote-state/azure/go.sum | 4 ++-- internal/backend/remote-state/consul/go.mod | 2 +- internal/backend/remote-state/consul/go.sum | 4 ++-- internal/backend/remote-state/cos/go.mod | 2 +- internal/backend/remote-state/cos/go.sum | 4 ++-- internal/backend/remote-state/gcs/go.mod | 2 +- internal/backend/remote-state/gcs/go.sum | 4 ++-- internal/backend/remote-state/kubernetes/go.mod | 2 +- internal/backend/remote-state/kubernetes/go.sum | 4 ++-- internal/backend/remote-state/oss/go.mod | 2 +- internal/backend/remote-state/oss/go.sum | 4 ++-- internal/backend/remote-state/pg/go.mod | 2 +- internal/backend/remote-state/pg/go.sum | 4 ++-- internal/backend/remote-state/s3/go.mod | 2 +- internal/backend/remote-state/s3/go.sum | 4 ++-- internal/legacy/go.mod | 2 +- internal/legacy/go.sum | 4 ++-- 20 files changed, 30 insertions(+), 30 deletions(-) diff --git a/go.mod b/go.mod index ec4402ad2e..027a6c7b44 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/apparentlymart/go-cidr v1.1.0 github.com/apparentlymart/go-shquot v0.0.1 github.com/apparentlymart/go-userdirs v0.0.0-20200915174352-b0c018a67c13 - github.com/apparentlymart/go-versions v1.0.1 + github.com/apparentlymart/go-versions v1.0.2 github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2 github.com/bgentry/speakeasy v0.1.0 github.com/bmatcuk/doublestar v1.1.5 diff --git a/go.sum b/go.sum index 3e97d6c83c..f677a830a4 100644 --- a/go.sum +++ b/go.sum @@ -287,8 +287,8 @@ github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= github.com/apparentlymart/go-userdirs v0.0.0-20200915174352-b0c018a67c13 h1:JtuelWqyixKApmXm3qghhZ7O96P6NKpyrlSIe8Rwnhw= github.com/apparentlymart/go-userdirs v0.0.0-20200915174352-b0c018a67c13/go.mod h1:7kfpUbyCdGJ9fDRCp3fopPQi5+cKNHgTE4ZuNrO71Cw= -github.com/apparentlymart/go-versions v1.0.1 h1:ECIpSn0adcYNsBfSRwdDdz9fWlL+S/6EUd9+irwkBgU= -github.com/apparentlymart/go-versions v1.0.1/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= +github.com/apparentlymart/go-versions v1.0.2 h1:n5Gg9YvSLK8Zzpy743J7abh2jt7z7ammOQ0oTd/5oA4= +github.com/apparentlymart/go-versions v1.0.2/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2 h1:7Ip0wMmLHLRJdrloDxZfhMm0xrLXZS8+COSu2bXmEQs= github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= diff --git a/internal/backend/remote-state/azure/go.mod b/internal/backend/remote-state/azure/go.mod index 4d2a8ecbd6..13d4712091 100644 --- a/internal/backend/remote-state/azure/go.mod +++ b/internal/backend/remote-state/azure/go.mod @@ -24,7 +24,7 @@ require ( github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect - github.com/apparentlymart/go-versions v1.0.1 // indirect + github.com/apparentlymart/go-versions v1.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dimchansky/utfbom v1.1.1 // indirect github.com/fatih/color v1.16.0 // indirect diff --git a/internal/backend/remote-state/azure/go.sum b/internal/backend/remote-state/azure/go.sum index 87c5e7e0bb..7932450f9c 100644 --- a/internal/backend/remote-state/azure/go.sum +++ b/internal/backend/remote-state/azure/go.sum @@ -91,8 +91,8 @@ github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3 h1:ZSTrOEhi github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= -github.com/apparentlymart/go-versions v1.0.1 h1:ECIpSn0adcYNsBfSRwdDdz9fWlL+S/6EUd9+irwkBgU= -github.com/apparentlymart/go-versions v1.0.1/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= +github.com/apparentlymart/go-versions v1.0.2 h1:n5Gg9YvSLK8Zzpy743J7abh2jt7z7ammOQ0oTd/5oA4= +github.com/apparentlymart/go-versions v1.0.2/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= github.com/aws/aws-sdk-go v1.44.122 h1:p6mw01WBaNpbdP2xrisz5tIkcNwzj/HysobNoaAHjgo= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= diff --git a/internal/backend/remote-state/consul/go.mod b/internal/backend/remote-state/consul/go.mod index da1c255bc7..09adf890d2 100644 --- a/internal/backend/remote-state/consul/go.mod +++ b/internal/backend/remote-state/consul/go.mod @@ -12,7 +12,7 @@ require ( require ( github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect - github.com/apparentlymart/go-versions v1.0.1 // indirect + github.com/apparentlymart/go-versions v1.0.2 // indirect github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/fatih/color v1.16.0 // indirect diff --git a/internal/backend/remote-state/consul/go.sum b/internal/backend/remote-state/consul/go.sum index c3cb85599f..16864c2857 100644 --- a/internal/backend/remote-state/consul/go.sum +++ b/internal/backend/remote-state/consul/go.sum @@ -54,8 +54,8 @@ github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3 h1:ZSTrOEhi github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= -github.com/apparentlymart/go-versions v1.0.1 h1:ECIpSn0adcYNsBfSRwdDdz9fWlL+S/6EUd9+irwkBgU= -github.com/apparentlymart/go-versions v1.0.1/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= +github.com/apparentlymart/go-versions v1.0.2 h1:n5Gg9YvSLK8Zzpy743J7abh2jt7z7ammOQ0oTd/5oA4= +github.com/apparentlymart/go-versions v1.0.2/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= diff --git a/internal/backend/remote-state/cos/go.mod b/internal/backend/remote-state/cos/go.mod index 74a2c545f3..d8325c16a9 100644 --- a/internal/backend/remote-state/cos/go.mod +++ b/internal/backend/remote-state/cos/go.mod @@ -14,7 +14,7 @@ require ( require ( github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect - github.com/apparentlymart/go-versions v1.0.1 // indirect + github.com/apparentlymart/go-versions v1.0.2 // indirect github.com/clbanning/mxj v1.8.4 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/google/go-cmp v0.6.0 // indirect diff --git a/internal/backend/remote-state/cos/go.sum b/internal/backend/remote-state/cos/go.sum index 0f7898843b..c0bca7562a 100644 --- a/internal/backend/remote-state/cos/go.sum +++ b/internal/backend/remote-state/cos/go.sum @@ -55,8 +55,8 @@ github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3 h1:ZSTrOEhi github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= -github.com/apparentlymart/go-versions v1.0.1 h1:ECIpSn0adcYNsBfSRwdDdz9fWlL+S/6EUd9+irwkBgU= -github.com/apparentlymart/go-versions v1.0.1/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= +github.com/apparentlymart/go-versions v1.0.2 h1:n5Gg9YvSLK8Zzpy743J7abh2jt7z7ammOQ0oTd/5oA4= +github.com/apparentlymart/go-versions v1.0.2/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= github.com/aws/aws-sdk-go v1.44.122 h1:p6mw01WBaNpbdP2xrisz5tIkcNwzj/HysobNoaAHjgo= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= diff --git a/internal/backend/remote-state/gcs/go.mod b/internal/backend/remote-state/gcs/go.mod index d8a68da74e..b71b82f0eb 100644 --- a/internal/backend/remote-state/gcs/go.mod +++ b/internal/backend/remote-state/gcs/go.mod @@ -20,7 +20,7 @@ require ( cloud.google.com/go/iam v1.1.1 // indirect github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect - github.com/apparentlymart/go-versions v1.0.1 // indirect + github.com/apparentlymart/go-versions v1.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect diff --git a/internal/backend/remote-state/gcs/go.sum b/internal/backend/remote-state/gcs/go.sum index bf7bb6a9a6..cf30a0a74f 100644 --- a/internal/backend/remote-state/gcs/go.sum +++ b/internal/backend/remote-state/gcs/go.sum @@ -57,8 +57,8 @@ github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3 h1:ZSTrOEhi github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= -github.com/apparentlymart/go-versions v1.0.1 h1:ECIpSn0adcYNsBfSRwdDdz9fWlL+S/6EUd9+irwkBgU= -github.com/apparentlymart/go-versions v1.0.1/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= +github.com/apparentlymart/go-versions v1.0.2 h1:n5Gg9YvSLK8Zzpy743J7abh2jt7z7ammOQ0oTd/5oA4= +github.com/apparentlymart/go-versions v1.0.2/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= github.com/aws/aws-sdk-go v1.44.122 h1:p6mw01WBaNpbdP2xrisz5tIkcNwzj/HysobNoaAHjgo= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= diff --git a/internal/backend/remote-state/kubernetes/go.mod b/internal/backend/remote-state/kubernetes/go.mod index dbce729294..1a454126b2 100644 --- a/internal/backend/remote-state/kubernetes/go.mod +++ b/internal/backend/remote-state/kubernetes/go.mod @@ -25,7 +25,7 @@ require ( github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect - github.com/apparentlymart/go-versions v1.0.1 // indirect + github.com/apparentlymart/go-versions v1.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/emicklei/go-restful/v3 v3.8.0 // indirect github.com/go-logr/logr v1.4.1 // indirect diff --git a/internal/backend/remote-state/kubernetes/go.sum b/internal/backend/remote-state/kubernetes/go.sum index 155e5d465a..b00d361b11 100644 --- a/internal/backend/remote-state/kubernetes/go.sum +++ b/internal/backend/remote-state/kubernetes/go.sum @@ -74,8 +74,8 @@ github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3 h1:ZSTrOEhi github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= -github.com/apparentlymart/go-versions v1.0.1 h1:ECIpSn0adcYNsBfSRwdDdz9fWlL+S/6EUd9+irwkBgU= -github.com/apparentlymart/go-versions v1.0.1/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= +github.com/apparentlymart/go-versions v1.0.2 h1:n5Gg9YvSLK8Zzpy743J7abh2jt7z7ammOQ0oTd/5oA4= +github.com/apparentlymart/go-versions v1.0.2/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= github.com/aws/aws-sdk-go v1.44.122 h1:p6mw01WBaNpbdP2xrisz5tIkcNwzj/HysobNoaAHjgo= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= diff --git a/internal/backend/remote-state/oss/go.mod b/internal/backend/remote-state/oss/go.mod index 135bfc57d2..1c8461ed60 100644 --- a/internal/backend/remote-state/oss/go.mod +++ b/internal/backend/remote-state/oss/go.mod @@ -17,7 +17,7 @@ require ( require ( github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect - github.com/apparentlymart/go-versions v1.0.1 // indirect + github.com/apparentlymart/go-versions v1.0.2 // indirect github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/golang/protobuf v1.5.3 // indirect diff --git a/internal/backend/remote-state/oss/go.sum b/internal/backend/remote-state/oss/go.sum index ff88a5c99a..a9fe765aac 100644 --- a/internal/backend/remote-state/oss/go.sum +++ b/internal/backend/remote-state/oss/go.sum @@ -60,8 +60,8 @@ github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3 h1:ZSTrOEhi github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= -github.com/apparentlymart/go-versions v1.0.1 h1:ECIpSn0adcYNsBfSRwdDdz9fWlL+S/6EUd9+irwkBgU= -github.com/apparentlymart/go-versions v1.0.1/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= +github.com/apparentlymart/go-versions v1.0.2 h1:n5Gg9YvSLK8Zzpy743J7abh2jt7z7ammOQ0oTd/5oA4= +github.com/apparentlymart/go-versions v1.0.2/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= github.com/aws/aws-sdk-go v1.44.122 h1:p6mw01WBaNpbdP2xrisz5tIkcNwzj/HysobNoaAHjgo= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA= diff --git a/internal/backend/remote-state/pg/go.mod b/internal/backend/remote-state/pg/go.mod index f95e30fb03..d3349ee789 100644 --- a/internal/backend/remote-state/pg/go.mod +++ b/internal/backend/remote-state/pg/go.mod @@ -13,7 +13,7 @@ require ( require ( github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect - github.com/apparentlymart/go-versions v1.0.1 // indirect + github.com/apparentlymart/go-versions v1.0.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/hashicorp/go-slug v0.15.0 // indirect diff --git a/internal/backend/remote-state/pg/go.sum b/internal/backend/remote-state/pg/go.sum index f15dc34dd2..11c5801cdf 100644 --- a/internal/backend/remote-state/pg/go.sum +++ b/internal/backend/remote-state/pg/go.sum @@ -54,8 +54,8 @@ github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3 h1:ZSTrOEhi github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= -github.com/apparentlymart/go-versions v1.0.1 h1:ECIpSn0adcYNsBfSRwdDdz9fWlL+S/6EUd9+irwkBgU= -github.com/apparentlymart/go-versions v1.0.1/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= +github.com/apparentlymart/go-versions v1.0.2 h1:n5Gg9YvSLK8Zzpy743J7abh2jt7z7ammOQ0oTd/5oA4= +github.com/apparentlymart/go-versions v1.0.2/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= github.com/aws/aws-sdk-go v1.44.122 h1:p6mw01WBaNpbdP2xrisz5tIkcNwzj/HysobNoaAHjgo= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= diff --git a/internal/backend/remote-state/s3/go.mod b/internal/backend/remote-state/s3/go.mod index 27d818247b..1b413feca5 100644 --- a/internal/backend/remote-state/s3/go.mod +++ b/internal/backend/remote-state/s3/go.mod @@ -21,7 +21,7 @@ require ( require ( github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect - github.com/apparentlymart/go-versions v1.0.1 // indirect + github.com/apparentlymart/go-versions v1.0.2 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1 // indirect github.com/aws/aws-sdk-go-v2/config v1.27.7 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.7 // indirect diff --git a/internal/backend/remote-state/s3/go.sum b/internal/backend/remote-state/s3/go.sum index fb911e9d87..7874b68889 100644 --- a/internal/backend/remote-state/s3/go.sum +++ b/internal/backend/remote-state/s3/go.sum @@ -54,8 +54,8 @@ github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3 h1:ZSTrOEhi github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= -github.com/apparentlymart/go-versions v1.0.1 h1:ECIpSn0adcYNsBfSRwdDdz9fWlL+S/6EUd9+irwkBgU= -github.com/apparentlymart/go-versions v1.0.1/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= +github.com/apparentlymart/go-versions v1.0.2 h1:n5Gg9YvSLK8Zzpy743J7abh2jt7z7ammOQ0oTd/5oA4= +github.com/apparentlymart/go-versions v1.0.2/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= github.com/aws/aws-sdk-go v1.44.122 h1:p6mw01WBaNpbdP2xrisz5tIkcNwzj/HysobNoaAHjgo= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go-v2 v1.25.3 h1:xYiLpZTQs1mzvz5PaI6uR0Wh57ippuEthxS4iK5v0n0= diff --git a/internal/legacy/go.mod b/internal/legacy/go.mod index d814862288..a20cca02f6 100644 --- a/internal/legacy/go.mod +++ b/internal/legacy/go.mod @@ -17,7 +17,7 @@ require ( require ( github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect - github.com/apparentlymart/go-versions v1.0.1 // indirect + github.com/apparentlymart/go-versions v1.0.2 // indirect github.com/hashicorp/go-slug v0.15.0 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/hcl/v2 v2.20.0 // indirect diff --git a/internal/legacy/go.sum b/internal/legacy/go.sum index 73abb4f142..c3f8318f9c 100644 --- a/internal/legacy/go.sum +++ b/internal/legacy/go.sum @@ -54,8 +54,8 @@ github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3 h1:ZSTrOEhi github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= -github.com/apparentlymart/go-versions v1.0.1 h1:ECIpSn0adcYNsBfSRwdDdz9fWlL+S/6EUd9+irwkBgU= -github.com/apparentlymart/go-versions v1.0.1/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= +github.com/apparentlymart/go-versions v1.0.2 h1:n5Gg9YvSLK8Zzpy743J7abh2jt7z7ammOQ0oTd/5oA4= +github.com/apparentlymart/go-versions v1.0.2/go.mod h1:YF5j7IQtrOAOnsGkniupEA5bfCjzd7i14yu0shZavyM= github.com/aws/aws-sdk-go v1.44.122 h1:p6mw01WBaNpbdP2xrisz5tIkcNwzj/HysobNoaAHjgo= github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= From 4c92917ba3c94974478c35ad9a0c6e007e12ae33 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Fri, 24 May 2024 10:29:59 -0700 Subject: [PATCH 119/161] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a74171697..1958d286f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ BUG FIXES: * backend/s3: Fixed the digest value displayed for DynamoDB/S3 state checksum mismatches. ([#34387](https://github.com/hashicorp/terraform/issues/34387)) * `terraform test`: Fix bug in which non-Hashicorp providers required by testing modules and initialised within the test files were assigned incorrect registry addresses. ([#35161](https://github.com/hashicorp/terraform/issues/35161)) * config: The `templatefile` function no longer returns a "panic" error if the template file path is marked as sensitive. Instead, the template rendering result is also marked as sensitive. ([#35180](https://github.com/hashicorp/terraform/issues/35180)) +* `terraform init`: When selecting a version for a provider that has both positive and negative version constraints for the same prerelease -- e.g. `1.2.0-beta.1, !1.2.0-beta.1` -- the negative constraint will now overrule the positive, for consistency with how negative constraints are handled otherwise. Previously Terraform would incorrectly treat the positive as overriding the negative if the specified version was a prerelease. ([#35181](https://github.com/hashicorp/terraform/issues/35181)) UPGRADE NOTES: From 698caa7f9a3793794f101e26c427b6407b4e4d21 Mon Sep 17 00:00:00 2001 From: Alisdair McDiarmid Date: Fri, 24 May 2024 15:16:36 -0700 Subject: [PATCH 120/161] rpcapi: Allow stopping long-running operations The new Setup.Stop RPC allows clients to abort long-running operations. Each operation implementation must add itself to the server's stopper, and listen on the given channel for a signal to abort. In this commit, plan, apply, and validate operations translate the stop signal into a context cancellation. This alone is not yet sufficient for a truly graceful shutdown, so in later commits we need to adjust the stacks runtime to instruct the modules runtime to stop on cancellation. --- internal/rpcapi/plugin.go | 6 +- internal/rpcapi/server.go | 2 +- internal/rpcapi/setup.go | 25 +- internal/rpcapi/setup_test.go | 85 + internal/rpcapi/stacks.go | 43 +- internal/rpcapi/stacks_test.go | 6 +- internal/rpcapi/stopper.go | 57 + internal/rpcapi/telemetry_test.go | 2 +- internal/rpcapi/terraform1/terraform1.pb.go | 4613 ++++++++++--------- internal/rpcapi/terraform1/terraform1.proto | 11 + 10 files changed, 2628 insertions(+), 2222 deletions(-) create mode 100644 internal/rpcapi/setup_test.go create mode 100644 internal/rpcapi/stopper.go diff --git a/internal/rpcapi/plugin.go b/internal/rpcapi/plugin.go index f567c60152..f50c697103 100644 --- a/internal/rpcapi/plugin.go +++ b/internal/rpcapi/plugin.go @@ -45,7 +45,7 @@ func registerGRPCServices(s *grpc.Server, opts *serviceOpts) { terraform1.RegisterSetupServer(s, setup) } -func serverHandshake(s *grpc.Server, opts *serviceOpts) func(context.Context, *terraform1.Handshake_Request) (*terraform1.ServerCapabilities, error) { +func serverHandshake(s *grpc.Server, opts *serviceOpts) func(context.Context, *terraform1.Handshake_Request, *stopper) (*terraform1.ServerCapabilities, error) { dependencies := dynrpcserver.NewDependenciesStub() terraform1.RegisterDependenciesServer(s, dependencies) stacks := dynrpcserver.NewStacksStub() @@ -53,7 +53,7 @@ func serverHandshake(s *grpc.Server, opts *serviceOpts) func(context.Context, *t packages := dynrpcserver.NewPackagesStub() terraform1.RegisterPackagesServer(s, packages) - return func(ctx context.Context, request *terraform1.Handshake_Request) (*terraform1.ServerCapabilities, error) { + return func(ctx context.Context, request *terraform1.Handshake_Request, stopper *stopper) (*terraform1.ServerCapabilities, error) { // All of our servers will share a common handles table so that objects // can be passed from one service to another. handles := newHandleTable() @@ -79,7 +79,7 @@ func serverHandshake(s *grpc.Server, opts *serviceOpts) func(context.Context, *t // doing real work. In future the details of what we register here // might vary based on the negotiated capabilities. dependencies.ActivateRPCServer(newDependenciesServer(handles, services)) - stacks.ActivateRPCServer(newStacksServer(handles, opts)) + stacks.ActivateRPCServer(newStacksServer(stopper, handles, opts)) packages.ActivateRPCServer(newPackagesServer(services)) // If the client requested any extra capabililties that we're going diff --git a/internal/rpcapi/server.go b/internal/rpcapi/server.go index 1d03c80fab..630e36daa0 100644 --- a/internal/rpcapi/server.go +++ b/internal/rpcapi/server.go @@ -31,7 +31,7 @@ func ServePlugin(ctx context.Context, opts ServerOpts) error { plugin.Serve(&plugin.ServeConfig{ HandshakeConfig: handshake, VersionedPlugins: map[int]plugin.PluginSet{ - 1: plugin.PluginSet{ + 1: { "tfcore": &corePlugin{ experimentsAllowed: opts.ExperimentsAllowed, }, diff --git a/internal/rpcapi/setup.go b/internal/rpcapi/setup.go index 3f3a771aa8..328ef96f49 100644 --- a/internal/rpcapi/setup.go +++ b/internal/rpcapi/setup.go @@ -16,7 +16,7 @@ import ( // setupServer is an implementation of the "Setup" service defined in our // terraform1 package. // -// This service is here only to offer the "Handshake" function, which clients +// This service is here mainly to offer the "Handshake" function, which clients // must call to negotiate access to any other services. This is really just // an adapter around a handshake function implemented on [corePlugin]. type setupServer struct { @@ -25,13 +25,19 @@ type setupServer struct { // initOthers is the callback used to perform the capability negotiation // step and initialize all of the other API services based on what was // negotiated. - initOthers func(context.Context, *terraform1.Handshake_Request) (*terraform1.ServerCapabilities, error) - mu sync.Mutex + initOthers func(context.Context, *terraform1.Handshake_Request, *stopper) (*terraform1.ServerCapabilities, error) + + // stopper is used to track and stop long-running operations when the Stop + // RPC is called. + stopper *stopper + + mu sync.Mutex } -func newSetupServer(initOthers func(context.Context, *terraform1.Handshake_Request) (*terraform1.ServerCapabilities, error)) terraform1.SetupServer { +func newSetupServer(initOthers func(context.Context, *terraform1.Handshake_Request, *stopper) (*terraform1.ServerCapabilities, error)) terraform1.SetupServer { return &setupServer{ initOthers: initOthers, + stopper: newStopper(), } } @@ -47,7 +53,7 @@ func (s *setupServer) Handshake(ctx context.Context, req *terraform1.Handshake_R var err error { ctx, span := tracer.Start(ctx, "initialize RPC services") - serverCaps, err = s.initOthers(ctx, req) + serverCaps, err = s.initOthers(ctx, req, s.stopper) span.End() } s.initOthers = nil // cannot handshake again @@ -58,3 +64,12 @@ func (s *setupServer) Handshake(ctx context.Context, req *terraform1.Handshake_R Capabilities: serverCaps, }, nil } + +func (s *setupServer) Stop(ctx context.Context, req *terraform1.Stop_Request) (*terraform1.Stop_Response, error) { + s.mu.Lock() + defer s.mu.Unlock() + + s.stopper.stop() + + return &terraform1.Stop_Response{}, nil +} diff --git a/internal/rpcapi/setup_test.go b/internal/rpcapi/setup_test.go new file mode 100644 index 0000000000..099a9aba31 --- /dev/null +++ b/internal/rpcapi/setup_test.go @@ -0,0 +1,85 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: BUSL-1.1 + +package rpcapi + +import ( + "context" + "strings" + "sync" + "testing" + + "github.com/hashicorp/terraform/internal/rpcapi/terraform1" +) + +func TestSetupServer_Handshake(t *testing.T) { + called := 0 + server := newSetupServer(func(ctx context.Context, req *terraform1.Handshake_Request, stopper *stopper) (*terraform1.ServerCapabilities, error) { + called++ + if got, want := req.Config.Credentials["localterraform.com"].Token, "boop"; got != want { + t.Fatalf("incorrect token. got %q, want %q", got, want) + } + return &terraform1.ServerCapabilities{}, nil + }) + + req := &terraform1.Handshake_Request{ + Capabilities: &terraform1.ClientCapabilities{}, + Config: &terraform1.Config{ + Credentials: map[string]*terraform1.HostCredential{ + "localterraform.com": { + Token: "boop", + }, + }, + }, + } + _, err := server.Handshake(context.Background(), req) + if err != nil { + t.Fatalf("unexpected error: %s", err) + } + if called != 1 { + t.Errorf("unexpected initOthers call count %d, want 1", called) + } + + _, err = server.Handshake(context.Background(), req) + if err == nil || !strings.Contains(err.Error(), "handshake already completed") { + t.Fatalf("unexpected error: %s", err) + } + if called != 1 { + t.Errorf("unexpected initOthers call count %d, want 1", called) + } +} + +func TestSetupServer_Stop(t *testing.T) { + var s *stopper + server := newSetupServer(func(ctx context.Context, req *terraform1.Handshake_Request, stopper *stopper) (*terraform1.ServerCapabilities, error) { + s = stopper + return &terraform1.ServerCapabilities{}, nil + }) + _, err := server.Handshake(context.Background(), nil) + if err != nil { + t.Fatalf("unexpected error: %s", err) + } + if s == nil { + t.Fatal("stopper not passed to initOthers") + } + + var wg sync.WaitGroup + + var stops []stopChan + for range 2 { + stops = append(stops, s.add()) + wg.Add(1) + } + + for _, stop := range stops { + stop := stop + go func() { + <-stop + wg.Done() + }() + } + + server.Stop(context.Background(), nil) + + wg.Wait() +} diff --git a/internal/rpcapi/stacks.go b/internal/rpcapi/stacks.go index 35972f62be..94facc5c8a 100644 --- a/internal/rpcapi/stacks.go +++ b/internal/rpcapi/stacks.go @@ -31,14 +31,16 @@ import ( type stacksServer struct { terraform1.UnimplementedStacksServer + stopper *stopper handles *handleTable experimentsAllowed bool } var _ terraform1.StacksServer = (*stacksServer)(nil) -func newStacksServer(handles *handleTable, opts *serviceOpts) *stacksServer { +func newStacksServer(stopper *stopper, handles *handleTable, opts *serviceOpts) *stacksServer { return &stacksServer{ + stopper: stopper, handles: handles, experimentsAllowed: opts.experimentsAllowed, } @@ -271,10 +273,21 @@ func (s *stacksServer) PlanStackChanges(req *terraform1.PlanStackChanges_Request Diagnostics: diagsCh, } + // As a long-running operation, the plan RPC must be able to be stopped. We + // do this by requesting a stop channel from the stopper, and using it to + // cancel the planning process. + stopCh := s.stopper.add() + defer s.stopper.remove(stopCh) + + // We create a new cancellable context for the stack plan operation to + // allow us to respond to stop requests. + planCtx, cancelPlan := context.WithCancel(ctx) + defer cancelPlan() + // The actual plan operation runs in the background, and emits events // to us via the channels in rtResp before finally closing changesCh // to signal that the process is complete. - go stackruntime.Plan(ctx, &rtReq, &rtResp) + go stackruntime.Plan(planCtx, &rtReq, &rtResp) emitDiag := func(diag tfdiags.Diagnostic) { diags := tfdiags.Diagnostics{diag} @@ -345,6 +358,12 @@ Events: } emitDiag(diag) + case <-stopCh: + // If our stop channel is signalled, we need to cancel the plan. + // This may result in remaining changes or diagnostics being + // emitted, so we continue to monitor those channels if they're + // still active. + cancelPlan() } } @@ -408,10 +427,21 @@ func (s *stacksServer) ApplyStackChanges(req *terraform1.ApplyStackChanges_Reque Diagnostics: diagsCh, } + // As a long-running operation, the apply RPC must be able to be stopped. + // We do this by requesting a stop channel from the stopper, and using it + // to cancel the planning process. + stopCh := s.stopper.add() + defer s.stopper.remove(stopCh) + + // We create a new cancellable context for the stack plan operation to + // allow us to respond to stop requests. + applyCtx, cancelApply := context.WithCancel(ctx) + defer cancelApply() + // The actual apply operation runs in the background, and emits events // to us via the channels in rtResp before finally closing changesCh // to signal that the process is complete. - go stackruntime.Apply(ctx, &rtReq, &rtResp) + go stackruntime.Apply(applyCtx, &rtReq, &rtResp) emitDiag := func(diag tfdiags.Diagnostic) { diags := tfdiags.Diagnostics{diag} @@ -485,6 +515,13 @@ Events: } emitDiag(diag) + case <-stopCh: + // If our stop channel is signalled, we need to cancel the apply. + // This may result in remaining changes or diagnostics being + // emitted, so we continue to monitor those channels if they're + // still active. + cancelApply() + } } diff --git a/internal/rpcapi/stacks_test.go b/internal/rpcapi/stacks_test.go index 85660cf73b..830c87b4b0 100644 --- a/internal/rpcapi/stacks_test.go +++ b/internal/rpcapi/stacks_test.go @@ -28,7 +28,7 @@ func TestStacksOpenCloseStackConfiguration(t *testing.T) { ctx := context.Background() handles := newHandleTable() - stacksServer := newStacksServer(handles, &serviceOpts{}) + stacksServer := newStacksServer(newStopper(), handles, &serviceOpts{}) // In normal use a client would have previously opened a source bundle // using Dependencies.OpenSourceBundle, so we'll simulate the effect @@ -110,7 +110,7 @@ func TestStacksFindStackConfigurationComponents(t *testing.T) { ctx := context.Background() handles := newHandleTable() - stacksServer := newStacksServer(handles, &serviceOpts{}) + stacksServer := newStacksServer(newStopper(), handles, &serviceOpts{}) // In normal use a client would have previously opened a source bundle // using Dependencies.OpenSourceBundle, so we'll simulate the effect @@ -230,7 +230,7 @@ func TestStacksPlanStackChanges(t *testing.T) { ctx := context.Background() handles := newHandleTable() - stacksServer := newStacksServer(handles, &serviceOpts{}) + stacksServer := newStacksServer(newStopper(), handles, &serviceOpts{}) fakeSourceBundle := &sourcebundle.Bundle{} bundleHnd := handles.NewSourceBundle(fakeSourceBundle) diff --git a/internal/rpcapi/stopper.go b/internal/rpcapi/stopper.go new file mode 100644 index 0000000000..41b0f7973b --- /dev/null +++ b/internal/rpcapi/stopper.go @@ -0,0 +1,57 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: BUSL-1.1 + +package rpcapi + +import ( + "sync" +) + +type stopChan chan struct{} + +// stopper allows the RPC API to stop in-progress long-running operations. Each +// operation must add a new stop to the stopper, and remove it if the operation +// completes successfully. If a Stop RPC is received while the operation is +// running, the stops will all be processed, signalling to each operation that +// it should abort. +// +// Each stop is represented by a channel, which is closed to indicate that the +// operation should stop. +type stopper struct { + stops map[stopChan]struct{} + + mu sync.Mutex +} + +func newStopper() *stopper { + return &stopper{ + stops: make(map[stopChan]struct{}), + } +} + +func (s *stopper) add() stopChan { + s.mu.Lock() + defer s.mu.Unlock() + + stop := make(chan struct{}) + s.stops[stop] = struct{}{} + + return stop +} + +func (s *stopper) remove(stop stopChan) { + s.mu.Lock() + defer s.mu.Unlock() + + delete(s.stops, stop) +} + +func (s *stopper) stop() { + s.mu.Lock() + defer s.mu.Unlock() + + for stop := range s.stops { + close(stop) + delete(s.stops, stop) + } +} diff --git a/internal/rpcapi/telemetry_test.go b/internal/rpcapi/telemetry_test.go index 4d07b827e8..67b375d0cb 100644 --- a/internal/rpcapi/telemetry_test.go +++ b/internal/rpcapi/telemetry_test.go @@ -225,7 +225,7 @@ func TestTelemetryInTestsGRPC(t *testing.T) { client, close := grpcClientForTesting(ctx, t, func(srv *grpc.Server) { setup := &setupServer{ - initOthers: func(ctx context.Context, cc *terraform1.Handshake_Request) (*terraform1.ServerCapabilities, error) { + initOthers: func(ctx context.Context, cc *terraform1.Handshake_Request, stopper *stopper) (*terraform1.ServerCapabilities, error) { return &terraform1.ServerCapabilities{}, nil }, } diff --git a/internal/rpcapi/terraform1/terraform1.pb.go b/internal/rpcapi/terraform1/terraform1.pb.go index ccce09029d..de30a430bb 100644 --- a/internal/rpcapi/terraform1/terraform1.pb.go +++ b/internal/rpcapi/terraform1/terraform1.pb.go @@ -233,7 +233,7 @@ func (x BuildProviderPluginCache_Event_FetchComplete_AuthResult) Number() protor // Deprecated: Use BuildProviderPluginCache_Event_FetchComplete_AuthResult.Descriptor instead. func (BuildProviderPluginCache_Event_FetchComplete_AuthResult) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{11, 1, 5, 0} + return file_terraform1_proto_rawDescGZIP(), []int{12, 1, 5, 0} } type FindStackConfigurationComponents_Instances int32 @@ -282,7 +282,7 @@ func (x FindStackConfigurationComponents_Instances) Number() protoreflect.EnumNu // Deprecated: Use FindStackConfigurationComponents_Instances.Descriptor instead. func (FindStackConfigurationComponents_Instances) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{22, 0} + return file_terraform1_proto_rawDescGZIP(), []int{23, 0} } type StackChangeProgress_ComponentInstanceStatus_Status int32 @@ -343,7 +343,7 @@ func (x StackChangeProgress_ComponentInstanceStatus_Status) Number() protoreflec // Deprecated: Use StackChangeProgress_ComponentInstanceStatus_Status.Descriptor instead. func (StackChangeProgress_ComponentInstanceStatus_Status) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 0, 0} + return file_terraform1_proto_rawDescGZIP(), []int{38, 0, 0} } type StackChangeProgress_ResourceInstanceStatus_Status int32 @@ -410,7 +410,7 @@ func (x StackChangeProgress_ResourceInstanceStatus_Status) Number() protoreflect // Deprecated: Use StackChangeProgress_ResourceInstanceStatus_Status.Descriptor instead. func (StackChangeProgress_ResourceInstanceStatus_Status) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 1, 0} + return file_terraform1_proto_rawDescGZIP(), []int{38, 1, 0} } type StackChangeProgress_ProvisionerStatus_Status int32 @@ -462,7 +462,7 @@ func (x StackChangeProgress_ProvisionerStatus_Status) Number() protoreflect.Enum // Deprecated: Use StackChangeProgress_ProvisionerStatus_Status.Descriptor instead. func (StackChangeProgress_ProvisionerStatus_Status) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 3, 0} + return file_terraform1_proto_rawDescGZIP(), []int{38, 3, 0} } type Diagnostic_Severity int32 @@ -511,7 +511,7 @@ func (x Diagnostic_Severity) Number() protoreflect.EnumNumber { // Deprecated: Use Diagnostic_Severity.Descriptor instead. func (Diagnostic_Severity) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{38, 0} + return file_terraform1_proto_rawDescGZIP(), []int{39, 0} } type Schema_NestedBlock_NestingMode int32 @@ -569,7 +569,7 @@ func (x Schema_NestedBlock_NestingMode) Number() protoreflect.EnumNumber { // Deprecated: Use Schema_NestedBlock_NestingMode.Descriptor instead. func (Schema_NestedBlock_NestingMode) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{41, 2, 0} + return file_terraform1_proto_rawDescGZIP(), []int{42, 2, 0} } type Schema_Object_NestingMode int32 @@ -624,7 +624,7 @@ func (x Schema_Object_NestingMode) Number() protoreflect.EnumNumber { // Deprecated: Use Schema_Object_NestingMode.Descriptor instead. func (Schema_Object_NestingMode) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{41, 3, 0} + return file_terraform1_proto_rawDescGZIP(), []int{42, 3, 0} } type Schema_DocString_Format int32 @@ -670,7 +670,7 @@ func (x Schema_DocString_Format) Number() protoreflect.EnumNumber { // Deprecated: Use Schema_DocString_Format.Descriptor instead. func (Schema_DocString_Format) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{41, 4, 0} + return file_terraform1_proto_rawDescGZIP(), []int{42, 4, 0} } type Handshake struct { @@ -711,6 +711,44 @@ func (*Handshake) Descriptor() ([]byte, []int) { return file_terraform1_proto_rawDescGZIP(), []int{0} } +type Stop struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Stop) Reset() { + *x = Stop{} + if protoimpl.UnsafeEnabled { + mi := &file_terraform1_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Stop) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Stop) ProtoMessage() {} + +func (x *Stop) ProtoReflect() protoreflect.Message { + mi := &file_terraform1_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Stop.ProtoReflect.Descriptor instead. +func (*Stop) Descriptor() ([]byte, []int) { + return file_terraform1_proto_rawDescGZIP(), []int{1} +} + // The capabilities that the client wishes to advertise to the server during // handshake. type ClientCapabilities struct { @@ -722,7 +760,7 @@ type ClientCapabilities struct { func (x *ClientCapabilities) Reset() { *x = ClientCapabilities{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[1] + mi := &file_terraform1_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -735,7 +773,7 @@ func (x *ClientCapabilities) String() string { func (*ClientCapabilities) ProtoMessage() {} func (x *ClientCapabilities) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[1] + mi := &file_terraform1_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -748,7 +786,7 @@ func (x *ClientCapabilities) ProtoReflect() protoreflect.Message { // Deprecated: Use ClientCapabilities.ProtoReflect.Descriptor instead. func (*ClientCapabilities) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{1} + return file_terraform1_proto_rawDescGZIP(), []int{2} } // The capabilities that the server wishes to advertise to the client during @@ -765,7 +803,7 @@ type ServerCapabilities struct { func (x *ServerCapabilities) Reset() { *x = ServerCapabilities{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[2] + mi := &file_terraform1_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -778,7 +816,7 @@ func (x *ServerCapabilities) String() string { func (*ServerCapabilities) ProtoMessage() {} func (x *ServerCapabilities) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[2] + mi := &file_terraform1_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -791,7 +829,7 @@ func (x *ServerCapabilities) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerCapabilities.ProtoReflect.Descriptor instead. func (*ServerCapabilities) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{2} + return file_terraform1_proto_rawDescGZIP(), []int{3} } type Config struct { @@ -805,7 +843,7 @@ type Config struct { func (x *Config) Reset() { *x = Config{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[3] + mi := &file_terraform1_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -818,7 +856,7 @@ func (x *Config) String() string { func (*Config) ProtoMessage() {} func (x *Config) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[3] + mi := &file_terraform1_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -831,7 +869,7 @@ func (x *Config) ProtoReflect() protoreflect.Message { // Deprecated: Use Config.ProtoReflect.Descriptor instead. func (*Config) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{3} + return file_terraform1_proto_rawDescGZIP(), []int{4} } func (x *Config) GetCredentials() map[string]*HostCredential { @@ -852,7 +890,7 @@ type HostCredential struct { func (x *HostCredential) Reset() { *x = HostCredential{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[4] + mi := &file_terraform1_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -865,7 +903,7 @@ func (x *HostCredential) String() string { func (*HostCredential) ProtoMessage() {} func (x *HostCredential) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[4] + mi := &file_terraform1_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -878,7 +916,7 @@ func (x *HostCredential) ProtoReflect() protoreflect.Message { // Deprecated: Use HostCredential.ProtoReflect.Descriptor instead. func (*HostCredential) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{4} + return file_terraform1_proto_rawDescGZIP(), []int{5} } func (x *HostCredential) GetToken() string { @@ -897,7 +935,7 @@ type OpenSourceBundle struct { func (x *OpenSourceBundle) Reset() { *x = OpenSourceBundle{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[5] + mi := &file_terraform1_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -910,7 +948,7 @@ func (x *OpenSourceBundle) String() string { func (*OpenSourceBundle) ProtoMessage() {} func (x *OpenSourceBundle) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[5] + mi := &file_terraform1_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -923,7 +961,7 @@ func (x *OpenSourceBundle) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenSourceBundle.ProtoReflect.Descriptor instead. func (*OpenSourceBundle) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{5} + return file_terraform1_proto_rawDescGZIP(), []int{6} } type CloseSourceBundle struct { @@ -935,7 +973,7 @@ type CloseSourceBundle struct { func (x *CloseSourceBundle) Reset() { *x = CloseSourceBundle{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[6] + mi := &file_terraform1_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -948,7 +986,7 @@ func (x *CloseSourceBundle) String() string { func (*CloseSourceBundle) ProtoMessage() {} func (x *CloseSourceBundle) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[6] + mi := &file_terraform1_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -961,7 +999,7 @@ func (x *CloseSourceBundle) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseSourceBundle.ProtoReflect.Descriptor instead. func (*CloseSourceBundle) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{6} + return file_terraform1_proto_rawDescGZIP(), []int{7} } type OpenDependencyLockFile struct { @@ -973,7 +1011,7 @@ type OpenDependencyLockFile struct { func (x *OpenDependencyLockFile) Reset() { *x = OpenDependencyLockFile{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[7] + mi := &file_terraform1_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -986,7 +1024,7 @@ func (x *OpenDependencyLockFile) String() string { func (*OpenDependencyLockFile) ProtoMessage() {} func (x *OpenDependencyLockFile) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[7] + mi := &file_terraform1_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -999,7 +1037,7 @@ func (x *OpenDependencyLockFile) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenDependencyLockFile.ProtoReflect.Descriptor instead. func (*OpenDependencyLockFile) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{7} + return file_terraform1_proto_rawDescGZIP(), []int{8} } type CreateDependencyLocks struct { @@ -1011,7 +1049,7 @@ type CreateDependencyLocks struct { func (x *CreateDependencyLocks) Reset() { *x = CreateDependencyLocks{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[8] + mi := &file_terraform1_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1024,7 +1062,7 @@ func (x *CreateDependencyLocks) String() string { func (*CreateDependencyLocks) ProtoMessage() {} func (x *CreateDependencyLocks) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[8] + mi := &file_terraform1_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1037,7 +1075,7 @@ func (x *CreateDependencyLocks) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateDependencyLocks.ProtoReflect.Descriptor instead. func (*CreateDependencyLocks) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{8} + return file_terraform1_proto_rawDescGZIP(), []int{9} } type CloseDependencyLocks struct { @@ -1049,7 +1087,7 @@ type CloseDependencyLocks struct { func (x *CloseDependencyLocks) Reset() { *x = CloseDependencyLocks{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[9] + mi := &file_terraform1_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1062,7 +1100,7 @@ func (x *CloseDependencyLocks) String() string { func (*CloseDependencyLocks) ProtoMessage() {} func (x *CloseDependencyLocks) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[9] + mi := &file_terraform1_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1075,7 +1113,7 @@ func (x *CloseDependencyLocks) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseDependencyLocks.ProtoReflect.Descriptor instead. func (*CloseDependencyLocks) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{9} + return file_terraform1_proto_rawDescGZIP(), []int{10} } type GetLockedProviderDependencies struct { @@ -1087,7 +1125,7 @@ type GetLockedProviderDependencies struct { func (x *GetLockedProviderDependencies) Reset() { *x = GetLockedProviderDependencies{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[10] + mi := &file_terraform1_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1100,7 +1138,7 @@ func (x *GetLockedProviderDependencies) String() string { func (*GetLockedProviderDependencies) ProtoMessage() {} func (x *GetLockedProviderDependencies) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[10] + mi := &file_terraform1_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1113,7 +1151,7 @@ func (x *GetLockedProviderDependencies) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLockedProviderDependencies.ProtoReflect.Descriptor instead. func (*GetLockedProviderDependencies) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{10} + return file_terraform1_proto_rawDescGZIP(), []int{11} } type BuildProviderPluginCache struct { @@ -1125,7 +1163,7 @@ type BuildProviderPluginCache struct { func (x *BuildProviderPluginCache) Reset() { *x = BuildProviderPluginCache{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[11] + mi := &file_terraform1_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1138,7 +1176,7 @@ func (x *BuildProviderPluginCache) String() string { func (*BuildProviderPluginCache) ProtoMessage() {} func (x *BuildProviderPluginCache) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[11] + mi := &file_terraform1_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1151,7 +1189,7 @@ func (x *BuildProviderPluginCache) ProtoReflect() protoreflect.Message { // Deprecated: Use BuildProviderPluginCache.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{11} + return file_terraform1_proto_rawDescGZIP(), []int{12} } type OpenProviderPluginCache struct { @@ -1163,7 +1201,7 @@ type OpenProviderPluginCache struct { func (x *OpenProviderPluginCache) Reset() { *x = OpenProviderPluginCache{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[12] + mi := &file_terraform1_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1176,7 +1214,7 @@ func (x *OpenProviderPluginCache) String() string { func (*OpenProviderPluginCache) ProtoMessage() {} func (x *OpenProviderPluginCache) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[12] + mi := &file_terraform1_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1189,7 +1227,7 @@ func (x *OpenProviderPluginCache) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenProviderPluginCache.ProtoReflect.Descriptor instead. func (*OpenProviderPluginCache) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{12} + return file_terraform1_proto_rawDescGZIP(), []int{13} } type CloseProviderPluginCache struct { @@ -1201,7 +1239,7 @@ type CloseProviderPluginCache struct { func (x *CloseProviderPluginCache) Reset() { *x = CloseProviderPluginCache{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[13] + mi := &file_terraform1_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1214,7 +1252,7 @@ func (x *CloseProviderPluginCache) String() string { func (*CloseProviderPluginCache) ProtoMessage() {} func (x *CloseProviderPluginCache) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[13] + mi := &file_terraform1_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1227,7 +1265,7 @@ func (x *CloseProviderPluginCache) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseProviderPluginCache.ProtoReflect.Descriptor instead. func (*CloseProviderPluginCache) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{13} + return file_terraform1_proto_rawDescGZIP(), []int{14} } type GetCachedProviders struct { @@ -1239,7 +1277,7 @@ type GetCachedProviders struct { func (x *GetCachedProviders) Reset() { *x = GetCachedProviders{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[14] + mi := &file_terraform1_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1252,7 +1290,7 @@ func (x *GetCachedProviders) String() string { func (*GetCachedProviders) ProtoMessage() {} func (x *GetCachedProviders) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[14] + mi := &file_terraform1_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1265,7 +1303,7 @@ func (x *GetCachedProviders) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCachedProviders.ProtoReflect.Descriptor instead. func (*GetCachedProviders) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{14} + return file_terraform1_proto_rawDescGZIP(), []int{15} } type GetBuiltInProviders struct { @@ -1277,7 +1315,7 @@ type GetBuiltInProviders struct { func (x *GetBuiltInProviders) Reset() { *x = GetBuiltInProviders{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[15] + mi := &file_terraform1_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1290,7 +1328,7 @@ func (x *GetBuiltInProviders) String() string { func (*GetBuiltInProviders) ProtoMessage() {} func (x *GetBuiltInProviders) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[15] + mi := &file_terraform1_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1303,7 +1341,7 @@ func (x *GetBuiltInProviders) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBuiltInProviders.ProtoReflect.Descriptor instead. func (*GetBuiltInProviders) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{15} + return file_terraform1_proto_rawDescGZIP(), []int{16} } type GetProviderSchema struct { @@ -1315,7 +1353,7 @@ type GetProviderSchema struct { func (x *GetProviderSchema) Reset() { *x = GetProviderSchema{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[16] + mi := &file_terraform1_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1328,7 +1366,7 @@ func (x *GetProviderSchema) String() string { func (*GetProviderSchema) ProtoMessage() {} func (x *GetProviderSchema) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[16] + mi := &file_terraform1_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1341,7 +1379,7 @@ func (x *GetProviderSchema) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProviderSchema.ProtoReflect.Descriptor instead. func (*GetProviderSchema) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{16} + return file_terraform1_proto_rawDescGZIP(), []int{17} } // Represents a selected or available version of a provider, from either a @@ -1384,7 +1422,7 @@ type ProviderPackage struct { func (x *ProviderPackage) Reset() { *x = ProviderPackage{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[17] + mi := &file_terraform1_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1397,7 +1435,7 @@ func (x *ProviderPackage) String() string { func (*ProviderPackage) ProtoMessage() {} func (x *ProviderPackage) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[17] + mi := &file_terraform1_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1410,7 +1448,7 @@ func (x *ProviderPackage) ProtoReflect() protoreflect.Message { // Deprecated: Use ProviderPackage.ProtoReflect.Descriptor instead. func (*ProviderPackage) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{17} + return file_terraform1_proto_rawDescGZIP(), []int{18} } func (x *ProviderPackage) GetSourceAddr() string { @@ -1448,7 +1486,7 @@ type ProviderSchema struct { func (x *ProviderSchema) Reset() { *x = ProviderSchema{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[18] + mi := &file_terraform1_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1461,7 +1499,7 @@ func (x *ProviderSchema) String() string { func (*ProviderSchema) ProtoMessage() {} func (x *ProviderSchema) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[18] + mi := &file_terraform1_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1474,7 +1512,7 @@ func (x *ProviderSchema) ProtoReflect() protoreflect.Message { // Deprecated: Use ProviderSchema.ProtoReflect.Descriptor instead. func (*ProviderSchema) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{18} + return file_terraform1_proto_rawDescGZIP(), []int{19} } func (x *ProviderSchema) GetProviderConfig() *Schema { @@ -1507,7 +1545,7 @@ type OpenStackConfiguration struct { func (x *OpenStackConfiguration) Reset() { *x = OpenStackConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[19] + mi := &file_terraform1_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1520,7 +1558,7 @@ func (x *OpenStackConfiguration) String() string { func (*OpenStackConfiguration) ProtoMessage() {} func (x *OpenStackConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[19] + mi := &file_terraform1_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1533,7 +1571,7 @@ func (x *OpenStackConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenStackConfiguration.ProtoReflect.Descriptor instead. func (*OpenStackConfiguration) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{19} + return file_terraform1_proto_rawDescGZIP(), []int{20} } type CloseStackConfiguration struct { @@ -1545,7 +1583,7 @@ type CloseStackConfiguration struct { func (x *CloseStackConfiguration) Reset() { *x = CloseStackConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[20] + mi := &file_terraform1_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1558,7 +1596,7 @@ func (x *CloseStackConfiguration) String() string { func (*CloseStackConfiguration) ProtoMessage() {} func (x *CloseStackConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[20] + mi := &file_terraform1_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1571,7 +1609,7 @@ func (x *CloseStackConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseStackConfiguration.ProtoReflect.Descriptor instead. func (*CloseStackConfiguration) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{20} + return file_terraform1_proto_rawDescGZIP(), []int{21} } type ValidateStackConfiguration struct { @@ -1583,7 +1621,7 @@ type ValidateStackConfiguration struct { func (x *ValidateStackConfiguration) Reset() { *x = ValidateStackConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[21] + mi := &file_terraform1_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1596,7 +1634,7 @@ func (x *ValidateStackConfiguration) String() string { func (*ValidateStackConfiguration) ProtoMessage() {} func (x *ValidateStackConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[21] + mi := &file_terraform1_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1609,7 +1647,7 @@ func (x *ValidateStackConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateStackConfiguration.ProtoReflect.Descriptor instead. func (*ValidateStackConfiguration) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{21} + return file_terraform1_proto_rawDescGZIP(), []int{22} } type FindStackConfigurationComponents struct { @@ -1621,7 +1659,7 @@ type FindStackConfigurationComponents struct { func (x *FindStackConfigurationComponents) Reset() { *x = FindStackConfigurationComponents{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[22] + mi := &file_terraform1_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1634,7 +1672,7 @@ func (x *FindStackConfigurationComponents) String() string { func (*FindStackConfigurationComponents) ProtoMessage() {} func (x *FindStackConfigurationComponents) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[22] + mi := &file_terraform1_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1647,7 +1685,7 @@ func (x *FindStackConfigurationComponents) ProtoReflect() protoreflect.Message { // Deprecated: Use FindStackConfigurationComponents.ProtoReflect.Descriptor instead. func (*FindStackConfigurationComponents) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{22} + return file_terraform1_proto_rawDescGZIP(), []int{23} } type PlanStackChanges struct { @@ -1659,7 +1697,7 @@ type PlanStackChanges struct { func (x *PlanStackChanges) Reset() { *x = PlanStackChanges{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[23] + mi := &file_terraform1_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1672,7 +1710,7 @@ func (x *PlanStackChanges) String() string { func (*PlanStackChanges) ProtoMessage() {} func (x *PlanStackChanges) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[23] + mi := &file_terraform1_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1685,7 +1723,7 @@ func (x *PlanStackChanges) ProtoReflect() protoreflect.Message { // Deprecated: Use PlanStackChanges.ProtoReflect.Descriptor instead. func (*PlanStackChanges) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{23} + return file_terraform1_proto_rawDescGZIP(), []int{24} } type ApplyStackChanges struct { @@ -1697,7 +1735,7 @@ type ApplyStackChanges struct { func (x *ApplyStackChanges) Reset() { *x = ApplyStackChanges{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[24] + mi := &file_terraform1_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1710,7 +1748,7 @@ func (x *ApplyStackChanges) String() string { func (*ApplyStackChanges) ProtoMessage() {} func (x *ApplyStackChanges) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[24] + mi := &file_terraform1_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1723,7 +1761,7 @@ func (x *ApplyStackChanges) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplyStackChanges.ProtoReflect.Descriptor instead. func (*ApplyStackChanges) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{24} + return file_terraform1_proto_rawDescGZIP(), []int{25} } type OpenStackInspector struct { @@ -1735,7 +1773,7 @@ type OpenStackInspector struct { func (x *OpenStackInspector) Reset() { *x = OpenStackInspector{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[25] + mi := &file_terraform1_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1748,7 +1786,7 @@ func (x *OpenStackInspector) String() string { func (*OpenStackInspector) ProtoMessage() {} func (x *OpenStackInspector) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[25] + mi := &file_terraform1_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1761,7 +1799,7 @@ func (x *OpenStackInspector) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenStackInspector.ProtoReflect.Descriptor instead. func (*OpenStackInspector) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{25} + return file_terraform1_proto_rawDescGZIP(), []int{26} } type InspectExpressionResult struct { @@ -1773,7 +1811,7 @@ type InspectExpressionResult struct { func (x *InspectExpressionResult) Reset() { *x = InspectExpressionResult{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[26] + mi := &file_terraform1_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1786,7 +1824,7 @@ func (x *InspectExpressionResult) String() string { func (*InspectExpressionResult) ProtoMessage() {} func (x *InspectExpressionResult) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[26] + mi := &file_terraform1_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1799,7 +1837,7 @@ func (x *InspectExpressionResult) ProtoReflect() protoreflect.Message { // Deprecated: Use InspectExpressionResult.ProtoReflect.Descriptor instead. func (*InspectExpressionResult) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{26} + return file_terraform1_proto_rawDescGZIP(), []int{27} } // Represents dynamically-typed data from within the Terraform language. @@ -1818,7 +1856,7 @@ type DynamicValue struct { func (x *DynamicValue) Reset() { *x = DynamicValue{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[27] + mi := &file_terraform1_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1831,7 +1869,7 @@ func (x *DynamicValue) String() string { func (*DynamicValue) ProtoMessage() {} func (x *DynamicValue) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[27] + mi := &file_terraform1_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1844,7 +1882,7 @@ func (x *DynamicValue) ProtoReflect() protoreflect.Message { // Deprecated: Use DynamicValue.ProtoReflect.Descriptor instead. func (*DynamicValue) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{27} + return file_terraform1_proto_rawDescGZIP(), []int{28} } func (x *DynamicValue) GetMsgpack() []byte { @@ -1874,7 +1912,7 @@ type DynamicValueChange struct { func (x *DynamicValueChange) Reset() { *x = DynamicValueChange{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[28] + mi := &file_terraform1_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1887,7 +1925,7 @@ func (x *DynamicValueChange) String() string { func (*DynamicValueChange) ProtoMessage() {} func (x *DynamicValueChange) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[28] + mi := &file_terraform1_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1900,7 +1938,7 @@ func (x *DynamicValueChange) ProtoReflect() protoreflect.Message { // Deprecated: Use DynamicValueChange.ProtoReflect.Descriptor instead. func (*DynamicValueChange) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{28} + return file_terraform1_proto_rawDescGZIP(), []int{29} } func (x *DynamicValueChange) GetOld() *DynamicValue { @@ -1932,7 +1970,7 @@ type DynamicValueWithSource struct { func (x *DynamicValueWithSource) Reset() { *x = DynamicValueWithSource{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[29] + mi := &file_terraform1_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1945,7 +1983,7 @@ func (x *DynamicValueWithSource) String() string { func (*DynamicValueWithSource) ProtoMessage() {} func (x *DynamicValueWithSource) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[29] + mi := &file_terraform1_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1958,7 +1996,7 @@ func (x *DynamicValueWithSource) ProtoReflect() protoreflect.Message { // Deprecated: Use DynamicValueWithSource.ProtoReflect.Descriptor instead. func (*DynamicValueWithSource) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{29} + return file_terraform1_proto_rawDescGZIP(), []int{30} } func (x *DynamicValueWithSource) GetValue() *DynamicValue { @@ -1986,7 +2024,7 @@ type AttributePath struct { func (x *AttributePath) Reset() { *x = AttributePath{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[30] + mi := &file_terraform1_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1999,7 +2037,7 @@ func (x *AttributePath) String() string { func (*AttributePath) ProtoMessage() {} func (x *AttributePath) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[30] + mi := &file_terraform1_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2012,7 +2050,7 @@ func (x *AttributePath) ProtoReflect() protoreflect.Message { // Deprecated: Use AttributePath.ProtoReflect.Descriptor instead. func (*AttributePath) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{30} + return file_terraform1_proto_rawDescGZIP(), []int{31} } func (x *AttributePath) GetSteps() []*AttributePath_Step { @@ -2040,7 +2078,7 @@ type ComponentInstanceInStackAddr struct { func (x *ComponentInstanceInStackAddr) Reset() { *x = ComponentInstanceInStackAddr{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[31] + mi := &file_terraform1_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2053,7 +2091,7 @@ func (x *ComponentInstanceInStackAddr) String() string { func (*ComponentInstanceInStackAddr) ProtoMessage() {} func (x *ComponentInstanceInStackAddr) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[31] + mi := &file_terraform1_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2066,7 +2104,7 @@ func (x *ComponentInstanceInStackAddr) ProtoReflect() protoreflect.Message { // Deprecated: Use ComponentInstanceInStackAddr.ProtoReflect.Descriptor instead. func (*ComponentInstanceInStackAddr) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{31} + return file_terraform1_proto_rawDescGZIP(), []int{32} } func (x *ComponentInstanceInStackAddr) GetComponentAddr() string { @@ -2103,7 +2141,7 @@ type ResourceInstanceInStackAddr struct { func (x *ResourceInstanceInStackAddr) Reset() { *x = ResourceInstanceInStackAddr{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[32] + mi := &file_terraform1_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2116,7 +2154,7 @@ func (x *ResourceInstanceInStackAddr) String() string { func (*ResourceInstanceInStackAddr) ProtoMessage() {} func (x *ResourceInstanceInStackAddr) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[32] + mi := &file_terraform1_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2129,7 +2167,7 @@ func (x *ResourceInstanceInStackAddr) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceInstanceInStackAddr.ProtoReflect.Descriptor instead. func (*ResourceInstanceInStackAddr) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{32} + return file_terraform1_proto_rawDescGZIP(), []int{33} } func (x *ResourceInstanceInStackAddr) GetComponentInstanceAddr() string { @@ -2171,7 +2209,7 @@ type ResourceInstanceObjectInStackAddr struct { func (x *ResourceInstanceObjectInStackAddr) Reset() { *x = ResourceInstanceObjectInStackAddr{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[33] + mi := &file_terraform1_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2184,7 +2222,7 @@ func (x *ResourceInstanceObjectInStackAddr) String() string { func (*ResourceInstanceObjectInStackAddr) ProtoMessage() {} func (x *ResourceInstanceObjectInStackAddr) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[33] + mi := &file_terraform1_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2197,7 +2235,7 @@ func (x *ResourceInstanceObjectInStackAddr) ProtoReflect() protoreflect.Message // Deprecated: Use ResourceInstanceObjectInStackAddr.ProtoReflect.Descriptor instead. func (*ResourceInstanceObjectInStackAddr) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{33} + return file_terraform1_proto_rawDescGZIP(), []int{34} } func (x *ResourceInstanceObjectInStackAddr) GetComponentInstanceAddr() string { @@ -2240,7 +2278,7 @@ type SourceAddress struct { func (x *SourceAddress) Reset() { *x = SourceAddress{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[34] + mi := &file_terraform1_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2253,7 +2291,7 @@ func (x *SourceAddress) String() string { func (*SourceAddress) ProtoMessage() {} func (x *SourceAddress) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[34] + mi := &file_terraform1_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2266,7 +2304,7 @@ func (x *SourceAddress) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceAddress.ProtoReflect.Descriptor instead. func (*SourceAddress) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{34} + return file_terraform1_proto_rawDescGZIP(), []int{35} } func (x *SourceAddress) GetSource() string { @@ -2329,7 +2367,7 @@ type PlannedChange struct { func (x *PlannedChange) Reset() { *x = PlannedChange{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[35] + mi := &file_terraform1_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2342,7 +2380,7 @@ func (x *PlannedChange) String() string { func (*PlannedChange) ProtoMessage() {} func (x *PlannedChange) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[35] + mi := &file_terraform1_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2355,7 +2393,7 @@ func (x *PlannedChange) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedChange.ProtoReflect.Descriptor instead. func (*PlannedChange) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35} + return file_terraform1_proto_rawDescGZIP(), []int{36} } func (x *PlannedChange) GetRaw() []*anypb.Any { @@ -2446,7 +2484,7 @@ type AppliedChange struct { func (x *AppliedChange) Reset() { *x = AppliedChange{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[36] + mi := &file_terraform1_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2459,7 +2497,7 @@ func (x *AppliedChange) String() string { func (*AppliedChange) ProtoMessage() {} func (x *AppliedChange) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[36] + mi := &file_terraform1_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2472,7 +2510,7 @@ func (x *AppliedChange) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange.ProtoReflect.Descriptor instead. func (*AppliedChange) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{36} + return file_terraform1_proto_rawDescGZIP(), []int{37} } func (x *AppliedChange) GetRaw() []*AppliedChange_RawChange { @@ -2516,7 +2554,7 @@ type StackChangeProgress struct { func (x *StackChangeProgress) Reset() { *x = StackChangeProgress{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[37] + mi := &file_terraform1_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2529,7 +2567,7 @@ func (x *StackChangeProgress) String() string { func (*StackChangeProgress) ProtoMessage() {} func (x *StackChangeProgress) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[37] + mi := &file_terraform1_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2542,7 +2580,7 @@ func (x *StackChangeProgress) ProtoReflect() protoreflect.Message { // Deprecated: Use StackChangeProgress.ProtoReflect.Descriptor instead. func (*StackChangeProgress) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37} + return file_terraform1_proto_rawDescGZIP(), []int{38} } func (m *StackChangeProgress) GetEvent() isStackChangeProgress_Event { @@ -2662,7 +2700,7 @@ type Diagnostic struct { func (x *Diagnostic) Reset() { *x = Diagnostic{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[38] + mi := &file_terraform1_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2675,7 +2713,7 @@ func (x *Diagnostic) String() string { func (*Diagnostic) ProtoMessage() {} func (x *Diagnostic) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[38] + mi := &file_terraform1_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2688,7 +2726,7 @@ func (x *Diagnostic) ProtoReflect() protoreflect.Message { // Deprecated: Use Diagnostic.ProtoReflect.Descriptor instead. func (*Diagnostic) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{38} + return file_terraform1_proto_rawDescGZIP(), []int{39} } func (x *Diagnostic) GetSeverity() Diagnostic_Severity { @@ -2739,7 +2777,7 @@ type SourceRange struct { func (x *SourceRange) Reset() { *x = SourceRange{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[39] + mi := &file_terraform1_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2752,7 +2790,7 @@ func (x *SourceRange) String() string { func (*SourceRange) ProtoMessage() {} func (x *SourceRange) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[39] + mi := &file_terraform1_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2765,7 +2803,7 @@ func (x *SourceRange) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceRange.ProtoReflect.Descriptor instead. func (*SourceRange) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{39} + return file_terraform1_proto_rawDescGZIP(), []int{40} } func (x *SourceRange) GetSourceAddr() string { @@ -2802,7 +2840,7 @@ type SourcePos struct { func (x *SourcePos) Reset() { *x = SourcePos{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[40] + mi := &file_terraform1_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2815,7 +2853,7 @@ func (x *SourcePos) String() string { func (*SourcePos) ProtoMessage() {} func (x *SourcePos) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[40] + mi := &file_terraform1_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2828,7 +2866,7 @@ func (x *SourcePos) ProtoReflect() protoreflect.Message { // Deprecated: Use SourcePos.ProtoReflect.Descriptor instead. func (*SourcePos) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{40} + return file_terraform1_proto_rawDescGZIP(), []int{41} } func (x *SourcePos) GetByte() int64 { @@ -2866,7 +2904,7 @@ type Schema struct { func (x *Schema) Reset() { *x = Schema{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[41] + mi := &file_terraform1_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2879,7 +2917,7 @@ func (x *Schema) String() string { func (*Schema) ProtoMessage() {} func (x *Schema) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[41] + mi := &file_terraform1_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2892,7 +2930,7 @@ func (x *Schema) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema.ProtoReflect.Descriptor instead. func (*Schema) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{41} + return file_terraform1_proto_rawDescGZIP(), []int{42} } func (x *Schema) GetBlock() *Schema_Block { @@ -2911,7 +2949,7 @@ type ProviderPackageVersions struct { func (x *ProviderPackageVersions) Reset() { *x = ProviderPackageVersions{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[42] + mi := &file_terraform1_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2924,7 +2962,7 @@ func (x *ProviderPackageVersions) String() string { func (*ProviderPackageVersions) ProtoMessage() {} func (x *ProviderPackageVersions) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[42] + mi := &file_terraform1_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2937,7 +2975,7 @@ func (x *ProviderPackageVersions) ProtoReflect() protoreflect.Message { // Deprecated: Use ProviderPackageVersions.ProtoReflect.Descriptor instead. func (*ProviderPackageVersions) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{42} + return file_terraform1_proto_rawDescGZIP(), []int{43} } type FetchProviderPackage struct { @@ -2949,7 +2987,7 @@ type FetchProviderPackage struct { func (x *FetchProviderPackage) Reset() { *x = FetchProviderPackage{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[43] + mi := &file_terraform1_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2962,7 +3000,7 @@ func (x *FetchProviderPackage) String() string { func (*FetchProviderPackage) ProtoMessage() {} func (x *FetchProviderPackage) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[43] + mi := &file_terraform1_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2975,7 +3013,7 @@ func (x *FetchProviderPackage) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchProviderPackage.ProtoReflect.Descriptor instead. func (*FetchProviderPackage) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{43} + return file_terraform1_proto_rawDescGZIP(), []int{44} } type ModulePackageVersions struct { @@ -2987,7 +3025,7 @@ type ModulePackageVersions struct { func (x *ModulePackageVersions) Reset() { *x = ModulePackageVersions{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[44] + mi := &file_terraform1_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3000,7 +3038,7 @@ func (x *ModulePackageVersions) String() string { func (*ModulePackageVersions) ProtoMessage() {} func (x *ModulePackageVersions) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[44] + mi := &file_terraform1_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3013,7 +3051,7 @@ func (x *ModulePackageVersions) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageVersions.ProtoReflect.Descriptor instead. func (*ModulePackageVersions) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{44} + return file_terraform1_proto_rawDescGZIP(), []int{45} } type ModulePackageSourceAddr struct { @@ -3025,7 +3063,7 @@ type ModulePackageSourceAddr struct { func (x *ModulePackageSourceAddr) Reset() { *x = ModulePackageSourceAddr{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[45] + mi := &file_terraform1_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3038,7 +3076,7 @@ func (x *ModulePackageSourceAddr) String() string { func (*ModulePackageSourceAddr) ProtoMessage() {} func (x *ModulePackageSourceAddr) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[45] + mi := &file_terraform1_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3051,7 +3089,7 @@ func (x *ModulePackageSourceAddr) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageSourceAddr.ProtoReflect.Descriptor instead. func (*ModulePackageSourceAddr) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{45} + return file_terraform1_proto_rawDescGZIP(), []int{46} } type FetchModulePackage struct { @@ -3063,7 +3101,7 @@ type FetchModulePackage struct { func (x *FetchModulePackage) Reset() { *x = FetchModulePackage{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[46] + mi := &file_terraform1_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3076,7 +3114,7 @@ func (x *FetchModulePackage) String() string { func (*FetchModulePackage) ProtoMessage() {} func (x *FetchModulePackage) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[46] + mi := &file_terraform1_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3089,7 +3127,7 @@ func (x *FetchModulePackage) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchModulePackage.ProtoReflect.Descriptor instead. func (*FetchModulePackage) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{46} + return file_terraform1_proto_rawDescGZIP(), []int{47} } type Handshake_Request struct { @@ -3104,7 +3142,7 @@ type Handshake_Request struct { func (x *Handshake_Request) Reset() { *x = Handshake_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[47] + mi := &file_terraform1_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3117,7 +3155,7 @@ func (x *Handshake_Request) String() string { func (*Handshake_Request) ProtoMessage() {} func (x *Handshake_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[47] + mi := &file_terraform1_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3158,7 +3196,7 @@ type Handshake_Response struct { func (x *Handshake_Response) Reset() { *x = Handshake_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[48] + mi := &file_terraform1_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3171,7 +3209,7 @@ func (x *Handshake_Response) String() string { func (*Handshake_Response) ProtoMessage() {} func (x *Handshake_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[48] + mi := &file_terraform1_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3194,6 +3232,82 @@ func (x *Handshake_Response) GetCapabilities() *ServerCapabilities { return nil } +type Stop_Request struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Stop_Request) Reset() { + *x = Stop_Request{} + if protoimpl.UnsafeEnabled { + mi := &file_terraform1_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Stop_Request) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Stop_Request) ProtoMessage() {} + +func (x *Stop_Request) ProtoReflect() protoreflect.Message { + mi := &file_terraform1_proto_msgTypes[50] + 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 Stop_Request.ProtoReflect.Descriptor instead. +func (*Stop_Request) Descriptor() ([]byte, []int) { + return file_terraform1_proto_rawDescGZIP(), []int{1, 0} +} + +type Stop_Response struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Stop_Response) Reset() { + *x = Stop_Response{} + if protoimpl.UnsafeEnabled { + mi := &file_terraform1_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Stop_Response) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Stop_Response) ProtoMessage() {} + +func (x *Stop_Response) ProtoReflect() protoreflect.Message { + mi := &file_terraform1_proto_msgTypes[51] + 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 Stop_Response.ProtoReflect.Descriptor instead. +func (*Stop_Response) Descriptor() ([]byte, []int) { + return file_terraform1_proto_rawDescGZIP(), []int{1, 1} +} + type OpenSourceBundle_Request struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3205,7 +3319,7 @@ type OpenSourceBundle_Request struct { func (x *OpenSourceBundle_Request) Reset() { *x = OpenSourceBundle_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[50] + mi := &file_terraform1_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3218,7 +3332,7 @@ func (x *OpenSourceBundle_Request) String() string { func (*OpenSourceBundle_Request) ProtoMessage() {} func (x *OpenSourceBundle_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[50] + mi := &file_terraform1_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3231,7 +3345,7 @@ func (x *OpenSourceBundle_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenSourceBundle_Request.ProtoReflect.Descriptor instead. func (*OpenSourceBundle_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{5, 0} + return file_terraform1_proto_rawDescGZIP(), []int{6, 0} } func (x *OpenSourceBundle_Request) GetLocalPath() string { @@ -3252,7 +3366,7 @@ type OpenSourceBundle_Response struct { func (x *OpenSourceBundle_Response) Reset() { *x = OpenSourceBundle_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[51] + mi := &file_terraform1_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3265,7 +3379,7 @@ func (x *OpenSourceBundle_Response) String() string { func (*OpenSourceBundle_Response) ProtoMessage() {} func (x *OpenSourceBundle_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[51] + mi := &file_terraform1_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3278,7 +3392,7 @@ func (x *OpenSourceBundle_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenSourceBundle_Response.ProtoReflect.Descriptor instead. func (*OpenSourceBundle_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{5, 1} + return file_terraform1_proto_rawDescGZIP(), []int{6, 1} } func (x *OpenSourceBundle_Response) GetSourceBundleHandle() int64 { @@ -3299,7 +3413,7 @@ type CloseSourceBundle_Request struct { func (x *CloseSourceBundle_Request) Reset() { *x = CloseSourceBundle_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[52] + mi := &file_terraform1_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3312,7 +3426,7 @@ func (x *CloseSourceBundle_Request) String() string { func (*CloseSourceBundle_Request) ProtoMessage() {} func (x *CloseSourceBundle_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[52] + mi := &file_terraform1_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3325,7 +3439,7 @@ func (x *CloseSourceBundle_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseSourceBundle_Request.ProtoReflect.Descriptor instead. func (*CloseSourceBundle_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{6, 0} + return file_terraform1_proto_rawDescGZIP(), []int{7, 0} } func (x *CloseSourceBundle_Request) GetSourceBundleHandle() int64 { @@ -3344,7 +3458,7 @@ type CloseSourceBundle_Response struct { func (x *CloseSourceBundle_Response) Reset() { *x = CloseSourceBundle_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[53] + mi := &file_terraform1_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3357,7 +3471,7 @@ func (x *CloseSourceBundle_Response) String() string { func (*CloseSourceBundle_Response) ProtoMessage() {} func (x *CloseSourceBundle_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[53] + mi := &file_terraform1_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3370,7 +3484,7 @@ func (x *CloseSourceBundle_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseSourceBundle_Response.ProtoReflect.Descriptor instead. func (*CloseSourceBundle_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{6, 1} + return file_terraform1_proto_rawDescGZIP(), []int{7, 1} } type OpenDependencyLockFile_Request struct { @@ -3385,7 +3499,7 @@ type OpenDependencyLockFile_Request struct { func (x *OpenDependencyLockFile_Request) Reset() { *x = OpenDependencyLockFile_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[54] + mi := &file_terraform1_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3398,7 +3512,7 @@ func (x *OpenDependencyLockFile_Request) String() string { func (*OpenDependencyLockFile_Request) ProtoMessage() {} func (x *OpenDependencyLockFile_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[54] + mi := &file_terraform1_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3411,7 +3525,7 @@ func (x *OpenDependencyLockFile_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenDependencyLockFile_Request.ProtoReflect.Descriptor instead. func (*OpenDependencyLockFile_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{7, 0} + return file_terraform1_proto_rawDescGZIP(), []int{8, 0} } func (x *OpenDependencyLockFile_Request) GetSourceBundleHandle() int64 { @@ -3440,7 +3554,7 @@ type OpenDependencyLockFile_Response struct { func (x *OpenDependencyLockFile_Response) Reset() { *x = OpenDependencyLockFile_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[55] + mi := &file_terraform1_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3453,7 +3567,7 @@ func (x *OpenDependencyLockFile_Response) String() string { func (*OpenDependencyLockFile_Response) ProtoMessage() {} func (x *OpenDependencyLockFile_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[55] + mi := &file_terraform1_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3466,7 +3580,7 @@ func (x *OpenDependencyLockFile_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenDependencyLockFile_Response.ProtoReflect.Descriptor instead. func (*OpenDependencyLockFile_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{7, 1} + return file_terraform1_proto_rawDescGZIP(), []int{8, 1} } func (x *OpenDependencyLockFile_Response) GetDependencyLocksHandle() int64 { @@ -3500,7 +3614,7 @@ type CreateDependencyLocks_Request struct { func (x *CreateDependencyLocks_Request) Reset() { *x = CreateDependencyLocks_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[56] + mi := &file_terraform1_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3513,7 +3627,7 @@ func (x *CreateDependencyLocks_Request) String() string { func (*CreateDependencyLocks_Request) ProtoMessage() {} func (x *CreateDependencyLocks_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[56] + mi := &file_terraform1_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3526,7 +3640,7 @@ func (x *CreateDependencyLocks_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateDependencyLocks_Request.ProtoReflect.Descriptor instead. func (*CreateDependencyLocks_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{8, 0} + return file_terraform1_proto_rawDescGZIP(), []int{9, 0} } func (x *CreateDependencyLocks_Request) GetProviderSelections() []*ProviderPackage { @@ -3547,7 +3661,7 @@ type CreateDependencyLocks_Response struct { func (x *CreateDependencyLocks_Response) Reset() { *x = CreateDependencyLocks_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[57] + mi := &file_terraform1_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3560,7 +3674,7 @@ func (x *CreateDependencyLocks_Response) String() string { func (*CreateDependencyLocks_Response) ProtoMessage() {} func (x *CreateDependencyLocks_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[57] + mi := &file_terraform1_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3573,7 +3687,7 @@ func (x *CreateDependencyLocks_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateDependencyLocks_Response.ProtoReflect.Descriptor instead. func (*CreateDependencyLocks_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{8, 1} + return file_terraform1_proto_rawDescGZIP(), []int{9, 1} } func (x *CreateDependencyLocks_Response) GetDependencyLocksHandle() int64 { @@ -3594,7 +3708,7 @@ type CloseDependencyLocks_Request struct { func (x *CloseDependencyLocks_Request) Reset() { *x = CloseDependencyLocks_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[58] + mi := &file_terraform1_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3607,7 +3721,7 @@ func (x *CloseDependencyLocks_Request) String() string { func (*CloseDependencyLocks_Request) ProtoMessage() {} func (x *CloseDependencyLocks_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[58] + mi := &file_terraform1_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3620,7 +3734,7 @@ func (x *CloseDependencyLocks_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseDependencyLocks_Request.ProtoReflect.Descriptor instead. func (*CloseDependencyLocks_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{9, 0} + return file_terraform1_proto_rawDescGZIP(), []int{10, 0} } func (x *CloseDependencyLocks_Request) GetDependencyLocksHandle() int64 { @@ -3639,7 +3753,7 @@ type CloseDependencyLocks_Response struct { func (x *CloseDependencyLocks_Response) Reset() { *x = CloseDependencyLocks_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[59] + mi := &file_terraform1_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3652,7 +3766,7 @@ func (x *CloseDependencyLocks_Response) String() string { func (*CloseDependencyLocks_Response) ProtoMessage() {} func (x *CloseDependencyLocks_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[59] + mi := &file_terraform1_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3665,7 +3779,7 @@ func (x *CloseDependencyLocks_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseDependencyLocks_Response.ProtoReflect.Descriptor instead. func (*CloseDependencyLocks_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{9, 1} + return file_terraform1_proto_rawDescGZIP(), []int{10, 1} } type GetLockedProviderDependencies_Request struct { @@ -3679,7 +3793,7 @@ type GetLockedProviderDependencies_Request struct { func (x *GetLockedProviderDependencies_Request) Reset() { *x = GetLockedProviderDependencies_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[60] + mi := &file_terraform1_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3692,7 +3806,7 @@ func (x *GetLockedProviderDependencies_Request) String() string { func (*GetLockedProviderDependencies_Request) ProtoMessage() {} func (x *GetLockedProviderDependencies_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[60] + mi := &file_terraform1_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3705,7 +3819,7 @@ func (x *GetLockedProviderDependencies_Request) ProtoReflect() protoreflect.Mess // Deprecated: Use GetLockedProviderDependencies_Request.ProtoReflect.Descriptor instead. func (*GetLockedProviderDependencies_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{10, 0} + return file_terraform1_proto_rawDescGZIP(), []int{11, 0} } func (x *GetLockedProviderDependencies_Request) GetDependencyLocksHandle() int64 { @@ -3726,7 +3840,7 @@ type GetLockedProviderDependencies_Response struct { func (x *GetLockedProviderDependencies_Response) Reset() { *x = GetLockedProviderDependencies_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[61] + mi := &file_terraform1_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3739,7 +3853,7 @@ func (x *GetLockedProviderDependencies_Response) String() string { func (*GetLockedProviderDependencies_Response) ProtoMessage() {} func (x *GetLockedProviderDependencies_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[61] + mi := &file_terraform1_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3752,7 +3866,7 @@ func (x *GetLockedProviderDependencies_Response) ProtoReflect() protoreflect.Mes // Deprecated: Use GetLockedProviderDependencies_Response.ProtoReflect.Descriptor instead. func (*GetLockedProviderDependencies_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{10, 1} + return file_terraform1_proto_rawDescGZIP(), []int{11, 1} } func (x *GetLockedProviderDependencies_Response) GetSelectedProviders() []*ProviderPackage { @@ -3784,7 +3898,7 @@ type BuildProviderPluginCache_Request struct { func (x *BuildProviderPluginCache_Request) Reset() { *x = BuildProviderPluginCache_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[62] + mi := &file_terraform1_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3797,7 +3911,7 @@ func (x *BuildProviderPluginCache_Request) String() string { func (*BuildProviderPluginCache_Request) ProtoMessage() {} func (x *BuildProviderPluginCache_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[62] + mi := &file_terraform1_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3810,7 +3924,7 @@ func (x *BuildProviderPluginCache_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use BuildProviderPluginCache_Request.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{11, 0} + return file_terraform1_proto_rawDescGZIP(), []int{12, 0} } func (x *BuildProviderPluginCache_Request) GetCacheDir() string { @@ -3863,7 +3977,7 @@ type BuildProviderPluginCache_Event struct { func (x *BuildProviderPluginCache_Event) Reset() { *x = BuildProviderPluginCache_Event{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[63] + mi := &file_terraform1_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3876,7 +3990,7 @@ func (x *BuildProviderPluginCache_Event) String() string { func (*BuildProviderPluginCache_Event) ProtoMessage() {} func (x *BuildProviderPluginCache_Event) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[63] + mi := &file_terraform1_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3889,7 +4003,7 @@ func (x *BuildProviderPluginCache_Event) ProtoReflect() protoreflect.Message { // Deprecated: Use BuildProviderPluginCache_Event.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Event) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{11, 1} + return file_terraform1_proto_rawDescGZIP(), []int{12, 1} } func (m *BuildProviderPluginCache_Event) GetEvent() isBuildProviderPluginCache_Event_Event { @@ -4038,7 +4152,7 @@ type BuildProviderPluginCache_Request_InstallMethod struct { func (x *BuildProviderPluginCache_Request_InstallMethod) Reset() { *x = BuildProviderPluginCache_Request_InstallMethod{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[64] + mi := &file_terraform1_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4051,7 +4165,7 @@ func (x *BuildProviderPluginCache_Request_InstallMethod) String() string { func (*BuildProviderPluginCache_Request_InstallMethod) ProtoMessage() {} func (x *BuildProviderPluginCache_Request_InstallMethod) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[64] + mi := &file_terraform1_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4064,7 +4178,7 @@ func (x *BuildProviderPluginCache_Request_InstallMethod) ProtoReflect() protoref // Deprecated: Use BuildProviderPluginCache_Request_InstallMethod.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Request_InstallMethod) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{11, 0, 0} + return file_terraform1_proto_rawDescGZIP(), []int{12, 0, 0} } func (m *BuildProviderPluginCache_Request_InstallMethod) GetSource() isBuildProviderPluginCache_Request_InstallMethod_Source { @@ -4145,7 +4259,7 @@ type BuildProviderPluginCache_Event_Pending struct { func (x *BuildProviderPluginCache_Event_Pending) Reset() { *x = BuildProviderPluginCache_Event_Pending{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[65] + mi := &file_terraform1_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4158,7 +4272,7 @@ func (x *BuildProviderPluginCache_Event_Pending) String() string { func (*BuildProviderPluginCache_Event_Pending) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_Pending) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[65] + mi := &file_terraform1_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4171,7 +4285,7 @@ func (x *BuildProviderPluginCache_Event_Pending) ProtoReflect() protoreflect.Mes // Deprecated: Use BuildProviderPluginCache_Event_Pending.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Event_Pending) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{11, 1, 0} + return file_terraform1_proto_rawDescGZIP(), []int{12, 1, 0} } func (x *BuildProviderPluginCache_Event_Pending) GetExpected() []*BuildProviderPluginCache_Event_ProviderConstraints { @@ -4193,7 +4307,7 @@ type BuildProviderPluginCache_Event_ProviderConstraints struct { func (x *BuildProviderPluginCache_Event_ProviderConstraints) Reset() { *x = BuildProviderPluginCache_Event_ProviderConstraints{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[66] + mi := &file_terraform1_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4206,7 +4320,7 @@ func (x *BuildProviderPluginCache_Event_ProviderConstraints) String() string { func (*BuildProviderPluginCache_Event_ProviderConstraints) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_ProviderConstraints) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[66] + mi := &file_terraform1_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4219,7 +4333,7 @@ func (x *BuildProviderPluginCache_Event_ProviderConstraints) ProtoReflect() prot // Deprecated: Use BuildProviderPluginCache_Event_ProviderConstraints.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Event_ProviderConstraints) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{11, 1, 1} + return file_terraform1_proto_rawDescGZIP(), []int{12, 1, 1} } func (x *BuildProviderPluginCache_Event_ProviderConstraints) GetSourceAddr() string { @@ -4248,7 +4362,7 @@ type BuildProviderPluginCache_Event_ProviderVersion struct { func (x *BuildProviderPluginCache_Event_ProviderVersion) Reset() { *x = BuildProviderPluginCache_Event_ProviderVersion{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[67] + mi := &file_terraform1_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4261,7 +4375,7 @@ func (x *BuildProviderPluginCache_Event_ProviderVersion) String() string { func (*BuildProviderPluginCache_Event_ProviderVersion) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_ProviderVersion) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[67] + mi := &file_terraform1_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4274,7 +4388,7 @@ func (x *BuildProviderPluginCache_Event_ProviderVersion) ProtoReflect() protoref // Deprecated: Use BuildProviderPluginCache_Event_ProviderVersion.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Event_ProviderVersion) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{11, 1, 2} + return file_terraform1_proto_rawDescGZIP(), []int{12, 1, 2} } func (x *BuildProviderPluginCache_Event_ProviderVersion) GetSourceAddr() string { @@ -4303,7 +4417,7 @@ type BuildProviderPluginCache_Event_ProviderWarnings struct { func (x *BuildProviderPluginCache_Event_ProviderWarnings) Reset() { *x = BuildProviderPluginCache_Event_ProviderWarnings{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[68] + mi := &file_terraform1_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4316,7 +4430,7 @@ func (x *BuildProviderPluginCache_Event_ProviderWarnings) String() string { func (*BuildProviderPluginCache_Event_ProviderWarnings) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_ProviderWarnings) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[68] + mi := &file_terraform1_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4329,7 +4443,7 @@ func (x *BuildProviderPluginCache_Event_ProviderWarnings) ProtoReflect() protore // Deprecated: Use BuildProviderPluginCache_Event_ProviderWarnings.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Event_ProviderWarnings) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{11, 1, 3} + return file_terraform1_proto_rawDescGZIP(), []int{12, 1, 3} } func (x *BuildProviderPluginCache_Event_ProviderWarnings) GetSourceAddr() string { @@ -4358,7 +4472,7 @@ type BuildProviderPluginCache_Event_FetchBegin struct { func (x *BuildProviderPluginCache_Event_FetchBegin) Reset() { *x = BuildProviderPluginCache_Event_FetchBegin{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[69] + mi := &file_terraform1_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4371,7 +4485,7 @@ func (x *BuildProviderPluginCache_Event_FetchBegin) String() string { func (*BuildProviderPluginCache_Event_FetchBegin) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_FetchBegin) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[69] + mi := &file_terraform1_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4384,7 +4498,7 @@ func (x *BuildProviderPluginCache_Event_FetchBegin) ProtoReflect() protoreflect. // Deprecated: Use BuildProviderPluginCache_Event_FetchBegin.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Event_FetchBegin) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{11, 1, 4} + return file_terraform1_proto_rawDescGZIP(), []int{12, 1, 4} } func (x *BuildProviderPluginCache_Event_FetchBegin) GetProviderVersion() *BuildProviderPluginCache_Event_ProviderVersion { @@ -4419,7 +4533,7 @@ type BuildProviderPluginCache_Event_FetchComplete struct { func (x *BuildProviderPluginCache_Event_FetchComplete) Reset() { *x = BuildProviderPluginCache_Event_FetchComplete{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[70] + mi := &file_terraform1_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4432,7 +4546,7 @@ func (x *BuildProviderPluginCache_Event_FetchComplete) String() string { func (*BuildProviderPluginCache_Event_FetchComplete) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_FetchComplete) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[70] + mi := &file_terraform1_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4445,7 +4559,7 @@ func (x *BuildProviderPluginCache_Event_FetchComplete) ProtoReflect() protorefle // Deprecated: Use BuildProviderPluginCache_Event_FetchComplete.ProtoReflect.Descriptor instead. func (*BuildProviderPluginCache_Event_FetchComplete) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{11, 1, 5} + return file_terraform1_proto_rawDescGZIP(), []int{12, 1, 5} } func (x *BuildProviderPluginCache_Event_FetchComplete) GetProviderVersion() *BuildProviderPluginCache_Event_ProviderVersion { @@ -4489,7 +4603,7 @@ type OpenProviderPluginCache_Request struct { func (x *OpenProviderPluginCache_Request) Reset() { *x = OpenProviderPluginCache_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[71] + mi := &file_terraform1_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4502,7 +4616,7 @@ func (x *OpenProviderPluginCache_Request) String() string { func (*OpenProviderPluginCache_Request) ProtoMessage() {} func (x *OpenProviderPluginCache_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[71] + mi := &file_terraform1_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4515,7 +4629,7 @@ func (x *OpenProviderPluginCache_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenProviderPluginCache_Request.ProtoReflect.Descriptor instead. func (*OpenProviderPluginCache_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{12, 0} + return file_terraform1_proto_rawDescGZIP(), []int{13, 0} } func (x *OpenProviderPluginCache_Request) GetCacheDir() string { @@ -4543,7 +4657,7 @@ type OpenProviderPluginCache_Response struct { func (x *OpenProviderPluginCache_Response) Reset() { *x = OpenProviderPluginCache_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[72] + mi := &file_terraform1_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4556,7 +4670,7 @@ func (x *OpenProviderPluginCache_Response) String() string { func (*OpenProviderPluginCache_Response) ProtoMessage() {} func (x *OpenProviderPluginCache_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[72] + mi := &file_terraform1_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4569,7 +4683,7 @@ func (x *OpenProviderPluginCache_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenProviderPluginCache_Response.ProtoReflect.Descriptor instead. func (*OpenProviderPluginCache_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{12, 1} + return file_terraform1_proto_rawDescGZIP(), []int{13, 1} } func (x *OpenProviderPluginCache_Response) GetProviderCacheHandle() int64 { @@ -4590,7 +4704,7 @@ type CloseProviderPluginCache_Request struct { func (x *CloseProviderPluginCache_Request) Reset() { *x = CloseProviderPluginCache_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[73] + mi := &file_terraform1_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4603,7 +4717,7 @@ func (x *CloseProviderPluginCache_Request) String() string { func (*CloseProviderPluginCache_Request) ProtoMessage() {} func (x *CloseProviderPluginCache_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[73] + mi := &file_terraform1_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4616,7 +4730,7 @@ func (x *CloseProviderPluginCache_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseProviderPluginCache_Request.ProtoReflect.Descriptor instead. func (*CloseProviderPluginCache_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{13, 0} + return file_terraform1_proto_rawDescGZIP(), []int{14, 0} } func (x *CloseProviderPluginCache_Request) GetProviderCacheHandle() int64 { @@ -4635,7 +4749,7 @@ type CloseProviderPluginCache_Response struct { func (x *CloseProviderPluginCache_Response) Reset() { *x = CloseProviderPluginCache_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[74] + mi := &file_terraform1_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4648,7 +4762,7 @@ func (x *CloseProviderPluginCache_Response) String() string { func (*CloseProviderPluginCache_Response) ProtoMessage() {} func (x *CloseProviderPluginCache_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[74] + mi := &file_terraform1_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4661,7 +4775,7 @@ func (x *CloseProviderPluginCache_Response) ProtoReflect() protoreflect.Message // Deprecated: Use CloseProviderPluginCache_Response.ProtoReflect.Descriptor instead. func (*CloseProviderPluginCache_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{13, 1} + return file_terraform1_proto_rawDescGZIP(), []int{14, 1} } type GetCachedProviders_Request struct { @@ -4675,7 +4789,7 @@ type GetCachedProviders_Request struct { func (x *GetCachedProviders_Request) Reset() { *x = GetCachedProviders_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[75] + mi := &file_terraform1_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4688,7 +4802,7 @@ func (x *GetCachedProviders_Request) String() string { func (*GetCachedProviders_Request) ProtoMessage() {} func (x *GetCachedProviders_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[75] + mi := &file_terraform1_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4701,7 +4815,7 @@ func (x *GetCachedProviders_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCachedProviders_Request.ProtoReflect.Descriptor instead. func (*GetCachedProviders_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{14, 0} + return file_terraform1_proto_rawDescGZIP(), []int{15, 0} } func (x *GetCachedProviders_Request) GetProviderCacheHandle() int64 { @@ -4722,7 +4836,7 @@ type GetCachedProviders_Response struct { func (x *GetCachedProviders_Response) Reset() { *x = GetCachedProviders_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[76] + mi := &file_terraform1_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4735,7 +4849,7 @@ func (x *GetCachedProviders_Response) String() string { func (*GetCachedProviders_Response) ProtoMessage() {} func (x *GetCachedProviders_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[76] + mi := &file_terraform1_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4748,7 +4862,7 @@ func (x *GetCachedProviders_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCachedProviders_Response.ProtoReflect.Descriptor instead. func (*GetCachedProviders_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{14, 1} + return file_terraform1_proto_rawDescGZIP(), []int{15, 1} } func (x *GetCachedProviders_Response) GetAvailableProviders() []*ProviderPackage { @@ -4767,7 +4881,7 @@ type GetBuiltInProviders_Request struct { func (x *GetBuiltInProviders_Request) Reset() { *x = GetBuiltInProviders_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[77] + mi := &file_terraform1_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4780,7 +4894,7 @@ func (x *GetBuiltInProviders_Request) String() string { func (*GetBuiltInProviders_Request) ProtoMessage() {} func (x *GetBuiltInProviders_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[77] + mi := &file_terraform1_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4793,7 +4907,7 @@ func (x *GetBuiltInProviders_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBuiltInProviders_Request.ProtoReflect.Descriptor instead. func (*GetBuiltInProviders_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{15, 0} + return file_terraform1_proto_rawDescGZIP(), []int{16, 0} } type GetBuiltInProviders_Response struct { @@ -4814,7 +4928,7 @@ type GetBuiltInProviders_Response struct { func (x *GetBuiltInProviders_Response) Reset() { *x = GetBuiltInProviders_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[78] + mi := &file_terraform1_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4827,7 +4941,7 @@ func (x *GetBuiltInProviders_Response) String() string { func (*GetBuiltInProviders_Response) ProtoMessage() {} func (x *GetBuiltInProviders_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[78] + mi := &file_terraform1_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4840,7 +4954,7 @@ func (x *GetBuiltInProviders_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBuiltInProviders_Response.ProtoReflect.Descriptor instead. func (*GetBuiltInProviders_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{15, 1} + return file_terraform1_proto_rawDescGZIP(), []int{16, 1} } func (x *GetBuiltInProviders_Response) GetAvailableProviders() []*ProviderPackage { @@ -4884,7 +4998,7 @@ type GetProviderSchema_Request struct { func (x *GetProviderSchema_Request) Reset() { *x = GetProviderSchema_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[79] + mi := &file_terraform1_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4897,7 +5011,7 @@ func (x *GetProviderSchema_Request) String() string { func (*GetProviderSchema_Request) ProtoMessage() {} func (x *GetProviderSchema_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[79] + mi := &file_terraform1_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4910,7 +5024,7 @@ func (x *GetProviderSchema_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProviderSchema_Request.ProtoReflect.Descriptor instead. func (*GetProviderSchema_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{16, 0} + return file_terraform1_proto_rawDescGZIP(), []int{17, 0} } func (x *GetProviderSchema_Request) GetProviderAddr() string { @@ -4945,7 +5059,7 @@ type GetProviderSchema_Response struct { func (x *GetProviderSchema_Response) Reset() { *x = GetProviderSchema_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[80] + mi := &file_terraform1_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4958,7 +5072,7 @@ func (x *GetProviderSchema_Response) String() string { func (*GetProviderSchema_Response) ProtoMessage() {} func (x *GetProviderSchema_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[80] + mi := &file_terraform1_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4971,7 +5085,7 @@ func (x *GetProviderSchema_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProviderSchema_Response.ProtoReflect.Descriptor instead. func (*GetProviderSchema_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{16, 1} + return file_terraform1_proto_rawDescGZIP(), []int{17, 1} } func (x *GetProviderSchema_Response) GetSchema() *ProviderSchema { @@ -4993,7 +5107,7 @@ type OpenStackConfiguration_Request struct { func (x *OpenStackConfiguration_Request) Reset() { *x = OpenStackConfiguration_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[83] + mi := &file_terraform1_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5006,7 +5120,7 @@ func (x *OpenStackConfiguration_Request) String() string { func (*OpenStackConfiguration_Request) ProtoMessage() {} func (x *OpenStackConfiguration_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[83] + mi := &file_terraform1_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5019,7 +5133,7 @@ func (x *OpenStackConfiguration_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenStackConfiguration_Request.ProtoReflect.Descriptor instead. func (*OpenStackConfiguration_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{19, 0} + return file_terraform1_proto_rawDescGZIP(), []int{20, 0} } func (x *OpenStackConfiguration_Request) GetSourceBundleHandle() int64 { @@ -5048,7 +5162,7 @@ type OpenStackConfiguration_Response struct { func (x *OpenStackConfiguration_Response) Reset() { *x = OpenStackConfiguration_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[84] + mi := &file_terraform1_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5061,7 +5175,7 @@ func (x *OpenStackConfiguration_Response) String() string { func (*OpenStackConfiguration_Response) ProtoMessage() {} func (x *OpenStackConfiguration_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[84] + mi := &file_terraform1_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5074,7 +5188,7 @@ func (x *OpenStackConfiguration_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenStackConfiguration_Response.ProtoReflect.Descriptor instead. func (*OpenStackConfiguration_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{19, 1} + return file_terraform1_proto_rawDescGZIP(), []int{20, 1} } func (x *OpenStackConfiguration_Response) GetStackConfigHandle() int64 { @@ -5102,7 +5216,7 @@ type CloseStackConfiguration_Request struct { func (x *CloseStackConfiguration_Request) Reset() { *x = CloseStackConfiguration_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[85] + mi := &file_terraform1_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5115,7 +5229,7 @@ func (x *CloseStackConfiguration_Request) String() string { func (*CloseStackConfiguration_Request) ProtoMessage() {} func (x *CloseStackConfiguration_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[85] + mi := &file_terraform1_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5128,7 +5242,7 @@ func (x *CloseStackConfiguration_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseStackConfiguration_Request.ProtoReflect.Descriptor instead. func (*CloseStackConfiguration_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{20, 0} + return file_terraform1_proto_rawDescGZIP(), []int{21, 0} } func (x *CloseStackConfiguration_Request) GetStackConfigHandle() int64 { @@ -5147,7 +5261,7 @@ type CloseStackConfiguration_Response struct { func (x *CloseStackConfiguration_Response) Reset() { *x = CloseStackConfiguration_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[86] + mi := &file_terraform1_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5160,7 +5274,7 @@ func (x *CloseStackConfiguration_Response) String() string { func (*CloseStackConfiguration_Response) ProtoMessage() {} func (x *CloseStackConfiguration_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[86] + mi := &file_terraform1_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5173,7 +5287,7 @@ func (x *CloseStackConfiguration_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseStackConfiguration_Response.ProtoReflect.Descriptor instead. func (*CloseStackConfiguration_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{20, 1} + return file_terraform1_proto_rawDescGZIP(), []int{21, 1} } type ValidateStackConfiguration_Request struct { @@ -5189,7 +5303,7 @@ type ValidateStackConfiguration_Request struct { func (x *ValidateStackConfiguration_Request) Reset() { *x = ValidateStackConfiguration_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[87] + mi := &file_terraform1_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5202,7 +5316,7 @@ func (x *ValidateStackConfiguration_Request) String() string { func (*ValidateStackConfiguration_Request) ProtoMessage() {} func (x *ValidateStackConfiguration_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[87] + mi := &file_terraform1_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5215,7 +5329,7 @@ func (x *ValidateStackConfiguration_Request) ProtoReflect() protoreflect.Message // Deprecated: Use ValidateStackConfiguration_Request.ProtoReflect.Descriptor instead. func (*ValidateStackConfiguration_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{21, 0} + return file_terraform1_proto_rawDescGZIP(), []int{22, 0} } func (x *ValidateStackConfiguration_Request) GetStackConfigHandle() int64 { @@ -5250,7 +5364,7 @@ type ValidateStackConfiguration_Response struct { func (x *ValidateStackConfiguration_Response) Reset() { *x = ValidateStackConfiguration_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[88] + mi := &file_terraform1_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5263,7 +5377,7 @@ func (x *ValidateStackConfiguration_Response) String() string { func (*ValidateStackConfiguration_Response) ProtoMessage() {} func (x *ValidateStackConfiguration_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[88] + mi := &file_terraform1_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5276,7 +5390,7 @@ func (x *ValidateStackConfiguration_Response) ProtoReflect() protoreflect.Messag // Deprecated: Use ValidateStackConfiguration_Response.ProtoReflect.Descriptor instead. func (*ValidateStackConfiguration_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{21, 1} + return file_terraform1_proto_rawDescGZIP(), []int{22, 1} } func (x *ValidateStackConfiguration_Response) GetDiagnostics() []*Diagnostic { @@ -5297,7 +5411,7 @@ type FindStackConfigurationComponents_Request struct { func (x *FindStackConfigurationComponents_Request) Reset() { *x = FindStackConfigurationComponents_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[89] + mi := &file_terraform1_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5310,7 +5424,7 @@ func (x *FindStackConfigurationComponents_Request) String() string { func (*FindStackConfigurationComponents_Request) ProtoMessage() {} func (x *FindStackConfigurationComponents_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[89] + mi := &file_terraform1_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5323,7 +5437,7 @@ func (x *FindStackConfigurationComponents_Request) ProtoReflect() protoreflect.M // Deprecated: Use FindStackConfigurationComponents_Request.ProtoReflect.Descriptor instead. func (*FindStackConfigurationComponents_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{22, 0} + return file_terraform1_proto_rawDescGZIP(), []int{23, 0} } func (x *FindStackConfigurationComponents_Request) GetStackConfigHandle() int64 { @@ -5344,7 +5458,7 @@ type FindStackConfigurationComponents_Response struct { func (x *FindStackConfigurationComponents_Response) Reset() { *x = FindStackConfigurationComponents_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[90] + mi := &file_terraform1_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5357,7 +5471,7 @@ func (x *FindStackConfigurationComponents_Response) String() string { func (*FindStackConfigurationComponents_Response) ProtoMessage() {} func (x *FindStackConfigurationComponents_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[90] + mi := &file_terraform1_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5370,7 +5484,7 @@ func (x *FindStackConfigurationComponents_Response) ProtoReflect() protoreflect. // Deprecated: Use FindStackConfigurationComponents_Response.ProtoReflect.Descriptor instead. func (*FindStackConfigurationComponents_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{22, 1} + return file_terraform1_proto_rawDescGZIP(), []int{23, 1} } func (x *FindStackConfigurationComponents_Response) GetConfig() *FindStackConfigurationComponents_StackConfig { @@ -5392,7 +5506,7 @@ type FindStackConfigurationComponents_StackConfig struct { func (x *FindStackConfigurationComponents_StackConfig) Reset() { *x = FindStackConfigurationComponents_StackConfig{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[91] + mi := &file_terraform1_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5405,7 +5519,7 @@ func (x *FindStackConfigurationComponents_StackConfig) String() string { func (*FindStackConfigurationComponents_StackConfig) ProtoMessage() {} func (x *FindStackConfigurationComponents_StackConfig) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[91] + mi := &file_terraform1_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5418,7 +5532,7 @@ func (x *FindStackConfigurationComponents_StackConfig) ProtoReflect() protorefle // Deprecated: Use FindStackConfigurationComponents_StackConfig.ProtoReflect.Descriptor instead. func (*FindStackConfigurationComponents_StackConfig) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{22, 2} + return file_terraform1_proto_rawDescGZIP(), []int{23, 2} } func (x *FindStackConfigurationComponents_StackConfig) GetComponents() map[string]*FindStackConfigurationComponents_Component { @@ -5448,7 +5562,7 @@ type FindStackConfigurationComponents_EmbeddedStack struct { func (x *FindStackConfigurationComponents_EmbeddedStack) Reset() { *x = FindStackConfigurationComponents_EmbeddedStack{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[92] + mi := &file_terraform1_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5461,7 +5575,7 @@ func (x *FindStackConfigurationComponents_EmbeddedStack) String() string { func (*FindStackConfigurationComponents_EmbeddedStack) ProtoMessage() {} func (x *FindStackConfigurationComponents_EmbeddedStack) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[92] + mi := &file_terraform1_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5474,7 +5588,7 @@ func (x *FindStackConfigurationComponents_EmbeddedStack) ProtoReflect() protoref // Deprecated: Use FindStackConfigurationComponents_EmbeddedStack.ProtoReflect.Descriptor instead. func (*FindStackConfigurationComponents_EmbeddedStack) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{22, 3} + return file_terraform1_proto_rawDescGZIP(), []int{23, 3} } func (x *FindStackConfigurationComponents_EmbeddedStack) GetSourceAddr() string { @@ -5511,7 +5625,7 @@ type FindStackConfigurationComponents_Component struct { func (x *FindStackConfigurationComponents_Component) Reset() { *x = FindStackConfigurationComponents_Component{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[93] + mi := &file_terraform1_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5524,7 +5638,7 @@ func (x *FindStackConfigurationComponents_Component) String() string { func (*FindStackConfigurationComponents_Component) ProtoMessage() {} func (x *FindStackConfigurationComponents_Component) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[93] + mi := &file_terraform1_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5537,7 +5651,7 @@ func (x *FindStackConfigurationComponents_Component) ProtoReflect() protoreflect // Deprecated: Use FindStackConfigurationComponents_Component.ProtoReflect.Descriptor instead. func (*FindStackConfigurationComponents_Component) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{22, 4} + return file_terraform1_proto_rawDescGZIP(), []int{23, 4} } func (x *FindStackConfigurationComponents_Component) GetSourceAddr() string { @@ -5577,7 +5691,7 @@ type PlanStackChanges_Request struct { func (x *PlanStackChanges_Request) Reset() { *x = PlanStackChanges_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[96] + mi := &file_terraform1_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5590,7 +5704,7 @@ func (x *PlanStackChanges_Request) String() string { func (*PlanStackChanges_Request) ProtoMessage() {} func (x *PlanStackChanges_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[96] + mi := &file_terraform1_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5603,7 +5717,7 @@ func (x *PlanStackChanges_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use PlanStackChanges_Request.ProtoReflect.Descriptor instead. func (*PlanStackChanges_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{23, 0} + return file_terraform1_proto_rawDescGZIP(), []int{24, 0} } func (x *PlanStackChanges_Request) GetPlanMode() PlanMode { @@ -5664,7 +5778,7 @@ type PlanStackChanges_Event struct { func (x *PlanStackChanges_Event) Reset() { *x = PlanStackChanges_Event{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[97] + mi := &file_terraform1_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5677,7 +5791,7 @@ func (x *PlanStackChanges_Event) String() string { func (*PlanStackChanges_Event) ProtoMessage() {} func (x *PlanStackChanges_Event) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[97] + mi := &file_terraform1_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5690,7 +5804,7 @@ func (x *PlanStackChanges_Event) ProtoReflect() protoreflect.Message { // Deprecated: Use PlanStackChanges_Event.ProtoReflect.Descriptor instead. func (*PlanStackChanges_Event) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{23, 1} + return file_terraform1_proto_rawDescGZIP(), []int{24, 1} } func (m *PlanStackChanges_Event) GetEvent() isPlanStackChanges_Event_Event { @@ -5774,7 +5888,7 @@ type ApplyStackChanges_Request struct { func (x *ApplyStackChanges_Request) Reset() { *x = ApplyStackChanges_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[100] + mi := &file_terraform1_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5787,7 +5901,7 @@ func (x *ApplyStackChanges_Request) String() string { func (*ApplyStackChanges_Request) ProtoMessage() {} func (x *ApplyStackChanges_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[100] + mi := &file_terraform1_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5800,7 +5914,7 @@ func (x *ApplyStackChanges_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplyStackChanges_Request.ProtoReflect.Descriptor instead. func (*ApplyStackChanges_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{24, 0} + return file_terraform1_proto_rawDescGZIP(), []int{25, 0} } func (x *ApplyStackChanges_Request) GetStackConfigHandle() int64 { @@ -5854,7 +5968,7 @@ type ApplyStackChanges_Event struct { func (x *ApplyStackChanges_Event) Reset() { *x = ApplyStackChanges_Event{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[101] + mi := &file_terraform1_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5867,7 +5981,7 @@ func (x *ApplyStackChanges_Event) String() string { func (*ApplyStackChanges_Event) ProtoMessage() {} func (x *ApplyStackChanges_Event) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[101] + mi := &file_terraform1_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5880,7 +5994,7 @@ func (x *ApplyStackChanges_Event) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplyStackChanges_Event.ProtoReflect.Descriptor instead. func (*ApplyStackChanges_Event) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{24, 1} + return file_terraform1_proto_rawDescGZIP(), []int{25, 1} } func (m *ApplyStackChanges_Event) GetEvent() isApplyStackChanges_Event_Event { @@ -5948,7 +6062,7 @@ type OpenStackInspector_Request struct { func (x *OpenStackInspector_Request) Reset() { *x = OpenStackInspector_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[102] + mi := &file_terraform1_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5961,7 +6075,7 @@ func (x *OpenStackInspector_Request) String() string { func (*OpenStackInspector_Request) ProtoMessage() {} func (x *OpenStackInspector_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[102] + mi := &file_terraform1_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5974,7 +6088,7 @@ func (x *OpenStackInspector_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenStackInspector_Request.ProtoReflect.Descriptor instead. func (*OpenStackInspector_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{25, 0} + return file_terraform1_proto_rawDescGZIP(), []int{26, 0} } func (x *OpenStackInspector_Request) GetStackConfigHandle() int64 { @@ -6024,7 +6138,7 @@ type OpenStackInspector_Response struct { func (x *OpenStackInspector_Response) Reset() { *x = OpenStackInspector_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[103] + mi := &file_terraform1_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6037,7 +6151,7 @@ func (x *OpenStackInspector_Response) String() string { func (*OpenStackInspector_Response) ProtoMessage() {} func (x *OpenStackInspector_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[103] + mi := &file_terraform1_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6050,7 +6164,7 @@ func (x *OpenStackInspector_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenStackInspector_Response.ProtoReflect.Descriptor instead. func (*OpenStackInspector_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{25, 1} + return file_terraform1_proto_rawDescGZIP(), []int{26, 1} } func (x *OpenStackInspector_Response) GetStackInspectorHandle() int64 { @@ -6080,7 +6194,7 @@ type InspectExpressionResult_Request struct { func (x *InspectExpressionResult_Request) Reset() { *x = InspectExpressionResult_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[106] + mi := &file_terraform1_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6093,7 +6207,7 @@ func (x *InspectExpressionResult_Request) String() string { func (*InspectExpressionResult_Request) ProtoMessage() {} func (x *InspectExpressionResult_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[106] + mi := &file_terraform1_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6106,7 +6220,7 @@ func (x *InspectExpressionResult_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use InspectExpressionResult_Request.ProtoReflect.Descriptor instead. func (*InspectExpressionResult_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{26, 0} + return file_terraform1_proto_rawDescGZIP(), []int{27, 0} } func (x *InspectExpressionResult_Request) GetStackInspectorHandle() int64 { @@ -6148,7 +6262,7 @@ type InspectExpressionResult_Response struct { func (x *InspectExpressionResult_Response) Reset() { *x = InspectExpressionResult_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[107] + mi := &file_terraform1_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6161,7 +6275,7 @@ func (x *InspectExpressionResult_Response) String() string { func (*InspectExpressionResult_Response) ProtoMessage() {} func (x *InspectExpressionResult_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[107] + mi := &file_terraform1_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6174,7 +6288,7 @@ func (x *InspectExpressionResult_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use InspectExpressionResult_Response.ProtoReflect.Descriptor instead. func (*InspectExpressionResult_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{26, 1} + return file_terraform1_proto_rawDescGZIP(), []int{27, 1} } func (x *InspectExpressionResult_Response) GetResult() *DynamicValue { @@ -6207,7 +6321,7 @@ type AttributePath_Step struct { func (x *AttributePath_Step) Reset() { *x = AttributePath_Step{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[108] + mi := &file_terraform1_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6220,7 +6334,7 @@ func (x *AttributePath_Step) String() string { func (*AttributePath_Step) ProtoMessage() {} func (x *AttributePath_Step) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[108] + mi := &file_terraform1_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6233,7 +6347,7 @@ func (x *AttributePath_Step) ProtoReflect() protoreflect.Message { // Deprecated: Use AttributePath_Step.ProtoReflect.Descriptor instead. func (*AttributePath_Step) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{30, 0} + return file_terraform1_proto_rawDescGZIP(), []int{31, 0} } func (m *AttributePath_Step) GetSelector() isAttributePath_Step_Selector { @@ -6315,7 +6429,7 @@ type PlannedChange_ChangeDescription struct { func (x *PlannedChange_ChangeDescription) Reset() { *x = PlannedChange_ChangeDescription{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[109] + mi := &file_terraform1_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6328,7 +6442,7 @@ func (x *PlannedChange_ChangeDescription) String() string { func (*PlannedChange_ChangeDescription) ProtoMessage() {} func (x *PlannedChange_ChangeDescription) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[109] + mi := &file_terraform1_proto_msgTypes[112] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6341,7 +6455,7 @@ func (x *PlannedChange_ChangeDescription) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedChange_ChangeDescription.ProtoReflect.Descriptor instead. func (*PlannedChange_ChangeDescription) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 0} + return file_terraform1_proto_rawDescGZIP(), []int{36, 0} } func (m *PlannedChange_ChangeDescription) GetDescription() isPlannedChange_ChangeDescription_Description { @@ -6442,7 +6556,7 @@ type PlannedChange_ComponentInstance struct { func (x *PlannedChange_ComponentInstance) Reset() { *x = PlannedChange_ComponentInstance{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[110] + mi := &file_terraform1_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6455,7 +6569,7 @@ func (x *PlannedChange_ComponentInstance) String() string { func (*PlannedChange_ComponentInstance) ProtoMessage() {} func (x *PlannedChange_ComponentInstance) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[110] + mi := &file_terraform1_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6468,7 +6582,7 @@ func (x *PlannedChange_ComponentInstance) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedChange_ComponentInstance.ProtoReflect.Descriptor instead. func (*PlannedChange_ComponentInstance) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 1} + return file_terraform1_proto_rawDescGZIP(), []int{36, 1} } func (x *PlannedChange_ComponentInstance) GetAddr() *ComponentInstanceInStackAddr { @@ -6531,7 +6645,7 @@ type PlannedChange_ResourceInstance struct { func (x *PlannedChange_ResourceInstance) Reset() { *x = PlannedChange_ResourceInstance{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[111] + mi := &file_terraform1_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6544,7 +6658,7 @@ func (x *PlannedChange_ResourceInstance) String() string { func (*PlannedChange_ResourceInstance) ProtoMessage() {} func (x *PlannedChange_ResourceInstance) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[111] + mi := &file_terraform1_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6557,7 +6671,7 @@ func (x *PlannedChange_ResourceInstance) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedChange_ResourceInstance.ProtoReflect.Descriptor instead. func (*PlannedChange_ResourceInstance) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 2} + return file_terraform1_proto_rawDescGZIP(), []int{36, 2} } func (x *PlannedChange_ResourceInstance) GetAddr() *ResourceInstanceObjectInStackAddr { @@ -6653,7 +6767,7 @@ type PlannedChange_OutputValue struct { func (x *PlannedChange_OutputValue) Reset() { *x = PlannedChange_OutputValue{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[112] + mi := &file_terraform1_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6666,7 +6780,7 @@ func (x *PlannedChange_OutputValue) String() string { func (*PlannedChange_OutputValue) ProtoMessage() {} func (x *PlannedChange_OutputValue) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[112] + mi := &file_terraform1_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6679,7 +6793,7 @@ func (x *PlannedChange_OutputValue) ProtoReflect() protoreflect.Message { // Deprecated: Use PlannedChange_OutputValue.ProtoReflect.Descriptor instead. func (*PlannedChange_OutputValue) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 3} + return file_terraform1_proto_rawDescGZIP(), []int{36, 3} } func (x *PlannedChange_OutputValue) GetName() string { @@ -6714,7 +6828,7 @@ type PlannedChange_ResourceInstance_Moved struct { func (x *PlannedChange_ResourceInstance_Moved) Reset() { *x = PlannedChange_ResourceInstance_Moved{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[113] + mi := &file_terraform1_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6727,7 +6841,7 @@ func (x *PlannedChange_ResourceInstance_Moved) String() string { func (*PlannedChange_ResourceInstance_Moved) ProtoMessage() {} func (x *PlannedChange_ResourceInstance_Moved) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[113] + mi := &file_terraform1_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6740,7 +6854,7 @@ func (x *PlannedChange_ResourceInstance_Moved) ProtoReflect() protoreflect.Messa // Deprecated: Use PlannedChange_ResourceInstance_Moved.ProtoReflect.Descriptor instead. func (*PlannedChange_ResourceInstance_Moved) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 2, 0} + return file_terraform1_proto_rawDescGZIP(), []int{36, 2, 0} } func (x *PlannedChange_ResourceInstance_Moved) GetPrevAddr() *ResourceInstanceInStackAddr { @@ -6761,7 +6875,7 @@ type PlannedChange_ResourceInstance_Imported struct { func (x *PlannedChange_ResourceInstance_Imported) Reset() { *x = PlannedChange_ResourceInstance_Imported{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[114] + mi := &file_terraform1_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6774,7 +6888,7 @@ func (x *PlannedChange_ResourceInstance_Imported) String() string { func (*PlannedChange_ResourceInstance_Imported) ProtoMessage() {} func (x *PlannedChange_ResourceInstance_Imported) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[114] + mi := &file_terraform1_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6787,7 +6901,7 @@ func (x *PlannedChange_ResourceInstance_Imported) ProtoReflect() protoreflect.Me // Deprecated: Use PlannedChange_ResourceInstance_Imported.ProtoReflect.Descriptor instead. func (*PlannedChange_ResourceInstance_Imported) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{35, 2, 1} + return file_terraform1_proto_rawDescGZIP(), []int{36, 2, 1} } func (x *PlannedChange_ResourceInstance_Imported) GetImportId() string { @@ -6809,7 +6923,7 @@ type AppliedChange_RawChange struct { func (x *AppliedChange_RawChange) Reset() { *x = AppliedChange_RawChange{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[115] + mi := &file_terraform1_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6822,7 +6936,7 @@ func (x *AppliedChange_RawChange) String() string { func (*AppliedChange_RawChange) ProtoMessage() {} func (x *AppliedChange_RawChange) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[115] + mi := &file_terraform1_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6835,7 +6949,7 @@ func (x *AppliedChange_RawChange) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_RawChange.ProtoReflect.Descriptor instead. func (*AppliedChange_RawChange) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{36, 0} + return file_terraform1_proto_rawDescGZIP(), []int{37, 0} } func (x *AppliedChange_RawChange) GetKey() string { @@ -6870,7 +6984,7 @@ type AppliedChange_ChangeDescription struct { func (x *AppliedChange_ChangeDescription) Reset() { *x = AppliedChange_ChangeDescription{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[116] + mi := &file_terraform1_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6883,7 +6997,7 @@ func (x *AppliedChange_ChangeDescription) String() string { func (*AppliedChange_ChangeDescription) ProtoMessage() {} func (x *AppliedChange_ChangeDescription) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[116] + mi := &file_terraform1_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6896,7 +7010,7 @@ func (x *AppliedChange_ChangeDescription) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_ChangeDescription.ProtoReflect.Descriptor instead. func (*AppliedChange_ChangeDescription) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{36, 1} + return file_terraform1_proto_rawDescGZIP(), []int{37, 1} } func (x *AppliedChange_ChangeDescription) GetKey() string { @@ -7008,7 +7122,7 @@ type AppliedChange_ResourceInstance struct { func (x *AppliedChange_ResourceInstance) Reset() { *x = AppliedChange_ResourceInstance{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[117] + mi := &file_terraform1_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7021,7 +7135,7 @@ func (x *AppliedChange_ResourceInstance) String() string { func (*AppliedChange_ResourceInstance) ProtoMessage() {} func (x *AppliedChange_ResourceInstance) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[117] + mi := &file_terraform1_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7034,7 +7148,7 @@ func (x *AppliedChange_ResourceInstance) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_ResourceInstance.ProtoReflect.Descriptor instead. func (*AppliedChange_ResourceInstance) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{36, 2} + return file_terraform1_proto_rawDescGZIP(), []int{37, 2} } func (x *AppliedChange_ResourceInstance) GetAddr() *ResourceInstanceObjectInStackAddr { @@ -7092,7 +7206,7 @@ type AppliedChange_ComponentInstance struct { func (x *AppliedChange_ComponentInstance) Reset() { *x = AppliedChange_ComponentInstance{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[118] + mi := &file_terraform1_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7105,7 +7219,7 @@ func (x *AppliedChange_ComponentInstance) String() string { func (*AppliedChange_ComponentInstance) ProtoMessage() {} func (x *AppliedChange_ComponentInstance) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[118] + mi := &file_terraform1_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7118,7 +7232,7 @@ func (x *AppliedChange_ComponentInstance) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_ComponentInstance.ProtoReflect.Descriptor instead. func (*AppliedChange_ComponentInstance) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{36, 3} + return file_terraform1_proto_rawDescGZIP(), []int{37, 3} } func (x *AppliedChange_ComponentInstance) GetComponentAddr() string { @@ -7154,7 +7268,7 @@ type AppliedChange_OutputValue struct { func (x *AppliedChange_OutputValue) Reset() { *x = AppliedChange_OutputValue{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[119] + mi := &file_terraform1_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7167,7 +7281,7 @@ func (x *AppliedChange_OutputValue) String() string { func (*AppliedChange_OutputValue) ProtoMessage() {} func (x *AppliedChange_OutputValue) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[119] + mi := &file_terraform1_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7180,7 +7294,7 @@ func (x *AppliedChange_OutputValue) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_OutputValue.ProtoReflect.Descriptor instead. func (*AppliedChange_OutputValue) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{36, 4} + return file_terraform1_proto_rawDescGZIP(), []int{37, 4} } func (x *AppliedChange_OutputValue) GetName() string { @@ -7206,7 +7320,7 @@ type AppliedChange_Nothing struct { func (x *AppliedChange_Nothing) Reset() { *x = AppliedChange_Nothing{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[120] + mi := &file_terraform1_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7219,7 +7333,7 @@ func (x *AppliedChange_Nothing) String() string { func (*AppliedChange_Nothing) ProtoMessage() {} func (x *AppliedChange_Nothing) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[120] + mi := &file_terraform1_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7232,7 +7346,7 @@ func (x *AppliedChange_Nothing) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_Nothing.ProtoReflect.Descriptor instead. func (*AppliedChange_Nothing) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{36, 5} + return file_terraform1_proto_rawDescGZIP(), []int{37, 5} } // ComponentInstanceStatus describes the current status of a component instance @@ -7249,7 +7363,7 @@ type StackChangeProgress_ComponentInstanceStatus struct { func (x *StackChangeProgress_ComponentInstanceStatus) Reset() { *x = StackChangeProgress_ComponentInstanceStatus{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[122] + mi := &file_terraform1_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7262,7 +7376,7 @@ func (x *StackChangeProgress_ComponentInstanceStatus) String() string { func (*StackChangeProgress_ComponentInstanceStatus) ProtoMessage() {} func (x *StackChangeProgress_ComponentInstanceStatus) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[122] + mi := &file_terraform1_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7275,7 +7389,7 @@ func (x *StackChangeProgress_ComponentInstanceStatus) ProtoReflect() protoreflec // Deprecated: Use StackChangeProgress_ComponentInstanceStatus.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ComponentInstanceStatus) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 0} + return file_terraform1_proto_rawDescGZIP(), []int{38, 0} } func (x *StackChangeProgress_ComponentInstanceStatus) GetAddr() *ComponentInstanceInStackAddr { @@ -7307,7 +7421,7 @@ type StackChangeProgress_ResourceInstanceStatus struct { func (x *StackChangeProgress_ResourceInstanceStatus) Reset() { *x = StackChangeProgress_ResourceInstanceStatus{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[123] + mi := &file_terraform1_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7320,7 +7434,7 @@ func (x *StackChangeProgress_ResourceInstanceStatus) String() string { func (*StackChangeProgress_ResourceInstanceStatus) ProtoMessage() {} func (x *StackChangeProgress_ResourceInstanceStatus) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[123] + mi := &file_terraform1_proto_msgTypes[126] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7333,7 +7447,7 @@ func (x *StackChangeProgress_ResourceInstanceStatus) ProtoReflect() protoreflect // Deprecated: Use StackChangeProgress_ResourceInstanceStatus.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ResourceInstanceStatus) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 1} + return file_terraform1_proto_rawDescGZIP(), []int{38, 1} } func (x *StackChangeProgress_ResourceInstanceStatus) GetAddr() *ResourceInstanceObjectInStackAddr { @@ -7377,7 +7491,7 @@ type StackChangeProgress_ResourceInstancePlannedChange struct { func (x *StackChangeProgress_ResourceInstancePlannedChange) Reset() { *x = StackChangeProgress_ResourceInstancePlannedChange{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[124] + mi := &file_terraform1_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7390,7 +7504,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange) String() string { func (*StackChangeProgress_ResourceInstancePlannedChange) ProtoMessage() {} func (x *StackChangeProgress_ResourceInstancePlannedChange) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[124] + mi := &file_terraform1_proto_msgTypes[127] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7403,7 +7517,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange) ProtoReflect() proto // Deprecated: Use StackChangeProgress_ResourceInstancePlannedChange.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ResourceInstancePlannedChange) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 2} + return file_terraform1_proto_rawDescGZIP(), []int{38, 2} } func (x *StackChangeProgress_ResourceInstancePlannedChange) GetAddr() *ResourceInstanceObjectInStackAddr { @@ -7456,7 +7570,7 @@ type StackChangeProgress_ProvisionerStatus struct { func (x *StackChangeProgress_ProvisionerStatus) Reset() { *x = StackChangeProgress_ProvisionerStatus{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[125] + mi := &file_terraform1_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7469,7 +7583,7 @@ func (x *StackChangeProgress_ProvisionerStatus) String() string { func (*StackChangeProgress_ProvisionerStatus) ProtoMessage() {} func (x *StackChangeProgress_ProvisionerStatus) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[125] + mi := &file_terraform1_proto_msgTypes[128] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7482,7 +7596,7 @@ func (x *StackChangeProgress_ProvisionerStatus) ProtoReflect() protoreflect.Mess // Deprecated: Use StackChangeProgress_ProvisionerStatus.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ProvisionerStatus) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 3} + return file_terraform1_proto_rawDescGZIP(), []int{38, 3} } func (x *StackChangeProgress_ProvisionerStatus) GetAddr() *ResourceInstanceObjectInStackAddr { @@ -7521,7 +7635,7 @@ type StackChangeProgress_ProvisionerOutput struct { func (x *StackChangeProgress_ProvisionerOutput) Reset() { *x = StackChangeProgress_ProvisionerOutput{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[126] + mi := &file_terraform1_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7534,7 +7648,7 @@ func (x *StackChangeProgress_ProvisionerOutput) String() string { func (*StackChangeProgress_ProvisionerOutput) ProtoMessage() {} func (x *StackChangeProgress_ProvisionerOutput) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[126] + mi := &file_terraform1_proto_msgTypes[129] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7547,7 +7661,7 @@ func (x *StackChangeProgress_ProvisionerOutput) ProtoReflect() protoreflect.Mess // Deprecated: Use StackChangeProgress_ProvisionerOutput.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ProvisionerOutput) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 4} + return file_terraform1_proto_rawDescGZIP(), []int{38, 4} } func (x *StackChangeProgress_ProvisionerOutput) GetAddr() *ResourceInstanceObjectInStackAddr { @@ -7596,7 +7710,7 @@ type StackChangeProgress_ComponentInstanceChanges struct { func (x *StackChangeProgress_ComponentInstanceChanges) Reset() { *x = StackChangeProgress_ComponentInstanceChanges{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[127] + mi := &file_terraform1_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7609,7 +7723,7 @@ func (x *StackChangeProgress_ComponentInstanceChanges) String() string { func (*StackChangeProgress_ComponentInstanceChanges) ProtoMessage() {} func (x *StackChangeProgress_ComponentInstanceChanges) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[127] + mi := &file_terraform1_proto_msgTypes[130] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7622,7 +7736,7 @@ func (x *StackChangeProgress_ComponentInstanceChanges) ProtoReflect() protorefle // Deprecated: Use StackChangeProgress_ComponentInstanceChanges.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ComponentInstanceChanges) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 5} + return file_terraform1_proto_rawDescGZIP(), []int{38, 5} } func (x *StackChangeProgress_ComponentInstanceChanges) GetAddr() *ComponentInstanceInStackAddr { @@ -7681,7 +7795,7 @@ type StackChangeProgress_ComponentInstances struct { func (x *StackChangeProgress_ComponentInstances) Reset() { *x = StackChangeProgress_ComponentInstances{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[128] + mi := &file_terraform1_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7694,7 +7808,7 @@ func (x *StackChangeProgress_ComponentInstances) String() string { func (*StackChangeProgress_ComponentInstances) ProtoMessage() {} func (x *StackChangeProgress_ComponentInstances) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[128] + mi := &file_terraform1_proto_msgTypes[131] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7707,7 +7821,7 @@ func (x *StackChangeProgress_ComponentInstances) ProtoReflect() protoreflect.Mes // Deprecated: Use StackChangeProgress_ComponentInstances.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ComponentInstances) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 6} + return file_terraform1_proto_rawDescGZIP(), []int{38, 6} } func (x *StackChangeProgress_ComponentInstances) GetComponentAddr() string { @@ -7735,7 +7849,7 @@ type StackChangeProgress_ResourceInstancePlannedChange_Moved struct { func (x *StackChangeProgress_ResourceInstancePlannedChange_Moved) Reset() { *x = StackChangeProgress_ResourceInstancePlannedChange_Moved{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[129] + mi := &file_terraform1_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7748,7 +7862,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange_Moved) String() strin func (*StackChangeProgress_ResourceInstancePlannedChange_Moved) ProtoMessage() {} func (x *StackChangeProgress_ResourceInstancePlannedChange_Moved) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[129] + mi := &file_terraform1_proto_msgTypes[132] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7761,7 +7875,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange_Moved) ProtoReflect() // Deprecated: Use StackChangeProgress_ResourceInstancePlannedChange_Moved.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ResourceInstancePlannedChange_Moved) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 2, 0} + return file_terraform1_proto_rawDescGZIP(), []int{38, 2, 0} } func (x *StackChangeProgress_ResourceInstancePlannedChange_Moved) GetPrevAddr() *ResourceInstanceInStackAddr { @@ -7782,7 +7896,7 @@ type StackChangeProgress_ResourceInstancePlannedChange_Imported struct { func (x *StackChangeProgress_ResourceInstancePlannedChange_Imported) Reset() { *x = StackChangeProgress_ResourceInstancePlannedChange_Imported{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[130] + mi := &file_terraform1_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7795,7 +7909,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange_Imported) String() st func (*StackChangeProgress_ResourceInstancePlannedChange_Imported) ProtoMessage() {} func (x *StackChangeProgress_ResourceInstancePlannedChange_Imported) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[130] + mi := &file_terraform1_proto_msgTypes[133] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7808,7 +7922,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange_Imported) ProtoReflec // Deprecated: Use StackChangeProgress_ResourceInstancePlannedChange_Imported.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ResourceInstancePlannedChange_Imported) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 2, 1} + return file_terraform1_proto_rawDescGZIP(), []int{38, 2, 1} } func (x *StackChangeProgress_ResourceInstancePlannedChange_Imported) GetImportId() string { @@ -7832,7 +7946,7 @@ type Schema_Block struct { func (x *Schema_Block) Reset() { *x = Schema_Block{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[131] + mi := &file_terraform1_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7845,7 +7959,7 @@ func (x *Schema_Block) String() string { func (*Schema_Block) ProtoMessage() {} func (x *Schema_Block) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[131] + mi := &file_terraform1_proto_msgTypes[134] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7858,7 +7972,7 @@ func (x *Schema_Block) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema_Block.ProtoReflect.Descriptor instead. func (*Schema_Block) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{41, 0} + return file_terraform1_proto_rawDescGZIP(), []int{42, 0} } func (x *Schema_Block) GetAttributes() []*Schema_Attribute { @@ -7908,7 +8022,7 @@ type Schema_Attribute struct { func (x *Schema_Attribute) Reset() { *x = Schema_Attribute{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[132] + mi := &file_terraform1_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7921,7 +8035,7 @@ func (x *Schema_Attribute) String() string { func (*Schema_Attribute) ProtoMessage() {} func (x *Schema_Attribute) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[132] + mi := &file_terraform1_proto_msgTypes[135] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7934,7 +8048,7 @@ func (x *Schema_Attribute) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema_Attribute.ProtoReflect.Descriptor instead. func (*Schema_Attribute) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{41, 1} + return file_terraform1_proto_rawDescGZIP(), []int{42, 1} } func (x *Schema_Attribute) GetName() string { @@ -8013,7 +8127,7 @@ type Schema_NestedBlock struct { func (x *Schema_NestedBlock) Reset() { *x = Schema_NestedBlock{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[133] + mi := &file_terraform1_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8026,7 +8140,7 @@ func (x *Schema_NestedBlock) String() string { func (*Schema_NestedBlock) ProtoMessage() {} func (x *Schema_NestedBlock) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[133] + mi := &file_terraform1_proto_msgTypes[136] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8039,7 +8153,7 @@ func (x *Schema_NestedBlock) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema_NestedBlock.ProtoReflect.Descriptor instead. func (*Schema_NestedBlock) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{41, 2} + return file_terraform1_proto_rawDescGZIP(), []int{42, 2} } func (x *Schema_NestedBlock) GetTypeName() string { @@ -8075,7 +8189,7 @@ type Schema_Object struct { func (x *Schema_Object) Reset() { *x = Schema_Object{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[134] + mi := &file_terraform1_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8088,7 +8202,7 @@ func (x *Schema_Object) String() string { func (*Schema_Object) ProtoMessage() {} func (x *Schema_Object) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[134] + mi := &file_terraform1_proto_msgTypes[137] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8101,7 +8215,7 @@ func (x *Schema_Object) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema_Object.ProtoReflect.Descriptor instead. func (*Schema_Object) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{41, 3} + return file_terraform1_proto_rawDescGZIP(), []int{42, 3} } func (x *Schema_Object) GetAttributes() []*Schema_Attribute { @@ -8130,7 +8244,7 @@ type Schema_DocString struct { func (x *Schema_DocString) Reset() { *x = Schema_DocString{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[135] + mi := &file_terraform1_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8143,7 +8257,7 @@ func (x *Schema_DocString) String() string { func (*Schema_DocString) ProtoMessage() {} func (x *Schema_DocString) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[135] + mi := &file_terraform1_proto_msgTypes[138] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8156,7 +8270,7 @@ func (x *Schema_DocString) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema_DocString.ProtoReflect.Descriptor instead. func (*Schema_DocString) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{41, 4} + return file_terraform1_proto_rawDescGZIP(), []int{42, 4} } func (x *Schema_DocString) GetDescription() string { @@ -8184,7 +8298,7 @@ type ProviderPackageVersions_Request struct { func (x *ProviderPackageVersions_Request) Reset() { *x = ProviderPackageVersions_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[136] + mi := &file_terraform1_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8197,7 +8311,7 @@ func (x *ProviderPackageVersions_Request) String() string { func (*ProviderPackageVersions_Request) ProtoMessage() {} func (x *ProviderPackageVersions_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[136] + mi := &file_terraform1_proto_msgTypes[139] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8210,7 +8324,7 @@ func (x *ProviderPackageVersions_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use ProviderPackageVersions_Request.ProtoReflect.Descriptor instead. func (*ProviderPackageVersions_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{42, 0} + return file_terraform1_proto_rawDescGZIP(), []int{43, 0} } func (x *ProviderPackageVersions_Request) GetSourceAddr() string { @@ -8232,7 +8346,7 @@ type ProviderPackageVersions_Response struct { func (x *ProviderPackageVersions_Response) Reset() { *x = ProviderPackageVersions_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[137] + mi := &file_terraform1_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8245,7 +8359,7 @@ func (x *ProviderPackageVersions_Response) String() string { func (*ProviderPackageVersions_Response) ProtoMessage() {} func (x *ProviderPackageVersions_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[137] + mi := &file_terraform1_proto_msgTypes[140] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8258,7 +8372,7 @@ func (x *ProviderPackageVersions_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use ProviderPackageVersions_Response.ProtoReflect.Descriptor instead. func (*ProviderPackageVersions_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{42, 1} + return file_terraform1_proto_rawDescGZIP(), []int{43, 1} } func (x *ProviderPackageVersions_Response) GetVersions() []string { @@ -8290,7 +8404,7 @@ type FetchProviderPackage_Request struct { func (x *FetchProviderPackage_Request) Reset() { *x = FetchProviderPackage_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[138] + mi := &file_terraform1_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8303,7 +8417,7 @@ func (x *FetchProviderPackage_Request) String() string { func (*FetchProviderPackage_Request) ProtoMessage() {} func (x *FetchProviderPackage_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[138] + mi := &file_terraform1_proto_msgTypes[141] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8316,7 +8430,7 @@ func (x *FetchProviderPackage_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchProviderPackage_Request.ProtoReflect.Descriptor instead. func (*FetchProviderPackage_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{43, 0} + return file_terraform1_proto_rawDescGZIP(), []int{44, 0} } func (x *FetchProviderPackage_Request) GetCacheDir() string { @@ -8371,7 +8485,7 @@ type FetchProviderPackage_Response struct { func (x *FetchProviderPackage_Response) Reset() { *x = FetchProviderPackage_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[139] + mi := &file_terraform1_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8384,7 +8498,7 @@ func (x *FetchProviderPackage_Response) String() string { func (*FetchProviderPackage_Response) ProtoMessage() {} func (x *FetchProviderPackage_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[139] + mi := &file_terraform1_proto_msgTypes[142] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8397,7 +8511,7 @@ func (x *FetchProviderPackage_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchProviderPackage_Response.ProtoReflect.Descriptor instead. func (*FetchProviderPackage_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{43, 1} + return file_terraform1_proto_rawDescGZIP(), []int{44, 1} } func (x *FetchProviderPackage_Response) GetResults() []*FetchProviderPackage_PlatformResult { @@ -8426,7 +8540,7 @@ type FetchProviderPackage_PlatformResult struct { func (x *FetchProviderPackage_PlatformResult) Reset() { *x = FetchProviderPackage_PlatformResult{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[140] + mi := &file_terraform1_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8439,7 +8553,7 @@ func (x *FetchProviderPackage_PlatformResult) String() string { func (*FetchProviderPackage_PlatformResult) ProtoMessage() {} func (x *FetchProviderPackage_PlatformResult) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[140] + mi := &file_terraform1_proto_msgTypes[143] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8452,7 +8566,7 @@ func (x *FetchProviderPackage_PlatformResult) ProtoReflect() protoreflect.Messag // Deprecated: Use FetchProviderPackage_PlatformResult.ProtoReflect.Descriptor instead. func (*FetchProviderPackage_PlatformResult) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{43, 2} + return file_terraform1_proto_rawDescGZIP(), []int{44, 2} } func (x *FetchProviderPackage_PlatformResult) GetProvider() *ProviderPackage { @@ -8480,7 +8594,7 @@ type ModulePackageVersions_Request struct { func (x *ModulePackageVersions_Request) Reset() { *x = ModulePackageVersions_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[141] + mi := &file_terraform1_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8493,7 +8607,7 @@ func (x *ModulePackageVersions_Request) String() string { func (*ModulePackageVersions_Request) ProtoMessage() {} func (x *ModulePackageVersions_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[141] + mi := &file_terraform1_proto_msgTypes[144] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8506,7 +8620,7 @@ func (x *ModulePackageVersions_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageVersions_Request.ProtoReflect.Descriptor instead. func (*ModulePackageVersions_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{44, 0} + return file_terraform1_proto_rawDescGZIP(), []int{45, 0} } func (x *ModulePackageVersions_Request) GetSourceAddr() string { @@ -8528,7 +8642,7 @@ type ModulePackageVersions_Response struct { func (x *ModulePackageVersions_Response) Reset() { *x = ModulePackageVersions_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[142] + mi := &file_terraform1_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8541,7 +8655,7 @@ func (x *ModulePackageVersions_Response) String() string { func (*ModulePackageVersions_Response) ProtoMessage() {} func (x *ModulePackageVersions_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[142] + mi := &file_terraform1_proto_msgTypes[145] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8554,7 +8668,7 @@ func (x *ModulePackageVersions_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageVersions_Response.ProtoReflect.Descriptor instead. func (*ModulePackageVersions_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{44, 1} + return file_terraform1_proto_rawDescGZIP(), []int{45, 1} } func (x *ModulePackageVersions_Response) GetVersions() []string { @@ -8583,7 +8697,7 @@ type ModulePackageSourceAddr_Request struct { func (x *ModulePackageSourceAddr_Request) Reset() { *x = ModulePackageSourceAddr_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[143] + mi := &file_terraform1_proto_msgTypes[146] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8596,7 +8710,7 @@ func (x *ModulePackageSourceAddr_Request) String() string { func (*ModulePackageSourceAddr_Request) ProtoMessage() {} func (x *ModulePackageSourceAddr_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[143] + mi := &file_terraform1_proto_msgTypes[146] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8609,7 +8723,7 @@ func (x *ModulePackageSourceAddr_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageSourceAddr_Request.ProtoReflect.Descriptor instead. func (*ModulePackageSourceAddr_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{45, 0} + return file_terraform1_proto_rawDescGZIP(), []int{46, 0} } func (x *ModulePackageSourceAddr_Request) GetSourceAddr() string { @@ -8638,7 +8752,7 @@ type ModulePackageSourceAddr_Response struct { func (x *ModulePackageSourceAddr_Response) Reset() { *x = ModulePackageSourceAddr_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[144] + mi := &file_terraform1_proto_msgTypes[147] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8651,7 +8765,7 @@ func (x *ModulePackageSourceAddr_Response) String() string { func (*ModulePackageSourceAddr_Response) ProtoMessage() {} func (x *ModulePackageSourceAddr_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[144] + mi := &file_terraform1_proto_msgTypes[147] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8664,7 +8778,7 @@ func (x *ModulePackageSourceAddr_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageSourceAddr_Response.ProtoReflect.Descriptor instead. func (*ModulePackageSourceAddr_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{45, 1} + return file_terraform1_proto_rawDescGZIP(), []int{46, 1} } func (x *ModulePackageSourceAddr_Response) GetUrl() string { @@ -8693,7 +8807,7 @@ type FetchModulePackage_Request struct { func (x *FetchModulePackage_Request) Reset() { *x = FetchModulePackage_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[145] + mi := &file_terraform1_proto_msgTypes[148] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8706,7 +8820,7 @@ func (x *FetchModulePackage_Request) String() string { func (*FetchModulePackage_Request) ProtoMessage() {} func (x *FetchModulePackage_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[145] + mi := &file_terraform1_proto_msgTypes[148] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8719,7 +8833,7 @@ func (x *FetchModulePackage_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchModulePackage_Request.ProtoReflect.Descriptor instead. func (*FetchModulePackage_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{46, 0} + return file_terraform1_proto_rawDescGZIP(), []int{47, 0} } func (x *FetchModulePackage_Request) GetCacheDir() string { @@ -8747,7 +8861,7 @@ type FetchModulePackage_Response struct { func (x *FetchModulePackage_Response) Reset() { *x = FetchModulePackage_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[146] + mi := &file_terraform1_proto_msgTypes[149] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8760,7 +8874,7 @@ func (x *FetchModulePackage_Response) String() string { func (*FetchModulePackage_Response) ProtoMessage() {} func (x *FetchModulePackage_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[146] + mi := &file_terraform1_proto_msgTypes[149] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8773,7 +8887,7 @@ func (x *FetchModulePackage_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchModulePackage_Response.ProtoReflect.Descriptor instead. func (*FetchModulePackage_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{46, 1} + return file_terraform1_proto_rawDescGZIP(), []int{47, 1} } func (x *FetchModulePackage_Response) GetDiagnostics() []*Diagnostic { @@ -8803,672 +8917,908 @@ var file_terraform1_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, - 0x65, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0xab, - 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x45, 0x0a, 0x0b, 0x63, 0x72, 0x65, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, - 0x1a, 0x5a, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x26, 0x0a, 0x0e, - 0x48, 0x6f, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x7a, 0x0a, 0x10, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x28, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, - 0x74, 0x68, 0x1a, 0x3c, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, - 0x0a, 0x14, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, - 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x22, 0x5c, 0x0a, 0x11, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, - 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x3b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x30, 0x0a, 0x14, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, - 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x95, - 0x02, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, - 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x7d, 0x0a, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, - 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x12, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, - 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x7c, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, - 0x63, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, - 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x38, 0x0a, 0x0b, - 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, - 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, - 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xb4, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, - 0x1a, 0x57, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4c, 0x0a, 0x13, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x42, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, - 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, - 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x65, 0x0a, - 0x14, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, - 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x41, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, - 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, - 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xba, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, - 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, - 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x1a, 0x41, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, - 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, - 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x56, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x12, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x11, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x22, 0x8b, 0x11, 0x0a, 0x18, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x1a, 0xc0, - 0x03, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, - 0x63, 0x68, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, - 0x61, 0x63, 0x68, 0x65, 0x44, 0x69, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, - 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, - 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, - 0x6d, 0x0a, 0x14, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6c, 0x6c, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x12, 0x2b, - 0x0a, 0x11, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, - 0x6f, 0x72, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6f, 0x76, 0x65, 0x72, 0x72, - 0x69, 0x64, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x1a, 0xc3, 0x01, 0x0a, 0x0d, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x18, 0x0a, - 0x06, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, - 0x06, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x5f, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, - 0x44, 0x69, 0x72, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6d, - 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x10, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, - 0x55, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x1a, 0xab, 0x0d, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4e, 0x0a, 0x07, 0x70, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x48, 0x00, 0x52, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x69, 0x0a, 0x11, 0x61, - 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x10, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x57, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x5f, - 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x12, - 0x61, 0x0a, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, - 0x69, 0x6e, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x42, 0x65, 0x67, - 0x69, 0x6e, 0x12, 0x61, 0x0a, 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x75, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x64, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x77, - 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x58, 0x0a, 0x0b, 0x66, - 0x65, 0x74, 0x63, 0x68, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x35, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x65, 0x74, - 0x63, 0x68, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x66, 0x65, 0x74, 0x63, 0x68, - 0x42, 0x65, 0x67, 0x69, 0x6e, 0x12, 0x61, 0x0a, 0x0e, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, - 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x66, 0x65, 0x74, 0x63, 0x68, - 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x64, 0x69, 0x61, 0x67, - 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, - 0x73, 0x74, 0x69, 0x63, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, - 0x69, 0x63, 0x1a, 0x65, 0x0a, 0x07, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x5a, 0x0a, - 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x3e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x52, - 0x08, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x1a, 0x52, 0x0a, 0x13, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, - 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, - 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x4c, 0x0a, - 0x0f, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, - 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x4f, 0x0a, 0x10, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, - 0x12, 0x1a, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x8f, 0x01, 0x0a, - 0x0a, 0x46, 0x65, 0x74, 0x63, 0x68, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x12, 0x65, 0x0a, 0x10, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xf5, - 0x02, 0x0a, 0x0d, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x12, 0x65, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x64, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x43, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2b, 0x0a, - 0x12, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6b, 0x65, 0x79, 0x49, 0x64, - 0x46, 0x6f, 0x72, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x22, 0x6a, 0x0a, 0x0a, 0x41, 0x75, - 0x74, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x53, 0x55, 0x4d, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, - 0x4f, 0x46, 0x46, 0x49, 0x43, 0x49, 0x41, 0x4c, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, - 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x41, 0x52, 0x54, 0x4e, 0x45, 0x52, 0x5f, 0x53, 0x49, 0x47, - 0x4e, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x53, 0x49, - 0x47, 0x4e, 0x45, 0x44, 0x10, 0x04, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, - 0xae, 0x01, 0x0a, 0x17, 0x4f, 0x70, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x1a, 0x53, 0x0a, 0x07, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, - 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x63, 0x68, 0x65, - 0x44, 0x69, 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, - 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, - 0x1a, 0x3e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x15, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, - 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x22, 0x65, 0x0a, 0x18, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x1a, 0x3d, 0x0a, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xad, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, - 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x3d, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x58, 0x0a, - 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x13, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x52, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x7a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x75, - 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x09, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x58, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x13, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, - 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x73, 0x22, 0xe3, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, 0x8d, 0x01, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x3e, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x64, 0x0a, 0x0f, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, - 0xd3, 0x03, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x12, 0x3b, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, - 0x0e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x6a, 0x0a, 0x16, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x34, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x14, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x13, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x1a, 0x5b, - 0x0a, 0x19, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x16, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8d, 0x02, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x1a, 0x7d, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x68, 0x61, 0x6e, - 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x40, 0x0a, - 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, - 0x74, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x22, 0x1d, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x1a, 0x09, 0x0a, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x14, 0x0a, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0xab, 0x01, + 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x45, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, + 0x5a, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x26, 0x0a, 0x0e, 0x48, + 0x6f, 0x73, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0x7a, 0x0a, 0x10, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x28, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, + 0x68, 0x1a, 0x3c, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, + 0x14, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x68, + 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, + 0x5c, 0x0a, 0x11, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x3b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x30, 0x0a, 0x14, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, + 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x95, 0x02, + 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, + 0x4c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x7d, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x12, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x48, + 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x7c, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, + 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, + 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, - 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x60, 0x0a, 0x17, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x1a, 0x39, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8a, 0x02, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xa5, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, - 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, - 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, - 0x64, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x44, - 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, - 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xb4, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x1a, + 0x57, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4c, 0x0a, 0x13, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x42, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, + 0x63, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, + 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x65, 0x0a, 0x14, + 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, + 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x41, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x6f, + 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, + 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0xba, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, + 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, + 0x6e, 0x63, 0x69, 0x65, 0x73, 0x1a, 0x41, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, + 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, + 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x56, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x12, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x11, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x22, 0x8b, 0x11, 0x0a, 0x18, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x1a, 0xc0, 0x03, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x44, 0x69, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, + 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, + 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x6d, + 0x0a, 0x14, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x13, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x12, 0x2b, 0x0a, + 0x11, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, + 0x72, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, + 0x64, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x1a, 0xc3, 0x01, 0x0a, 0x0d, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x18, 0x0a, 0x06, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, + 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x0e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x44, + 0x69, 0x72, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6d, 0x69, + 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x10, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x55, + 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x1a, 0xab, 0x0d, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4e, 0x0a, 0x07, 0x70, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x48, + 0x00, 0x52, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x69, 0x0a, 0x11, 0x61, 0x6c, + 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x48, 0x00, 0x52, 0x10, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x57, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x5f, 0x69, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x12, 0x61, + 0x0a, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, + 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, + 0x6e, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x42, 0x65, 0x67, 0x69, + 0x6e, 0x12, 0x61, 0x0a, 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x12, 0x64, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x77, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x58, 0x0a, 0x0b, 0x66, 0x65, + 0x74, 0x63, 0x68, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x35, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x65, 0x74, 0x63, + 0x68, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x66, 0x65, 0x74, 0x63, 0x68, 0x42, + 0x65, 0x67, 0x69, 0x6e, 0x12, 0x61, 0x0a, 0x0e, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x66, 0x65, 0x74, 0x63, 0x68, 0x43, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, + 0x6f, 0x73, 0x74, 0x69, 0x63, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, + 0x74, 0x69, 0x63, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, + 0x63, 0x1a, 0x65, 0x0a, 0x07, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x5a, 0x0a, 0x08, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x08, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x1a, 0x52, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x12, + 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, + 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x4c, 0x0a, 0x0f, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, + 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x4f, 0x0a, 0x10, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1f, + 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, + 0x1a, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x8f, 0x01, 0x0a, 0x0a, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x12, 0x65, 0x0a, 0x10, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xf5, 0x02, + 0x0a, 0x0d, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x65, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x64, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x43, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2b, 0x0a, 0x12, + 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6b, 0x65, 0x79, 0x49, 0x64, 0x46, + 0x6f, 0x72, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x22, 0x6a, 0x0a, 0x0a, 0x41, 0x75, 0x74, + 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, + 0x57, 0x4e, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x53, 0x55, 0x4d, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x4f, + 0x46, 0x46, 0x49, 0x43, 0x49, 0x41, 0x4c, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x10, 0x02, + 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x41, 0x52, 0x54, 0x4e, 0x45, 0x52, 0x5f, 0x53, 0x49, 0x47, 0x4e, + 0x45, 0x44, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x53, 0x49, 0x47, + 0x4e, 0x45, 0x44, 0x10, 0x04, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xae, + 0x01, 0x0a, 0x17, 0x4f, 0x70, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x1a, 0x53, 0x0a, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x64, + 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x63, 0x68, 0x65, 0x44, + 0x69, 0x72, 0x12, 0x2b, 0x0a, 0x11, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x70, + 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6f, + 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x1a, + 0x3e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, + 0x65, 0x0a, 0x18, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x1a, 0x3d, 0x0a, 0x07, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xad, 0x01, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x58, 0x0a, 0x08, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x13, 0x61, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x52, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x7a, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, + 0x6c, 0x74, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x09, 0x0a, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x58, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x13, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x12, + 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x22, 0xe3, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x1a, 0x8d, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x3e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x64, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0xd3, + 0x03, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x12, 0x3b, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0e, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x6a, + 0x0a, 0x16, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x14, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x13, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x1a, 0x5b, 0x0a, + 0x19, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x16, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8d, 0x02, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, + 0x7d, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0e, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, + 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x74, + 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, - 0x74, 0x69, 0x63, 0x73, 0x22, 0xdb, 0x08, 0x0a, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x39, 0x0a, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x5c, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x50, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x38, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, - 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x1a, 0xe4, 0x03, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x68, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x75, 0x0a, 0x0f, - 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x74, 0x69, 0x63, 0x73, 0x22, 0x60, 0x0a, 0x17, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, + 0x39, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8a, 0x02, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xa5, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, + 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, + 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x44, 0x0a, + 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, + 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, + 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x22, 0xdb, 0x08, 0x0a, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x39, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, + 0x64, 0x6c, 0x65, 0x1a, 0x5c, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x50, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x38, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x1a, 0xe4, 0x03, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x68, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x73, 0x1a, 0x75, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7d, 0x0a, 0x13, 0x45, 0x6d, - 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xd8, 0x01, 0x0a, 0x0d, 0x45, 0x6d, - 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x54, 0x0a, 0x09, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x36, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, - 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x73, 0x12, 0x50, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xa9, 0x01, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x12, 0x54, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x75, 0x0a, 0x0f, 0x65, + 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, + 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x73, 0x1a, 0x75, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x09, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, - 0x22, 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x0a, 0x0a, - 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x4f, 0x55, - 0x4e, 0x54, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x4f, 0x52, 0x5f, 0x45, 0x41, 0x43, 0x48, - 0x10, 0x02, 0x22, 0xb9, 0x06, 0x0a, 0x10, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x1a, 0xce, 0x04, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x70, 0x6c, - 0x61, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x5e, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, - 0x75, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, - 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, - 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, - 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x32, - 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, - 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x12, 0x58, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0b, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x56, 0x0a, 0x12, - 0x50, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x62, 0x0a, 0x10, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x38, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xd3, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x42, 0x0a, 0x0e, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, - 0x73, 0x74, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, - 0x69, 0x63, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x12, 0x3d, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, - 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x0a, 0x22, 0x86, - 0x04, 0x0a, 0x11, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x1a, 0xa0, 0x02, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x12, 0x34, 0x0a, 0x16, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x14, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x3d, 0x0a, 0x0f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, - 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0e, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7d, 0x0a, 0x13, 0x45, 0x6d, 0x62, + 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x50, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, + 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xd8, 0x01, 0x0a, 0x0d, 0x45, 0x6d, 0x62, + 0x65, 0x64, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x54, 0x0a, 0x09, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x12, 0x50, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x38, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, + 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x1a, 0xa9, 0x01, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x12, 0x54, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x09, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x22, + 0x30, 0x0a, 0x09, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x0a, 0x0a, 0x06, + 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x4f, 0x55, 0x4e, + 0x54, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x4f, 0x52, 0x5f, 0x45, 0x41, 0x43, 0x48, 0x10, + 0x02, 0x22, 0xb9, 0x06, 0x0a, 0x10, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x1a, 0xce, 0x04, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x31, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x70, 0x6c, 0x61, + 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, + 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x5e, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, + 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, - 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, + 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x1a, 0xcd, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x42, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, + 0x65, 0x12, 0x58, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x56, 0x0a, 0x12, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x62, 0x0a, 0x10, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xd3, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x42, 0x0a, 0x0e, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x12, - 0x3d, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x3d, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x07, - 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x91, 0x05, 0x0a, 0x12, 0x4f, 0x70, 0x65, 0x6e, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0xfe, - 0x03, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x47, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, - 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, - 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, - 0x5a, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x4e, 0x0a, 0x0a, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x62, 0x0a, 0x10, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, - 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x7a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x68, - 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x73, 0x74, 0x61, - 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, - 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x99, 0x02, 0x0a, 0x17, - 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x85, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x73, - 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x14, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x72, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0d, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x72, 0x63, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x1a, - 0x76, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, + 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x0a, 0x22, 0x86, 0x04, + 0x0a, 0x11, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x1a, 0xa0, 0x02, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, + 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, + 0x34, 0x0a, 0x16, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x14, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x3d, 0x0a, 0x0f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, + 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0e, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, + 0x63, 0x79, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, + 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x15, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, + 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x1a, 0xcd, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x42, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, + 0x48, 0x00, 0x52, 0x0a, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x12, 0x3d, + 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x42, 0x07, 0x0a, + 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x91, 0x05, 0x0a, 0x12, 0x4f, 0x70, 0x65, 0x6e, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x1a, 0xfe, 0x03, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x47, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, + 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, + 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x15, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, + 0x6f, 0x63, 0x6b, 0x73, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x68, 0x61, 0x6e, + 0x64, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x5a, + 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x4e, 0x0a, 0x0a, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x62, 0x0a, 0x10, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7a, + 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x74, + 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x68, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, + 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x99, 0x02, 0x0a, 0x17, 0x49, + 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x85, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x73, 0x70, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x14, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x72, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0d, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x72, 0x63, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x76, + 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x38, 0x0a, 0x0b, + 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, + 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, + 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x61, 0x0a, 0x0c, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x70, 0x61, 0x63, + 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x70, 0x61, 0x63, 0x6b, + 0x12, 0x37, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, + 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x09, + 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x22, 0x6c, 0x0a, 0x12, 0x44, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, + 0x2a, 0x0a, 0x03, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, + 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x6f, 0x6c, 0x64, 0x12, 0x2a, 0x0a, 0x03, 0x6e, + 0x65, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x03, 0x6e, 0x65, 0x77, 0x22, 0x84, 0x01, 0x0a, 0x16, 0x44, 0x79, 0x6e, 0x61, + 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, + 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x3a, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xdd, + 0x01, 0x0a, 0x0d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x34, 0x0a, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x52, + 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x1a, 0x95, 0x01, 0x0a, 0x04, 0x53, 0x74, 0x65, 0x70, 0x12, + 0x27, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4b, + 0x65, 0x79, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x49, + 0x6e, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x7d, + 0x0a, 0x1c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x12, 0x25, + 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x22, 0x8b, 0x01, + 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x12, 0x36, 0x0a, + 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x22, 0xb2, 0x01, 0x0a, 0x21, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, + 0x72, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, + 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x4b, 0x65, 0x79, + 0x22, 0x43, 0x0a, 0x0d, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe1, 0x0c, 0x0a, 0x0d, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x03, 0x72, 0x61, 0x77, 0x12, + 0x4f, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0xfd, 0x02, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6b, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6c, 0x61, + 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, + 0x6e, 0x65, 0x64, 0x12, 0x68, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x48, 0x00, 0x52, 0x17, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x59, 0x0a, + 0x14, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x70, 0x6c, + 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x48, 0x00, 0x52, 0x12, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0e, 0x70, 0x6c, 0x61, 0x6e, + 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x00, 0x52, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x61, 0x62, 0x6c, + 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x1a, 0xa8, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, + 0x61, 0x64, 0x64, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x70, + 0x6c, 0x61, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x1a, 0x97, 0x06, 0x0a, 0x10, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, + 0x64, 0x64, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x46, 0x0a, + 0x05, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x52, 0x05, + 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x4f, 0x0a, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x08, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, + 0x46, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x72, 0x75, 0x6e, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x38, 0x0a, - 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, - 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x61, 0x0a, 0x0c, 0x44, 0x79, 0x6e, 0x61, 0x6d, - 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x70, 0x61, - 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x70, 0x61, 0x63, - 0x6b, 0x12, 0x37, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x52, + 0x75, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x6e, 0x6f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x73, 0x69, 0x64, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6e, 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 0x12, 0x3e, 0x0a, + 0x0d, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, - 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x22, 0x6c, 0x0a, 0x12, 0x44, 0x79, - 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x12, 0x2a, 0x0a, 0x03, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, - 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x6f, 0x6c, 0x64, 0x12, 0x2a, 0x0a, 0x03, - 0x6e, 0x65, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x03, 0x6e, 0x65, 0x77, 0x22, 0x84, 0x01, 0x0a, 0x16, 0x44, 0x79, 0x6e, - 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x3a, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x22, - 0xdd, 0x01, 0x0a, 0x0d, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x34, 0x0a, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x74, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x2e, 0x53, 0x74, 0x65, 0x70, - 0x52, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x1a, 0x95, 0x01, 0x0a, 0x04, 0x53, 0x74, 0x65, 0x70, - 0x12, 0x27, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x65, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x4b, 0x65, 0x79, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, - 0x49, 0x6e, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, - 0x7d, 0x0a, 0x1c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x12, - 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x22, 0x8b, - 0x01, 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x12, 0x36, - 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x22, 0xb2, 0x01, 0x0a, - 0x21, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, + 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x73, 0x1a, 0x4d, 0x0a, + 0x05, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, + 0x64, 0x72, 0x52, 0x08, 0x70, 0x72, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x27, 0x0a, 0x08, + 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x49, 0x64, 0x1a, 0x8b, 0x01, 0x0a, 0x0b, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x07, 0x22, 0xb2, 0x0a, 0x0a, 0x0d, 0x41, 0x70, + 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x03, 0x72, + 0x61, 0x77, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x03, 0x72, + 0x61, 0x77, 0x12, 0x4f, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x1a, 0x49, 0x0a, 0x09, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x82, + 0x03, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x59, 0x0a, 0x11, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, + 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x10, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x12, 0x4a, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, + 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x5c, 0x0a, 0x12, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x08, 0x08, 0xa0, 0x9c, 0x01, 0x10, + 0xa1, 0x9c, 0x01, 0x1a, 0xaf, 0x02, 0x0a, 0x10, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x6e, + 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, + 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, + 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, + 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x69, 0x6d, 0x1a, 0xb1, 0x02, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, - 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x4b, 0x65, - 0x79, 0x22, 0x43, 0x0a, 0x0d, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe1, 0x0c, 0x0a, 0x0d, 0x50, 0x6c, 0x61, 0x6e, 0x6e, - 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x03, 0x72, 0x61, 0x77, - 0x12, 0x4f, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x1a, 0xfd, 0x02, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6b, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6c, - 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, - 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x68, 0x0a, 0x19, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x17, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x59, - 0x0a, 0x14, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x70, - 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, - 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x12, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0e, 0x70, 0x6c, 0x61, - 0x6e, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x61, 0x62, - 0x6c, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x1a, 0xa8, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, - 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x5f, - 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x70, 0x6c, 0x61, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x1a, 0x97, 0x06, 0x0a, - 0x10, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x62, 0x0a, 0x0d, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, + 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x59, + 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0b, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x09, + 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x1a, 0x09, 0x0a, 0x07, 0x4e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x22, 0xdd, + 0x14, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x75, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x48, 0x00, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x72, 0x0a, + 0x18, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x36, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x16, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x88, 0x01, 0x0a, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, + 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1d, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, + 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x62, 0x0a, 0x12, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x11, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x62, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x5f, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x48, + 0x00, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x12, 0x78, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x65, + 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x48, + 0x00, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x1a, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, + 0x56, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x3e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x65, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0b, + 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x50, + 0x4c, 0x41, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x4c, 0x41, + 0x4e, 0x4e, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x50, 0x50, 0x4c, 0x59, 0x49, + 0x4e, 0x47, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, + 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x06, 0x1a, 0xde, + 0x02, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x55, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3d, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x22, 0x84, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, + 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, 0x0a, + 0x0a, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0d, 0x0a, + 0x09, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, + 0x50, 0x4c, 0x41, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x4c, + 0x41, 0x4e, 0x4e, 0x45, 0x44, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x50, 0x50, 0x4c, 0x59, + 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, + 0x10, 0x07, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x08, 0x1a, + 0xf0, 0x03, 0x0a, 0x1d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, @@ -9476,679 +9826,449 @@ var file_terraform1_proto_rawDesc = []byte{ 0x61, 0x64, 0x64, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x46, - 0x0a, 0x05, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, - 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x52, - 0x05, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x4f, 0x0a, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x08, 0x69, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, - 0x12, 0x46, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x72, 0x75, 0x6e, - 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, - 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, - 0x52, 0x75, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x6e, 0x6f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x73, 0x69, - 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6e, 0x6f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 0x12, 0x3e, - 0x0a, 0x0d, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, - 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, - 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x73, 0x1a, 0x4d, - 0x0a, 0x05, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x76, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, - 0x64, 0x64, 0x72, 0x52, 0x08, 0x70, 0x72, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x27, 0x0a, - 0x08, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x49, 0x64, 0x1a, 0x8b, 0x01, 0x0a, 0x0b, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x0a, 0x06, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, - 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x07, 0x22, 0xb2, 0x0a, 0x0a, 0x0d, 0x41, - 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x03, - 0x72, 0x61, 0x77, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x03, - 0x72, 0x61, 0x77, 0x12, 0x4f, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x49, 0x0a, 0x09, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x1a, - 0x82, 0x03, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x59, 0x0a, 0x11, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, - 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, - 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x12, 0x4a, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, - 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x5c, 0x0a, - 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x08, 0x08, 0xa0, 0x9c, 0x01, - 0x10, 0xa1, 0x9c, 0x01, 0x1a, 0xaf, 0x02, 0x0a, 0x10, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x35, 0x0a, 0x09, - 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, - 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, - 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6d, 0x1a, 0xb1, 0x02, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x41, - 0x64, 0x64, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x62, 0x0a, 0x0d, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, - 0x59, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0b, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, - 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, - 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x09, 0x0a, 0x07, 0x4e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x22, - 0xdd, 0x14, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x75, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x72, - 0x0a, 0x18, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x36, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x16, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, - 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, - 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1d, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x62, 0x0a, - 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x11, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x62, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x48, 0x00, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x78, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, - 0x65, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, - 0x48, 0x00, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x1a, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, - 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, - 0x12, 0x56, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x3e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x65, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, - 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, - 0x50, 0x4c, 0x41, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x4c, - 0x41, 0x4e, 0x4e, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x50, 0x50, 0x4c, 0x59, - 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, - 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x06, 0x1a, - 0xde, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, - 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x55, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3d, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x22, 0x84, 0x01, 0x0a, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, - 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, - 0x0a, 0x0a, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0c, 0x0a, - 0x08, 0x50, 0x4c, 0x41, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x50, - 0x4c, 0x41, 0x4e, 0x4e, 0x45, 0x44, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x50, 0x50, 0x4c, - 0x59, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, - 0x44, 0x10, 0x07, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x08, - 0x1a, 0xf0, 0x03, 0x0a, 0x1d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x05, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x52, 0x05, 0x6d, 0x6f, 0x76, 0x65, + 0x64, 0x12, 0x62, 0x0a, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, + 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, - 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x05, 0x6d, 0x6f, 0x76, 0x65, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x52, 0x05, 0x6d, 0x6f, 0x76, - 0x65, 0x64, 0x12, 0x62, 0x0a, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x08, 0x69, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x4d, 0x0a, 0x05, 0x4d, - 0x6f, 0x76, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, - 0x52, 0x08, 0x70, 0x72, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x27, 0x0a, 0x08, 0x49, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x49, 0x64, 0x1a, 0xfc, 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x49, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x45, 0x0a, 0x06, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, - 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, - 0x4e, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, - 0x10, 0x03, 0x1a, 0x82, 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, + 0x67, 0x65, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x08, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x4d, 0x0a, 0x05, 0x4d, 0x6f, + 0x76, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, + 0x08, 0x70, 0x72, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x27, 0x0a, 0x08, 0x49, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x49, 0x64, 0x1a, 0xfc, 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x1a, 0xc8, 0x01, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, - 0x64, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x64, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x64, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x1a, 0x62, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, - 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x41, 0x64, 0x64, 0x72, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, - 0x92, 0x02, 0x0a, 0x0a, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x12, 0x3b, - 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, - 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, - 0x79, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x73, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x31, 0x0a, - 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x49, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x45, 0x0a, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, + 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, + 0x47, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, + 0x45, 0x44, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, 0x10, + 0x03, 0x1a, 0x82, 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, + 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x1a, 0xc8, 0x01, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, + 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x64, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x64, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x1a, 0x62, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x25, + 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x41, 0x64, 0x64, 0x72, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x92, + 0x02, 0x0a, 0x0a, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x12, 0x3b, 0x0a, + 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1f, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, + 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, + 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x31, 0x0a, 0x07, + 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x22, 0x2f, 0x0a, 0x08, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x0b, + 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, + 0x47, 0x10, 0x02, 0x22, 0x84, 0x01, 0x0a, 0x0b, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, + 0x6e, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x41, 0x64, 0x64, 0x72, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, + 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x27, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x22, 0x2f, 0x0a, 0x08, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, - 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, - 0x4e, 0x47, 0x10, 0x02, 0x22, 0x84, 0x01, 0x0a, 0x0b, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x12, 0x27, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x4b, 0x0a, 0x09, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x79, 0x74, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x62, 0x79, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0xb5, 0x09, 0x0a, 0x06, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x12, 0x2e, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x1a, 0xe6, 0x01, 0x0a, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x3c, 0x0a, - 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, - 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, - 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x1a, 0xc1, 0x02, 0x0a, - 0x09, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x0a, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3e, - 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, - 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, - 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, - 0x1a, 0xef, 0x01, 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, - 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x44, 0x0a, - 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x4e, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x6e, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x22, 0x4d, 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, - 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, - 0x49, 0x53, 0x54, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x07, - 0x0a, 0x03, 0x4d, 0x41, 0x50, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x4f, 0x55, 0x50, - 0x10, 0x05, 0x1a, 0xcb, 0x01, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3c, 0x0a, - 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, - 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x07, 0x6e, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, - 0x6f, 0x64, 0x65, 0x52, 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x42, 0x0a, 0x0b, - 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, - 0x4c, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, 0x12, 0x07, - 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x50, 0x10, 0x04, - 0x1a, 0x8d, 0x01, 0x0a, 0x09, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x20, - 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x3b, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x23, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x46, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x21, 0x0a, - 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, - 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x41, 0x52, 0x4b, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x01, - 0x22, 0xa7, 0x01, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x2a, 0x0a, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x60, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, - 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xc8, 0x03, 0x0a, 0x14, 0x46, - 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x1a, 0x97, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x63, 0x68, 0x65, 0x44, 0x69, 0x72, 0x12, 0x1f, 0x0a, 0x0b, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x74, 0x66, - 0x6f, 0x72, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x1a, 0x8f, 0x01, - 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x50, 0x6c, - 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, - 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, - 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x1a, - 0x83, 0x01, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x12, 0x37, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x0b, 0x64, - 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, - 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, - 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x15, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, - 0x2a, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x60, 0x0a, 0x08, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, - 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xb7, 0x01, - 0x0a, 0x17, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x44, 0x0a, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, - 0x56, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, - 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x38, 0x0a, - 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, - 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x12, 0x46, 0x65, 0x74, 0x63, - 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x1a, 0x38, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x63, - 0x68, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, - 0x63, 0x68, 0x65, 0x44, 0x69, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x1a, 0x44, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, - 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x63, 0x65, 0x50, 0x6f, 0x73, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x4b, 0x0a, 0x09, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x79, 0x74, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x62, 0x79, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, + 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0xb5, 0x09, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x12, 0x2e, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x1a, 0xe6, 0x01, 0x0a, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x3c, 0x0a, 0x0a, + 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x0a, + 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, + 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, + 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x1a, 0xc1, 0x02, 0x0a, 0x09, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x52, 0x0a, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3e, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, + 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x1a, + 0xef, 0x01, 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, + 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x05, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x44, 0x0a, 0x07, + 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x4e, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x22, 0x4d, 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, + 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, + 0x53, 0x54, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, + 0x03, 0x4d, 0x41, 0x50, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, + 0x05, 0x1a, 0xcb, 0x01, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3c, 0x0a, 0x0a, + 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x0a, + 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x07, 0x6e, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, + 0x64, 0x65, 0x52, 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x42, 0x0a, 0x0b, 0x4e, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, + 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, 0x12, 0x07, 0x0a, + 0x03, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x50, 0x10, 0x04, 0x1a, + 0x8d, 0x01, 0x0a, 0x09, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x3b, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x23, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x21, 0x0a, 0x06, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, + 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x41, 0x52, 0x4b, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x22, + 0xa7, 0x01, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x2a, 0x0a, 0x07, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x60, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xc8, 0x03, 0x0a, 0x14, 0x46, 0x65, + 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x1a, 0x97, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x63, 0x61, 0x63, 0x68, 0x65, 0x44, 0x69, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, + 0x72, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x74, 0x66, + 0x6f, 0x72, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x1a, 0x8f, 0x01, 0x0a, + 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x50, 0x6c, 0x61, + 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, - 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x2a, 0x32, - 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, - 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4d, - 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x41, 0x54, 0x41, - 0x10, 0x02, 0x2a, 0x35, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, - 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x45, - 0x46, 0x52, 0x45, 0x53, 0x48, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, - 0x44, 0x45, 0x53, 0x54, 0x52, 0x4f, 0x59, 0x10, 0x02, 0x2a, 0x44, 0x0a, 0x0a, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, - 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x45, 0x41, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, - 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, - 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x04, 0x32, - 0x53, 0x0a, 0x05, 0x53, 0x65, 0x74, 0x75, 0x70, 0x12, 0x4a, 0x0a, 0x09, 0x48, 0x61, 0x6e, 0x64, + 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x1a, 0x83, + 0x01, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x12, 0x37, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, + 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x15, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x2a, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x60, 0x0a, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, + 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xb7, 0x01, 0x0a, + 0x17, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x44, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x56, + 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x38, 0x0a, 0x0b, + 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, + 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, + 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x12, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x1a, 0x38, 0x0a, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x44, 0x69, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x1a, 0x44, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, + 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, + 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x2a, 0x32, 0x0a, + 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, + 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x41, + 0x4e, 0x41, 0x47, 0x45, 0x44, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x41, 0x54, 0x41, 0x10, + 0x02, 0x2a, 0x35, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, 0x0a, + 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x45, 0x46, + 0x52, 0x45, 0x53, 0x48, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, + 0x45, 0x53, 0x54, 0x52, 0x4f, 0x59, 0x10, 0x02, 0x2a, 0x44, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, + 0x12, 0x08, 0x0a, 0x04, 0x52, 0x45, 0x41, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, + 0x45, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, + 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x04, 0x32, 0x90, + 0x01, 0x0a, 0x05, 0x53, 0x65, 0x74, 0x75, 0x70, 0x12, 0x4a, 0x0a, 0x09, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x12, 0x1d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xc8, 0x0a, 0x0a, 0x0c, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, - 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x24, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x18, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x32, 0xc8, 0x0a, 0x0a, 0x0c, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, + 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x24, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, + 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, - 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x16, 0x4f, 0x70, - 0x65, 0x6e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, - 0x46, 0x69, 0x6c, 0x65, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, - 0x4c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, - 0x46, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, - 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, - 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x29, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, - 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, - 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, - 0x14, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, - 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, - 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x29, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, - 0x73, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, - 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x86, 0x01, 0x0a, 0x1d, 0x47, - 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x74, + 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, + 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x44, + 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, + 0x65, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, + 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x44, + 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, + 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x15, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, + 0x63, 0x6b, 0x73, 0x12, 0x29, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, + 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, + 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x14, 0x43, 0x6c, + 0x6f, 0x73, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, + 0x6b, 0x73, 0x12, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, + 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x44, + 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x86, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4c, + 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x65, 0x70, + 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, + 0x63, 0x69, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x65, 0x70, 0x65, 0x6e, - 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x32, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x65, - 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x18, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, - 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x76, 0x0a, 0x18, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x2c, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x74, 0x0a, 0x17, 0x4f, 0x70, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x74, 0x0a, 0x17, 0x4f, - 0x70, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, + 0x63, 0x68, 0x65, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x77, 0x0a, 0x18, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x2c, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x12, 0x47, 0x65, - 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x12, 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x68, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x47, - 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x12, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, - 0xa2, 0x07, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x71, 0x0a, 0x16, 0x4f, 0x70, - 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, - 0x17, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x2e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2f, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x34, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x10, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x30, 0x01, 0x12, 0x61, 0x0a, 0x11, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x23, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, - 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x12, 0x4f, 0x70, 0x65, 0x6e, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x26, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, + 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, + 0x0a, 0x18, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x2c, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, - 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, + 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x25, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xa2, 0x07, 0x0a, + 0x06, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x71, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x17, 0x43, 0x6c, + 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x7d, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x8f, 0x01, 0x0a, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x34, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x5e, 0x0a, 0x10, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, + 0x01, 0x12, 0x61, 0x0a, 0x11, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x12, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x26, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x17, 0x49, + 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xba, 0x04, 0x0a, 0x08, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x73, 0x12, 0x74, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, + 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x32, 0xba, 0x04, 0x0a, 0x08, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x12, 0x74, + 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x14, 0x46, 0x65, 0x74, 0x63, 0x68, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, - 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, - 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x15, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x17, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, - 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x41, 0x64, 0x64, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x14, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x28, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x6e, 0x0a, 0x15, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x74, 0x0a, 0x17, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, - 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x12, 0x46, 0x65, - 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x12, 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, - 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x12, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x26, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10164,7 +10284,7 @@ func file_terraform1_proto_rawDescGZIP() []byte { } var file_terraform1_proto_enumTypes = make([]protoimpl.EnumInfo, 12) -var file_terraform1_proto_msgTypes = make([]protoimpl.MessageInfo, 147) +var file_terraform1_proto_msgTypes = make([]protoimpl.MessageInfo, 150) var file_terraform1_proto_goTypes = []interface{}{ (ResourceMode)(0), // 0: terraform1.ResourceMode (PlanMode)(0), // 1: terraform1.PlanMode @@ -10179,351 +10299,356 @@ var file_terraform1_proto_goTypes = []interface{}{ (Schema_Object_NestingMode)(0), // 10: terraform1.Schema.Object.NestingMode (Schema_DocString_Format)(0), // 11: terraform1.Schema.DocString.Format (*Handshake)(nil), // 12: terraform1.Handshake - (*ClientCapabilities)(nil), // 13: terraform1.ClientCapabilities - (*ServerCapabilities)(nil), // 14: terraform1.ServerCapabilities - (*Config)(nil), // 15: terraform1.Config - (*HostCredential)(nil), // 16: terraform1.HostCredential - (*OpenSourceBundle)(nil), // 17: terraform1.OpenSourceBundle - (*CloseSourceBundle)(nil), // 18: terraform1.CloseSourceBundle - (*OpenDependencyLockFile)(nil), // 19: terraform1.OpenDependencyLockFile - (*CreateDependencyLocks)(nil), // 20: terraform1.CreateDependencyLocks - (*CloseDependencyLocks)(nil), // 21: terraform1.CloseDependencyLocks - (*GetLockedProviderDependencies)(nil), // 22: terraform1.GetLockedProviderDependencies - (*BuildProviderPluginCache)(nil), // 23: terraform1.BuildProviderPluginCache - (*OpenProviderPluginCache)(nil), // 24: terraform1.OpenProviderPluginCache - (*CloseProviderPluginCache)(nil), // 25: terraform1.CloseProviderPluginCache - (*GetCachedProviders)(nil), // 26: terraform1.GetCachedProviders - (*GetBuiltInProviders)(nil), // 27: terraform1.GetBuiltInProviders - (*GetProviderSchema)(nil), // 28: terraform1.GetProviderSchema - (*ProviderPackage)(nil), // 29: terraform1.ProviderPackage - (*ProviderSchema)(nil), // 30: terraform1.ProviderSchema - (*OpenStackConfiguration)(nil), // 31: terraform1.OpenStackConfiguration - (*CloseStackConfiguration)(nil), // 32: terraform1.CloseStackConfiguration - (*ValidateStackConfiguration)(nil), // 33: terraform1.ValidateStackConfiguration - (*FindStackConfigurationComponents)(nil), // 34: terraform1.FindStackConfigurationComponents - (*PlanStackChanges)(nil), // 35: terraform1.PlanStackChanges - (*ApplyStackChanges)(nil), // 36: terraform1.ApplyStackChanges - (*OpenStackInspector)(nil), // 37: terraform1.OpenStackInspector - (*InspectExpressionResult)(nil), // 38: terraform1.InspectExpressionResult - (*DynamicValue)(nil), // 39: terraform1.DynamicValue - (*DynamicValueChange)(nil), // 40: terraform1.DynamicValueChange - (*DynamicValueWithSource)(nil), // 41: terraform1.DynamicValueWithSource - (*AttributePath)(nil), // 42: terraform1.AttributePath - (*ComponentInstanceInStackAddr)(nil), // 43: terraform1.ComponentInstanceInStackAddr - (*ResourceInstanceInStackAddr)(nil), // 44: terraform1.ResourceInstanceInStackAddr - (*ResourceInstanceObjectInStackAddr)(nil), // 45: terraform1.ResourceInstanceObjectInStackAddr - (*SourceAddress)(nil), // 46: terraform1.SourceAddress - (*PlannedChange)(nil), // 47: terraform1.PlannedChange - (*AppliedChange)(nil), // 48: terraform1.AppliedChange - (*StackChangeProgress)(nil), // 49: terraform1.StackChangeProgress - (*Diagnostic)(nil), // 50: terraform1.Diagnostic - (*SourceRange)(nil), // 51: terraform1.SourceRange - (*SourcePos)(nil), // 52: terraform1.SourcePos - (*Schema)(nil), // 53: terraform1.Schema - (*ProviderPackageVersions)(nil), // 54: terraform1.ProviderPackageVersions - (*FetchProviderPackage)(nil), // 55: terraform1.FetchProviderPackage - (*ModulePackageVersions)(nil), // 56: terraform1.ModulePackageVersions - (*ModulePackageSourceAddr)(nil), // 57: terraform1.ModulePackageSourceAddr - (*FetchModulePackage)(nil), // 58: terraform1.FetchModulePackage - (*Handshake_Request)(nil), // 59: terraform1.Handshake.Request - (*Handshake_Response)(nil), // 60: terraform1.Handshake.Response - nil, // 61: terraform1.Config.CredentialsEntry - (*OpenSourceBundle_Request)(nil), // 62: terraform1.OpenSourceBundle.Request - (*OpenSourceBundle_Response)(nil), // 63: terraform1.OpenSourceBundle.Response - (*CloseSourceBundle_Request)(nil), // 64: terraform1.CloseSourceBundle.Request - (*CloseSourceBundle_Response)(nil), // 65: terraform1.CloseSourceBundle.Response - (*OpenDependencyLockFile_Request)(nil), // 66: terraform1.OpenDependencyLockFile.Request - (*OpenDependencyLockFile_Response)(nil), // 67: terraform1.OpenDependencyLockFile.Response - (*CreateDependencyLocks_Request)(nil), // 68: terraform1.CreateDependencyLocks.Request - (*CreateDependencyLocks_Response)(nil), // 69: terraform1.CreateDependencyLocks.Response - (*CloseDependencyLocks_Request)(nil), // 70: terraform1.CloseDependencyLocks.Request - (*CloseDependencyLocks_Response)(nil), // 71: terraform1.CloseDependencyLocks.Response - (*GetLockedProviderDependencies_Request)(nil), // 72: terraform1.GetLockedProviderDependencies.Request - (*GetLockedProviderDependencies_Response)(nil), // 73: terraform1.GetLockedProviderDependencies.Response - (*BuildProviderPluginCache_Request)(nil), // 74: terraform1.BuildProviderPluginCache.Request - (*BuildProviderPluginCache_Event)(nil), // 75: terraform1.BuildProviderPluginCache.Event - (*BuildProviderPluginCache_Request_InstallMethod)(nil), // 76: terraform1.BuildProviderPluginCache.Request.InstallMethod - (*BuildProviderPluginCache_Event_Pending)(nil), // 77: terraform1.BuildProviderPluginCache.Event.Pending - (*BuildProviderPluginCache_Event_ProviderConstraints)(nil), // 78: terraform1.BuildProviderPluginCache.Event.ProviderConstraints - (*BuildProviderPluginCache_Event_ProviderVersion)(nil), // 79: terraform1.BuildProviderPluginCache.Event.ProviderVersion - (*BuildProviderPluginCache_Event_ProviderWarnings)(nil), // 80: terraform1.BuildProviderPluginCache.Event.ProviderWarnings - (*BuildProviderPluginCache_Event_FetchBegin)(nil), // 81: terraform1.BuildProviderPluginCache.Event.FetchBegin - (*BuildProviderPluginCache_Event_FetchComplete)(nil), // 82: terraform1.BuildProviderPluginCache.Event.FetchComplete - (*OpenProviderPluginCache_Request)(nil), // 83: terraform1.OpenProviderPluginCache.Request - (*OpenProviderPluginCache_Response)(nil), // 84: terraform1.OpenProviderPluginCache.Response - (*CloseProviderPluginCache_Request)(nil), // 85: terraform1.CloseProviderPluginCache.Request - (*CloseProviderPluginCache_Response)(nil), // 86: terraform1.CloseProviderPluginCache.Response - (*GetCachedProviders_Request)(nil), // 87: terraform1.GetCachedProviders.Request - (*GetCachedProviders_Response)(nil), // 88: terraform1.GetCachedProviders.Response - (*GetBuiltInProviders_Request)(nil), // 89: terraform1.GetBuiltInProviders.Request - (*GetBuiltInProviders_Response)(nil), // 90: terraform1.GetBuiltInProviders.Response - (*GetProviderSchema_Request)(nil), // 91: terraform1.GetProviderSchema.Request - (*GetProviderSchema_Response)(nil), // 92: terraform1.GetProviderSchema.Response - nil, // 93: terraform1.ProviderSchema.ManagedResourceTypesEntry - nil, // 94: terraform1.ProviderSchema.DataResourceTypesEntry - (*OpenStackConfiguration_Request)(nil), // 95: terraform1.OpenStackConfiguration.Request - (*OpenStackConfiguration_Response)(nil), // 96: terraform1.OpenStackConfiguration.Response - (*CloseStackConfiguration_Request)(nil), // 97: terraform1.CloseStackConfiguration.Request - (*CloseStackConfiguration_Response)(nil), // 98: terraform1.CloseStackConfiguration.Response - (*ValidateStackConfiguration_Request)(nil), // 99: terraform1.ValidateStackConfiguration.Request - (*ValidateStackConfiguration_Response)(nil), // 100: terraform1.ValidateStackConfiguration.Response - (*FindStackConfigurationComponents_Request)(nil), // 101: terraform1.FindStackConfigurationComponents.Request - (*FindStackConfigurationComponents_Response)(nil), // 102: terraform1.FindStackConfigurationComponents.Response - (*FindStackConfigurationComponents_StackConfig)(nil), // 103: terraform1.FindStackConfigurationComponents.StackConfig - (*FindStackConfigurationComponents_EmbeddedStack)(nil), // 104: terraform1.FindStackConfigurationComponents.EmbeddedStack - (*FindStackConfigurationComponents_Component)(nil), // 105: terraform1.FindStackConfigurationComponents.Component - nil, // 106: terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry - nil, // 107: terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry - (*PlanStackChanges_Request)(nil), // 108: terraform1.PlanStackChanges.Request - (*PlanStackChanges_Event)(nil), // 109: terraform1.PlanStackChanges.Event - nil, // 110: terraform1.PlanStackChanges.Request.PreviousStateEntry - nil, // 111: terraform1.PlanStackChanges.Request.InputValuesEntry - (*ApplyStackChanges_Request)(nil), // 112: terraform1.ApplyStackChanges.Request - (*ApplyStackChanges_Event)(nil), // 113: terraform1.ApplyStackChanges.Event - (*OpenStackInspector_Request)(nil), // 114: terraform1.OpenStackInspector.Request - (*OpenStackInspector_Response)(nil), // 115: terraform1.OpenStackInspector.Response - nil, // 116: terraform1.OpenStackInspector.Request.StateEntry - nil, // 117: terraform1.OpenStackInspector.Request.InputValuesEntry - (*InspectExpressionResult_Request)(nil), // 118: terraform1.InspectExpressionResult.Request - (*InspectExpressionResult_Response)(nil), // 119: terraform1.InspectExpressionResult.Response - (*AttributePath_Step)(nil), // 120: terraform1.AttributePath.Step - (*PlannedChange_ChangeDescription)(nil), // 121: terraform1.PlannedChange.ChangeDescription - (*PlannedChange_ComponentInstance)(nil), // 122: terraform1.PlannedChange.ComponentInstance - (*PlannedChange_ResourceInstance)(nil), // 123: terraform1.PlannedChange.ResourceInstance - (*PlannedChange_OutputValue)(nil), // 124: terraform1.PlannedChange.OutputValue - (*PlannedChange_ResourceInstance_Moved)(nil), // 125: terraform1.PlannedChange.ResourceInstance.Moved - (*PlannedChange_ResourceInstance_Imported)(nil), // 126: terraform1.PlannedChange.ResourceInstance.Imported - (*AppliedChange_RawChange)(nil), // 127: terraform1.AppliedChange.RawChange - (*AppliedChange_ChangeDescription)(nil), // 128: terraform1.AppliedChange.ChangeDescription - (*AppliedChange_ResourceInstance)(nil), // 129: terraform1.AppliedChange.ResourceInstance - (*AppliedChange_ComponentInstance)(nil), // 130: terraform1.AppliedChange.ComponentInstance - (*AppliedChange_OutputValue)(nil), // 131: terraform1.AppliedChange.OutputValue - (*AppliedChange_Nothing)(nil), // 132: terraform1.AppliedChange.Nothing - nil, // 133: terraform1.AppliedChange.ComponentInstance.OutputValuesEntry - (*StackChangeProgress_ComponentInstanceStatus)(nil), // 134: terraform1.StackChangeProgress.ComponentInstanceStatus - (*StackChangeProgress_ResourceInstanceStatus)(nil), // 135: terraform1.StackChangeProgress.ResourceInstanceStatus - (*StackChangeProgress_ResourceInstancePlannedChange)(nil), // 136: terraform1.StackChangeProgress.ResourceInstancePlannedChange - (*StackChangeProgress_ProvisionerStatus)(nil), // 137: terraform1.StackChangeProgress.ProvisionerStatus - (*StackChangeProgress_ProvisionerOutput)(nil), // 138: terraform1.StackChangeProgress.ProvisionerOutput - (*StackChangeProgress_ComponentInstanceChanges)(nil), // 139: terraform1.StackChangeProgress.ComponentInstanceChanges - (*StackChangeProgress_ComponentInstances)(nil), // 140: terraform1.StackChangeProgress.ComponentInstances - (*StackChangeProgress_ResourceInstancePlannedChange_Moved)(nil), // 141: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved - (*StackChangeProgress_ResourceInstancePlannedChange_Imported)(nil), // 142: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Imported - (*Schema_Block)(nil), // 143: terraform1.Schema.Block - (*Schema_Attribute)(nil), // 144: terraform1.Schema.Attribute - (*Schema_NestedBlock)(nil), // 145: terraform1.Schema.NestedBlock - (*Schema_Object)(nil), // 146: terraform1.Schema.Object - (*Schema_DocString)(nil), // 147: terraform1.Schema.DocString - (*ProviderPackageVersions_Request)(nil), // 148: terraform1.ProviderPackageVersions.Request - (*ProviderPackageVersions_Response)(nil), // 149: terraform1.ProviderPackageVersions.Response - (*FetchProviderPackage_Request)(nil), // 150: terraform1.FetchProviderPackage.Request - (*FetchProviderPackage_Response)(nil), // 151: terraform1.FetchProviderPackage.Response - (*FetchProviderPackage_PlatformResult)(nil), // 152: terraform1.FetchProviderPackage.PlatformResult - (*ModulePackageVersions_Request)(nil), // 153: terraform1.ModulePackageVersions.Request - (*ModulePackageVersions_Response)(nil), // 154: terraform1.ModulePackageVersions.Response - (*ModulePackageSourceAddr_Request)(nil), // 155: terraform1.ModulePackageSourceAddr.Request - (*ModulePackageSourceAddr_Response)(nil), // 156: terraform1.ModulePackageSourceAddr.Response - (*FetchModulePackage_Request)(nil), // 157: terraform1.FetchModulePackage.Request - (*FetchModulePackage_Response)(nil), // 158: terraform1.FetchModulePackage.Response - (*anypb.Any)(nil), // 159: google.protobuf.Any + (*Stop)(nil), // 13: terraform1.Stop + (*ClientCapabilities)(nil), // 14: terraform1.ClientCapabilities + (*ServerCapabilities)(nil), // 15: terraform1.ServerCapabilities + (*Config)(nil), // 16: terraform1.Config + (*HostCredential)(nil), // 17: terraform1.HostCredential + (*OpenSourceBundle)(nil), // 18: terraform1.OpenSourceBundle + (*CloseSourceBundle)(nil), // 19: terraform1.CloseSourceBundle + (*OpenDependencyLockFile)(nil), // 20: terraform1.OpenDependencyLockFile + (*CreateDependencyLocks)(nil), // 21: terraform1.CreateDependencyLocks + (*CloseDependencyLocks)(nil), // 22: terraform1.CloseDependencyLocks + (*GetLockedProviderDependencies)(nil), // 23: terraform1.GetLockedProviderDependencies + (*BuildProviderPluginCache)(nil), // 24: terraform1.BuildProviderPluginCache + (*OpenProviderPluginCache)(nil), // 25: terraform1.OpenProviderPluginCache + (*CloseProviderPluginCache)(nil), // 26: terraform1.CloseProviderPluginCache + (*GetCachedProviders)(nil), // 27: terraform1.GetCachedProviders + (*GetBuiltInProviders)(nil), // 28: terraform1.GetBuiltInProviders + (*GetProviderSchema)(nil), // 29: terraform1.GetProviderSchema + (*ProviderPackage)(nil), // 30: terraform1.ProviderPackage + (*ProviderSchema)(nil), // 31: terraform1.ProviderSchema + (*OpenStackConfiguration)(nil), // 32: terraform1.OpenStackConfiguration + (*CloseStackConfiguration)(nil), // 33: terraform1.CloseStackConfiguration + (*ValidateStackConfiguration)(nil), // 34: terraform1.ValidateStackConfiguration + (*FindStackConfigurationComponents)(nil), // 35: terraform1.FindStackConfigurationComponents + (*PlanStackChanges)(nil), // 36: terraform1.PlanStackChanges + (*ApplyStackChanges)(nil), // 37: terraform1.ApplyStackChanges + (*OpenStackInspector)(nil), // 38: terraform1.OpenStackInspector + (*InspectExpressionResult)(nil), // 39: terraform1.InspectExpressionResult + (*DynamicValue)(nil), // 40: terraform1.DynamicValue + (*DynamicValueChange)(nil), // 41: terraform1.DynamicValueChange + (*DynamicValueWithSource)(nil), // 42: terraform1.DynamicValueWithSource + (*AttributePath)(nil), // 43: terraform1.AttributePath + (*ComponentInstanceInStackAddr)(nil), // 44: terraform1.ComponentInstanceInStackAddr + (*ResourceInstanceInStackAddr)(nil), // 45: terraform1.ResourceInstanceInStackAddr + (*ResourceInstanceObjectInStackAddr)(nil), // 46: terraform1.ResourceInstanceObjectInStackAddr + (*SourceAddress)(nil), // 47: terraform1.SourceAddress + (*PlannedChange)(nil), // 48: terraform1.PlannedChange + (*AppliedChange)(nil), // 49: terraform1.AppliedChange + (*StackChangeProgress)(nil), // 50: terraform1.StackChangeProgress + (*Diagnostic)(nil), // 51: terraform1.Diagnostic + (*SourceRange)(nil), // 52: terraform1.SourceRange + (*SourcePos)(nil), // 53: terraform1.SourcePos + (*Schema)(nil), // 54: terraform1.Schema + (*ProviderPackageVersions)(nil), // 55: terraform1.ProviderPackageVersions + (*FetchProviderPackage)(nil), // 56: terraform1.FetchProviderPackage + (*ModulePackageVersions)(nil), // 57: terraform1.ModulePackageVersions + (*ModulePackageSourceAddr)(nil), // 58: terraform1.ModulePackageSourceAddr + (*FetchModulePackage)(nil), // 59: terraform1.FetchModulePackage + (*Handshake_Request)(nil), // 60: terraform1.Handshake.Request + (*Handshake_Response)(nil), // 61: terraform1.Handshake.Response + (*Stop_Request)(nil), // 62: terraform1.Stop.Request + (*Stop_Response)(nil), // 63: terraform1.Stop.Response + nil, // 64: terraform1.Config.CredentialsEntry + (*OpenSourceBundle_Request)(nil), // 65: terraform1.OpenSourceBundle.Request + (*OpenSourceBundle_Response)(nil), // 66: terraform1.OpenSourceBundle.Response + (*CloseSourceBundle_Request)(nil), // 67: terraform1.CloseSourceBundle.Request + (*CloseSourceBundle_Response)(nil), // 68: terraform1.CloseSourceBundle.Response + (*OpenDependencyLockFile_Request)(nil), // 69: terraform1.OpenDependencyLockFile.Request + (*OpenDependencyLockFile_Response)(nil), // 70: terraform1.OpenDependencyLockFile.Response + (*CreateDependencyLocks_Request)(nil), // 71: terraform1.CreateDependencyLocks.Request + (*CreateDependencyLocks_Response)(nil), // 72: terraform1.CreateDependencyLocks.Response + (*CloseDependencyLocks_Request)(nil), // 73: terraform1.CloseDependencyLocks.Request + (*CloseDependencyLocks_Response)(nil), // 74: terraform1.CloseDependencyLocks.Response + (*GetLockedProviderDependencies_Request)(nil), // 75: terraform1.GetLockedProviderDependencies.Request + (*GetLockedProviderDependencies_Response)(nil), // 76: terraform1.GetLockedProviderDependencies.Response + (*BuildProviderPluginCache_Request)(nil), // 77: terraform1.BuildProviderPluginCache.Request + (*BuildProviderPluginCache_Event)(nil), // 78: terraform1.BuildProviderPluginCache.Event + (*BuildProviderPluginCache_Request_InstallMethod)(nil), // 79: terraform1.BuildProviderPluginCache.Request.InstallMethod + (*BuildProviderPluginCache_Event_Pending)(nil), // 80: terraform1.BuildProviderPluginCache.Event.Pending + (*BuildProviderPluginCache_Event_ProviderConstraints)(nil), // 81: terraform1.BuildProviderPluginCache.Event.ProviderConstraints + (*BuildProviderPluginCache_Event_ProviderVersion)(nil), // 82: terraform1.BuildProviderPluginCache.Event.ProviderVersion + (*BuildProviderPluginCache_Event_ProviderWarnings)(nil), // 83: terraform1.BuildProviderPluginCache.Event.ProviderWarnings + (*BuildProviderPluginCache_Event_FetchBegin)(nil), // 84: terraform1.BuildProviderPluginCache.Event.FetchBegin + (*BuildProviderPluginCache_Event_FetchComplete)(nil), // 85: terraform1.BuildProviderPluginCache.Event.FetchComplete + (*OpenProviderPluginCache_Request)(nil), // 86: terraform1.OpenProviderPluginCache.Request + (*OpenProviderPluginCache_Response)(nil), // 87: terraform1.OpenProviderPluginCache.Response + (*CloseProviderPluginCache_Request)(nil), // 88: terraform1.CloseProviderPluginCache.Request + (*CloseProviderPluginCache_Response)(nil), // 89: terraform1.CloseProviderPluginCache.Response + (*GetCachedProviders_Request)(nil), // 90: terraform1.GetCachedProviders.Request + (*GetCachedProviders_Response)(nil), // 91: terraform1.GetCachedProviders.Response + (*GetBuiltInProviders_Request)(nil), // 92: terraform1.GetBuiltInProviders.Request + (*GetBuiltInProviders_Response)(nil), // 93: terraform1.GetBuiltInProviders.Response + (*GetProviderSchema_Request)(nil), // 94: terraform1.GetProviderSchema.Request + (*GetProviderSchema_Response)(nil), // 95: terraform1.GetProviderSchema.Response + nil, // 96: terraform1.ProviderSchema.ManagedResourceTypesEntry + nil, // 97: terraform1.ProviderSchema.DataResourceTypesEntry + (*OpenStackConfiguration_Request)(nil), // 98: terraform1.OpenStackConfiguration.Request + (*OpenStackConfiguration_Response)(nil), // 99: terraform1.OpenStackConfiguration.Response + (*CloseStackConfiguration_Request)(nil), // 100: terraform1.CloseStackConfiguration.Request + (*CloseStackConfiguration_Response)(nil), // 101: terraform1.CloseStackConfiguration.Response + (*ValidateStackConfiguration_Request)(nil), // 102: terraform1.ValidateStackConfiguration.Request + (*ValidateStackConfiguration_Response)(nil), // 103: terraform1.ValidateStackConfiguration.Response + (*FindStackConfigurationComponents_Request)(nil), // 104: terraform1.FindStackConfigurationComponents.Request + (*FindStackConfigurationComponents_Response)(nil), // 105: terraform1.FindStackConfigurationComponents.Response + (*FindStackConfigurationComponents_StackConfig)(nil), // 106: terraform1.FindStackConfigurationComponents.StackConfig + (*FindStackConfigurationComponents_EmbeddedStack)(nil), // 107: terraform1.FindStackConfigurationComponents.EmbeddedStack + (*FindStackConfigurationComponents_Component)(nil), // 108: terraform1.FindStackConfigurationComponents.Component + nil, // 109: terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry + nil, // 110: terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry + (*PlanStackChanges_Request)(nil), // 111: terraform1.PlanStackChanges.Request + (*PlanStackChanges_Event)(nil), // 112: terraform1.PlanStackChanges.Event + nil, // 113: terraform1.PlanStackChanges.Request.PreviousStateEntry + nil, // 114: terraform1.PlanStackChanges.Request.InputValuesEntry + (*ApplyStackChanges_Request)(nil), // 115: terraform1.ApplyStackChanges.Request + (*ApplyStackChanges_Event)(nil), // 116: terraform1.ApplyStackChanges.Event + (*OpenStackInspector_Request)(nil), // 117: terraform1.OpenStackInspector.Request + (*OpenStackInspector_Response)(nil), // 118: terraform1.OpenStackInspector.Response + nil, // 119: terraform1.OpenStackInspector.Request.StateEntry + nil, // 120: terraform1.OpenStackInspector.Request.InputValuesEntry + (*InspectExpressionResult_Request)(nil), // 121: terraform1.InspectExpressionResult.Request + (*InspectExpressionResult_Response)(nil), // 122: terraform1.InspectExpressionResult.Response + (*AttributePath_Step)(nil), // 123: terraform1.AttributePath.Step + (*PlannedChange_ChangeDescription)(nil), // 124: terraform1.PlannedChange.ChangeDescription + (*PlannedChange_ComponentInstance)(nil), // 125: terraform1.PlannedChange.ComponentInstance + (*PlannedChange_ResourceInstance)(nil), // 126: terraform1.PlannedChange.ResourceInstance + (*PlannedChange_OutputValue)(nil), // 127: terraform1.PlannedChange.OutputValue + (*PlannedChange_ResourceInstance_Moved)(nil), // 128: terraform1.PlannedChange.ResourceInstance.Moved + (*PlannedChange_ResourceInstance_Imported)(nil), // 129: terraform1.PlannedChange.ResourceInstance.Imported + (*AppliedChange_RawChange)(nil), // 130: terraform1.AppliedChange.RawChange + (*AppliedChange_ChangeDescription)(nil), // 131: terraform1.AppliedChange.ChangeDescription + (*AppliedChange_ResourceInstance)(nil), // 132: terraform1.AppliedChange.ResourceInstance + (*AppliedChange_ComponentInstance)(nil), // 133: terraform1.AppliedChange.ComponentInstance + (*AppliedChange_OutputValue)(nil), // 134: terraform1.AppliedChange.OutputValue + (*AppliedChange_Nothing)(nil), // 135: terraform1.AppliedChange.Nothing + nil, // 136: terraform1.AppliedChange.ComponentInstance.OutputValuesEntry + (*StackChangeProgress_ComponentInstanceStatus)(nil), // 137: terraform1.StackChangeProgress.ComponentInstanceStatus + (*StackChangeProgress_ResourceInstanceStatus)(nil), // 138: terraform1.StackChangeProgress.ResourceInstanceStatus + (*StackChangeProgress_ResourceInstancePlannedChange)(nil), // 139: terraform1.StackChangeProgress.ResourceInstancePlannedChange + (*StackChangeProgress_ProvisionerStatus)(nil), // 140: terraform1.StackChangeProgress.ProvisionerStatus + (*StackChangeProgress_ProvisionerOutput)(nil), // 141: terraform1.StackChangeProgress.ProvisionerOutput + (*StackChangeProgress_ComponentInstanceChanges)(nil), // 142: terraform1.StackChangeProgress.ComponentInstanceChanges + (*StackChangeProgress_ComponentInstances)(nil), // 143: terraform1.StackChangeProgress.ComponentInstances + (*StackChangeProgress_ResourceInstancePlannedChange_Moved)(nil), // 144: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved + (*StackChangeProgress_ResourceInstancePlannedChange_Imported)(nil), // 145: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Imported + (*Schema_Block)(nil), // 146: terraform1.Schema.Block + (*Schema_Attribute)(nil), // 147: terraform1.Schema.Attribute + (*Schema_NestedBlock)(nil), // 148: terraform1.Schema.NestedBlock + (*Schema_Object)(nil), // 149: terraform1.Schema.Object + (*Schema_DocString)(nil), // 150: terraform1.Schema.DocString + (*ProviderPackageVersions_Request)(nil), // 151: terraform1.ProviderPackageVersions.Request + (*ProviderPackageVersions_Response)(nil), // 152: terraform1.ProviderPackageVersions.Response + (*FetchProviderPackage_Request)(nil), // 153: terraform1.FetchProviderPackage.Request + (*FetchProviderPackage_Response)(nil), // 154: terraform1.FetchProviderPackage.Response + (*FetchProviderPackage_PlatformResult)(nil), // 155: terraform1.FetchProviderPackage.PlatformResult + (*ModulePackageVersions_Request)(nil), // 156: terraform1.ModulePackageVersions.Request + (*ModulePackageVersions_Response)(nil), // 157: terraform1.ModulePackageVersions.Response + (*ModulePackageSourceAddr_Request)(nil), // 158: terraform1.ModulePackageSourceAddr.Request + (*ModulePackageSourceAddr_Response)(nil), // 159: terraform1.ModulePackageSourceAddr.Response + (*FetchModulePackage_Request)(nil), // 160: terraform1.FetchModulePackage.Request + (*FetchModulePackage_Response)(nil), // 161: terraform1.FetchModulePackage.Response + (*anypb.Any)(nil), // 162: google.protobuf.Any } var file_terraform1_proto_depIdxs = []int32{ - 61, // 0: terraform1.Config.credentials:type_name -> terraform1.Config.CredentialsEntry - 53, // 1: terraform1.ProviderSchema.provider_config:type_name -> terraform1.Schema - 93, // 2: terraform1.ProviderSchema.managed_resource_types:type_name -> terraform1.ProviderSchema.ManagedResourceTypesEntry - 94, // 3: terraform1.ProviderSchema.data_resource_types:type_name -> terraform1.ProviderSchema.DataResourceTypesEntry - 42, // 4: terraform1.DynamicValue.sensitive:type_name -> terraform1.AttributePath - 39, // 5: terraform1.DynamicValueChange.old:type_name -> terraform1.DynamicValue - 39, // 6: terraform1.DynamicValueChange.new:type_name -> terraform1.DynamicValue - 39, // 7: terraform1.DynamicValueWithSource.value:type_name -> terraform1.DynamicValue - 51, // 8: terraform1.DynamicValueWithSource.source_range:type_name -> terraform1.SourceRange - 120, // 9: terraform1.AttributePath.steps:type_name -> terraform1.AttributePath.Step - 159, // 10: terraform1.PlannedChange.raw:type_name -> google.protobuf.Any - 121, // 11: terraform1.PlannedChange.descriptions:type_name -> terraform1.PlannedChange.ChangeDescription - 127, // 12: terraform1.AppliedChange.raw:type_name -> terraform1.AppliedChange.RawChange - 128, // 13: terraform1.AppliedChange.descriptions:type_name -> terraform1.AppliedChange.ChangeDescription - 134, // 14: terraform1.StackChangeProgress.component_instance_status:type_name -> terraform1.StackChangeProgress.ComponentInstanceStatus - 135, // 15: terraform1.StackChangeProgress.resource_instance_status:type_name -> terraform1.StackChangeProgress.ResourceInstanceStatus - 136, // 16: terraform1.StackChangeProgress.resource_instance_planned_change:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange - 137, // 17: terraform1.StackChangeProgress.provisioner_status:type_name -> terraform1.StackChangeProgress.ProvisionerStatus - 138, // 18: terraform1.StackChangeProgress.provisioner_output:type_name -> terraform1.StackChangeProgress.ProvisionerOutput - 139, // 19: terraform1.StackChangeProgress.component_instance_changes:type_name -> terraform1.StackChangeProgress.ComponentInstanceChanges - 140, // 20: terraform1.StackChangeProgress.component_instances:type_name -> terraform1.StackChangeProgress.ComponentInstances + 64, // 0: terraform1.Config.credentials:type_name -> terraform1.Config.CredentialsEntry + 54, // 1: terraform1.ProviderSchema.provider_config:type_name -> terraform1.Schema + 96, // 2: terraform1.ProviderSchema.managed_resource_types:type_name -> terraform1.ProviderSchema.ManagedResourceTypesEntry + 97, // 3: terraform1.ProviderSchema.data_resource_types:type_name -> terraform1.ProviderSchema.DataResourceTypesEntry + 43, // 4: terraform1.DynamicValue.sensitive:type_name -> terraform1.AttributePath + 40, // 5: terraform1.DynamicValueChange.old:type_name -> terraform1.DynamicValue + 40, // 6: terraform1.DynamicValueChange.new:type_name -> terraform1.DynamicValue + 40, // 7: terraform1.DynamicValueWithSource.value:type_name -> terraform1.DynamicValue + 52, // 8: terraform1.DynamicValueWithSource.source_range:type_name -> terraform1.SourceRange + 123, // 9: terraform1.AttributePath.steps:type_name -> terraform1.AttributePath.Step + 162, // 10: terraform1.PlannedChange.raw:type_name -> google.protobuf.Any + 124, // 11: terraform1.PlannedChange.descriptions:type_name -> terraform1.PlannedChange.ChangeDescription + 130, // 12: terraform1.AppliedChange.raw:type_name -> terraform1.AppliedChange.RawChange + 131, // 13: terraform1.AppliedChange.descriptions:type_name -> terraform1.AppliedChange.ChangeDescription + 137, // 14: terraform1.StackChangeProgress.component_instance_status:type_name -> terraform1.StackChangeProgress.ComponentInstanceStatus + 138, // 15: terraform1.StackChangeProgress.resource_instance_status:type_name -> terraform1.StackChangeProgress.ResourceInstanceStatus + 139, // 16: terraform1.StackChangeProgress.resource_instance_planned_change:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange + 140, // 17: terraform1.StackChangeProgress.provisioner_status:type_name -> terraform1.StackChangeProgress.ProvisionerStatus + 141, // 18: terraform1.StackChangeProgress.provisioner_output:type_name -> terraform1.StackChangeProgress.ProvisionerOutput + 142, // 19: terraform1.StackChangeProgress.component_instance_changes:type_name -> terraform1.StackChangeProgress.ComponentInstanceChanges + 143, // 20: terraform1.StackChangeProgress.component_instances:type_name -> terraform1.StackChangeProgress.ComponentInstances 8, // 21: terraform1.Diagnostic.severity:type_name -> terraform1.Diagnostic.Severity - 51, // 22: terraform1.Diagnostic.subject:type_name -> terraform1.SourceRange - 51, // 23: terraform1.Diagnostic.context:type_name -> terraform1.SourceRange - 52, // 24: terraform1.SourceRange.start:type_name -> terraform1.SourcePos - 52, // 25: terraform1.SourceRange.end:type_name -> terraform1.SourcePos - 143, // 26: terraform1.Schema.block:type_name -> terraform1.Schema.Block - 13, // 27: terraform1.Handshake.Request.capabilities:type_name -> terraform1.ClientCapabilities - 15, // 28: terraform1.Handshake.Request.config:type_name -> terraform1.Config - 14, // 29: terraform1.Handshake.Response.capabilities:type_name -> terraform1.ServerCapabilities - 16, // 30: terraform1.Config.CredentialsEntry.value:type_name -> terraform1.HostCredential - 46, // 31: terraform1.OpenDependencyLockFile.Request.source_address:type_name -> terraform1.SourceAddress - 50, // 32: terraform1.OpenDependencyLockFile.Response.diagnostics:type_name -> terraform1.Diagnostic - 29, // 33: terraform1.CreateDependencyLocks.Request.provider_selections:type_name -> terraform1.ProviderPackage - 29, // 34: terraform1.GetLockedProviderDependencies.Response.selected_providers:type_name -> terraform1.ProviderPackage - 76, // 35: terraform1.BuildProviderPluginCache.Request.installation_methods:type_name -> terraform1.BuildProviderPluginCache.Request.InstallMethod - 77, // 36: terraform1.BuildProviderPluginCache.Event.pending:type_name -> terraform1.BuildProviderPluginCache.Event.Pending - 79, // 37: terraform1.BuildProviderPluginCache.Event.already_installed:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion - 79, // 38: terraform1.BuildProviderPluginCache.Event.built_in:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion - 78, // 39: terraform1.BuildProviderPluginCache.Event.query_begin:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderConstraints - 79, // 40: terraform1.BuildProviderPluginCache.Event.query_success:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion - 80, // 41: terraform1.BuildProviderPluginCache.Event.query_warnings:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderWarnings - 81, // 42: terraform1.BuildProviderPluginCache.Event.fetch_begin:type_name -> terraform1.BuildProviderPluginCache.Event.FetchBegin - 82, // 43: terraform1.BuildProviderPluginCache.Event.fetch_complete:type_name -> terraform1.BuildProviderPluginCache.Event.FetchComplete - 50, // 44: terraform1.BuildProviderPluginCache.Event.diagnostic:type_name -> terraform1.Diagnostic - 78, // 45: terraform1.BuildProviderPluginCache.Event.Pending.expected:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderConstraints - 79, // 46: terraform1.BuildProviderPluginCache.Event.FetchBegin.provider_version:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion - 79, // 47: terraform1.BuildProviderPluginCache.Event.FetchComplete.provider_version:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion + 52, // 22: terraform1.Diagnostic.subject:type_name -> terraform1.SourceRange + 52, // 23: terraform1.Diagnostic.context:type_name -> terraform1.SourceRange + 53, // 24: terraform1.SourceRange.start:type_name -> terraform1.SourcePos + 53, // 25: terraform1.SourceRange.end:type_name -> terraform1.SourcePos + 146, // 26: terraform1.Schema.block:type_name -> terraform1.Schema.Block + 14, // 27: terraform1.Handshake.Request.capabilities:type_name -> terraform1.ClientCapabilities + 16, // 28: terraform1.Handshake.Request.config:type_name -> terraform1.Config + 15, // 29: terraform1.Handshake.Response.capabilities:type_name -> terraform1.ServerCapabilities + 17, // 30: terraform1.Config.CredentialsEntry.value:type_name -> terraform1.HostCredential + 47, // 31: terraform1.OpenDependencyLockFile.Request.source_address:type_name -> terraform1.SourceAddress + 51, // 32: terraform1.OpenDependencyLockFile.Response.diagnostics:type_name -> terraform1.Diagnostic + 30, // 33: terraform1.CreateDependencyLocks.Request.provider_selections:type_name -> terraform1.ProviderPackage + 30, // 34: terraform1.GetLockedProviderDependencies.Response.selected_providers:type_name -> terraform1.ProviderPackage + 79, // 35: terraform1.BuildProviderPluginCache.Request.installation_methods:type_name -> terraform1.BuildProviderPluginCache.Request.InstallMethod + 80, // 36: terraform1.BuildProviderPluginCache.Event.pending:type_name -> terraform1.BuildProviderPluginCache.Event.Pending + 82, // 37: terraform1.BuildProviderPluginCache.Event.already_installed:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion + 82, // 38: terraform1.BuildProviderPluginCache.Event.built_in:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion + 81, // 39: terraform1.BuildProviderPluginCache.Event.query_begin:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderConstraints + 82, // 40: terraform1.BuildProviderPluginCache.Event.query_success:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion + 83, // 41: terraform1.BuildProviderPluginCache.Event.query_warnings:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderWarnings + 84, // 42: terraform1.BuildProviderPluginCache.Event.fetch_begin:type_name -> terraform1.BuildProviderPluginCache.Event.FetchBegin + 85, // 43: terraform1.BuildProviderPluginCache.Event.fetch_complete:type_name -> terraform1.BuildProviderPluginCache.Event.FetchComplete + 51, // 44: terraform1.BuildProviderPluginCache.Event.diagnostic:type_name -> terraform1.Diagnostic + 81, // 45: terraform1.BuildProviderPluginCache.Event.Pending.expected:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderConstraints + 82, // 46: terraform1.BuildProviderPluginCache.Event.FetchBegin.provider_version:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion + 82, // 47: terraform1.BuildProviderPluginCache.Event.FetchComplete.provider_version:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion 3, // 48: terraform1.BuildProviderPluginCache.Event.FetchComplete.auth_result:type_name -> terraform1.BuildProviderPluginCache.Event.FetchComplete.AuthResult - 29, // 49: terraform1.GetCachedProviders.Response.available_providers:type_name -> terraform1.ProviderPackage - 29, // 50: terraform1.GetBuiltInProviders.Response.available_providers:type_name -> terraform1.ProviderPackage - 30, // 51: terraform1.GetProviderSchema.Response.schema:type_name -> terraform1.ProviderSchema - 53, // 52: terraform1.ProviderSchema.ManagedResourceTypesEntry.value:type_name -> terraform1.Schema - 53, // 53: terraform1.ProviderSchema.DataResourceTypesEntry.value:type_name -> terraform1.Schema - 46, // 54: terraform1.OpenStackConfiguration.Request.source_address:type_name -> terraform1.SourceAddress - 50, // 55: terraform1.OpenStackConfiguration.Response.diagnostics:type_name -> terraform1.Diagnostic - 50, // 56: terraform1.ValidateStackConfiguration.Response.diagnostics:type_name -> terraform1.Diagnostic - 103, // 57: terraform1.FindStackConfigurationComponents.Response.config:type_name -> terraform1.FindStackConfigurationComponents.StackConfig - 106, // 58: terraform1.FindStackConfigurationComponents.StackConfig.components:type_name -> terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry - 107, // 59: terraform1.FindStackConfigurationComponents.StackConfig.embedded_stacks:type_name -> terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry + 30, // 49: terraform1.GetCachedProviders.Response.available_providers:type_name -> terraform1.ProviderPackage + 30, // 50: terraform1.GetBuiltInProviders.Response.available_providers:type_name -> terraform1.ProviderPackage + 31, // 51: terraform1.GetProviderSchema.Response.schema:type_name -> terraform1.ProviderSchema + 54, // 52: terraform1.ProviderSchema.ManagedResourceTypesEntry.value:type_name -> terraform1.Schema + 54, // 53: terraform1.ProviderSchema.DataResourceTypesEntry.value:type_name -> terraform1.Schema + 47, // 54: terraform1.OpenStackConfiguration.Request.source_address:type_name -> terraform1.SourceAddress + 51, // 55: terraform1.OpenStackConfiguration.Response.diagnostics:type_name -> terraform1.Diagnostic + 51, // 56: terraform1.ValidateStackConfiguration.Response.diagnostics:type_name -> terraform1.Diagnostic + 106, // 57: terraform1.FindStackConfigurationComponents.Response.config:type_name -> terraform1.FindStackConfigurationComponents.StackConfig + 109, // 58: terraform1.FindStackConfigurationComponents.StackConfig.components:type_name -> terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry + 110, // 59: terraform1.FindStackConfigurationComponents.StackConfig.embedded_stacks:type_name -> terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry 4, // 60: terraform1.FindStackConfigurationComponents.EmbeddedStack.instances:type_name -> terraform1.FindStackConfigurationComponents.Instances - 103, // 61: terraform1.FindStackConfigurationComponents.EmbeddedStack.config:type_name -> terraform1.FindStackConfigurationComponents.StackConfig + 106, // 61: terraform1.FindStackConfigurationComponents.EmbeddedStack.config:type_name -> terraform1.FindStackConfigurationComponents.StackConfig 4, // 62: terraform1.FindStackConfigurationComponents.Component.instances:type_name -> terraform1.FindStackConfigurationComponents.Instances - 105, // 63: terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry.value:type_name -> terraform1.FindStackConfigurationComponents.Component - 104, // 64: terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry.value:type_name -> terraform1.FindStackConfigurationComponents.EmbeddedStack + 108, // 63: terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry.value:type_name -> terraform1.FindStackConfigurationComponents.Component + 107, // 64: terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry.value:type_name -> terraform1.FindStackConfigurationComponents.EmbeddedStack 1, // 65: terraform1.PlanStackChanges.Request.plan_mode:type_name -> terraform1.PlanMode - 110, // 66: terraform1.PlanStackChanges.Request.previous_state:type_name -> terraform1.PlanStackChanges.Request.PreviousStateEntry - 111, // 67: terraform1.PlanStackChanges.Request.input_values:type_name -> terraform1.PlanStackChanges.Request.InputValuesEntry - 47, // 68: terraform1.PlanStackChanges.Event.planned_change:type_name -> terraform1.PlannedChange - 50, // 69: terraform1.PlanStackChanges.Event.diagnostic:type_name -> terraform1.Diagnostic - 49, // 70: terraform1.PlanStackChanges.Event.progress:type_name -> terraform1.StackChangeProgress - 159, // 71: terraform1.PlanStackChanges.Request.PreviousStateEntry.value:type_name -> google.protobuf.Any - 41, // 72: terraform1.PlanStackChanges.Request.InputValuesEntry.value:type_name -> terraform1.DynamicValueWithSource - 159, // 73: terraform1.ApplyStackChanges.Request.planned_changes:type_name -> google.protobuf.Any - 48, // 74: terraform1.ApplyStackChanges.Event.applied_change:type_name -> terraform1.AppliedChange - 50, // 75: terraform1.ApplyStackChanges.Event.diagnostic:type_name -> terraform1.Diagnostic - 49, // 76: terraform1.ApplyStackChanges.Event.progress:type_name -> terraform1.StackChangeProgress - 116, // 77: terraform1.OpenStackInspector.Request.state:type_name -> terraform1.OpenStackInspector.Request.StateEntry - 117, // 78: terraform1.OpenStackInspector.Request.input_values:type_name -> terraform1.OpenStackInspector.Request.InputValuesEntry - 50, // 79: terraform1.OpenStackInspector.Response.diagnostics:type_name -> terraform1.Diagnostic - 159, // 80: terraform1.OpenStackInspector.Request.StateEntry.value:type_name -> google.protobuf.Any - 41, // 81: terraform1.OpenStackInspector.Request.InputValuesEntry.value:type_name -> terraform1.DynamicValueWithSource - 39, // 82: terraform1.InspectExpressionResult.Response.result:type_name -> terraform1.DynamicValue - 50, // 83: terraform1.InspectExpressionResult.Response.diagnostics:type_name -> terraform1.Diagnostic - 122, // 84: terraform1.PlannedChange.ChangeDescription.component_instance_planned:type_name -> terraform1.PlannedChange.ComponentInstance - 123, // 85: terraform1.PlannedChange.ChangeDescription.resource_instance_planned:type_name -> terraform1.PlannedChange.ResourceInstance - 124, // 86: terraform1.PlannedChange.ChangeDescription.output_value_planned:type_name -> terraform1.PlannedChange.OutputValue - 43, // 87: terraform1.PlannedChange.ComponentInstance.addr:type_name -> terraform1.ComponentInstanceInStackAddr + 113, // 66: terraform1.PlanStackChanges.Request.previous_state:type_name -> terraform1.PlanStackChanges.Request.PreviousStateEntry + 114, // 67: terraform1.PlanStackChanges.Request.input_values:type_name -> terraform1.PlanStackChanges.Request.InputValuesEntry + 48, // 68: terraform1.PlanStackChanges.Event.planned_change:type_name -> terraform1.PlannedChange + 51, // 69: terraform1.PlanStackChanges.Event.diagnostic:type_name -> terraform1.Diagnostic + 50, // 70: terraform1.PlanStackChanges.Event.progress:type_name -> terraform1.StackChangeProgress + 162, // 71: terraform1.PlanStackChanges.Request.PreviousStateEntry.value:type_name -> google.protobuf.Any + 42, // 72: terraform1.PlanStackChanges.Request.InputValuesEntry.value:type_name -> terraform1.DynamicValueWithSource + 162, // 73: terraform1.ApplyStackChanges.Request.planned_changes:type_name -> google.protobuf.Any + 49, // 74: terraform1.ApplyStackChanges.Event.applied_change:type_name -> terraform1.AppliedChange + 51, // 75: terraform1.ApplyStackChanges.Event.diagnostic:type_name -> terraform1.Diagnostic + 50, // 76: terraform1.ApplyStackChanges.Event.progress:type_name -> terraform1.StackChangeProgress + 119, // 77: terraform1.OpenStackInspector.Request.state:type_name -> terraform1.OpenStackInspector.Request.StateEntry + 120, // 78: terraform1.OpenStackInspector.Request.input_values:type_name -> terraform1.OpenStackInspector.Request.InputValuesEntry + 51, // 79: terraform1.OpenStackInspector.Response.diagnostics:type_name -> terraform1.Diagnostic + 162, // 80: terraform1.OpenStackInspector.Request.StateEntry.value:type_name -> google.protobuf.Any + 42, // 81: terraform1.OpenStackInspector.Request.InputValuesEntry.value:type_name -> terraform1.DynamicValueWithSource + 40, // 82: terraform1.InspectExpressionResult.Response.result:type_name -> terraform1.DynamicValue + 51, // 83: terraform1.InspectExpressionResult.Response.diagnostics:type_name -> terraform1.Diagnostic + 125, // 84: terraform1.PlannedChange.ChangeDescription.component_instance_planned:type_name -> terraform1.PlannedChange.ComponentInstance + 126, // 85: terraform1.PlannedChange.ChangeDescription.resource_instance_planned:type_name -> terraform1.PlannedChange.ResourceInstance + 127, // 86: terraform1.PlannedChange.ChangeDescription.output_value_planned:type_name -> terraform1.PlannedChange.OutputValue + 44, // 87: terraform1.PlannedChange.ComponentInstance.addr:type_name -> terraform1.ComponentInstanceInStackAddr 2, // 88: terraform1.PlannedChange.ComponentInstance.actions:type_name -> terraform1.ChangeType - 45, // 89: terraform1.PlannedChange.ResourceInstance.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 46, // 89: terraform1.PlannedChange.ResourceInstance.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr 2, // 90: terraform1.PlannedChange.ResourceInstance.actions:type_name -> terraform1.ChangeType - 40, // 91: terraform1.PlannedChange.ResourceInstance.values:type_name -> terraform1.DynamicValueChange - 125, // 92: terraform1.PlannedChange.ResourceInstance.moved:type_name -> terraform1.PlannedChange.ResourceInstance.Moved - 126, // 93: terraform1.PlannedChange.ResourceInstance.imported:type_name -> terraform1.PlannedChange.ResourceInstance.Imported + 41, // 91: terraform1.PlannedChange.ResourceInstance.values:type_name -> terraform1.DynamicValueChange + 128, // 92: terraform1.PlannedChange.ResourceInstance.moved:type_name -> terraform1.PlannedChange.ResourceInstance.Moved + 129, // 93: terraform1.PlannedChange.ResourceInstance.imported:type_name -> terraform1.PlannedChange.ResourceInstance.Imported 0, // 94: terraform1.PlannedChange.ResourceInstance.resource_mode:type_name -> terraform1.ResourceMode - 39, // 95: terraform1.PlannedChange.ResourceInstance.previous_run_value:type_name -> terraform1.DynamicValue - 42, // 96: terraform1.PlannedChange.ResourceInstance.replace_paths:type_name -> terraform1.AttributePath + 40, // 95: terraform1.PlannedChange.ResourceInstance.previous_run_value:type_name -> terraform1.DynamicValue + 43, // 96: terraform1.PlannedChange.ResourceInstance.replace_paths:type_name -> terraform1.AttributePath 2, // 97: terraform1.PlannedChange.OutputValue.actions:type_name -> terraform1.ChangeType - 40, // 98: terraform1.PlannedChange.OutputValue.values:type_name -> terraform1.DynamicValueChange - 44, // 99: terraform1.PlannedChange.ResourceInstance.Moved.prev_addr:type_name -> terraform1.ResourceInstanceInStackAddr - 159, // 100: terraform1.AppliedChange.RawChange.value:type_name -> google.protobuf.Any - 132, // 101: terraform1.AppliedChange.ChangeDescription.deleted:type_name -> terraform1.AppliedChange.Nothing - 129, // 102: terraform1.AppliedChange.ChangeDescription.resource_instance:type_name -> terraform1.AppliedChange.ResourceInstance - 131, // 103: terraform1.AppliedChange.ChangeDescription.output_value:type_name -> terraform1.AppliedChange.OutputValue - 130, // 104: terraform1.AppliedChange.ChangeDescription.component_instance:type_name -> terraform1.AppliedChange.ComponentInstance - 45, // 105: terraform1.AppliedChange.ResourceInstance.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr - 39, // 106: terraform1.AppliedChange.ResourceInstance.new_value:type_name -> terraform1.DynamicValue + 41, // 98: terraform1.PlannedChange.OutputValue.values:type_name -> terraform1.DynamicValueChange + 45, // 99: terraform1.PlannedChange.ResourceInstance.Moved.prev_addr:type_name -> terraform1.ResourceInstanceInStackAddr + 162, // 100: terraform1.AppliedChange.RawChange.value:type_name -> google.protobuf.Any + 135, // 101: terraform1.AppliedChange.ChangeDescription.deleted:type_name -> terraform1.AppliedChange.Nothing + 132, // 102: terraform1.AppliedChange.ChangeDescription.resource_instance:type_name -> terraform1.AppliedChange.ResourceInstance + 134, // 103: terraform1.AppliedChange.ChangeDescription.output_value:type_name -> terraform1.AppliedChange.OutputValue + 133, // 104: terraform1.AppliedChange.ChangeDescription.component_instance:type_name -> terraform1.AppliedChange.ComponentInstance + 46, // 105: terraform1.AppliedChange.ResourceInstance.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 40, // 106: terraform1.AppliedChange.ResourceInstance.new_value:type_name -> terraform1.DynamicValue 0, // 107: terraform1.AppliedChange.ResourceInstance.resource_mode:type_name -> terraform1.ResourceMode - 133, // 108: terraform1.AppliedChange.ComponentInstance.output_values:type_name -> terraform1.AppliedChange.ComponentInstance.OutputValuesEntry - 39, // 109: terraform1.AppliedChange.OutputValue.new_value:type_name -> terraform1.DynamicValue - 39, // 110: terraform1.AppliedChange.ComponentInstance.OutputValuesEntry.value:type_name -> terraform1.DynamicValue - 43, // 111: terraform1.StackChangeProgress.ComponentInstanceStatus.addr:type_name -> terraform1.ComponentInstanceInStackAddr + 136, // 108: terraform1.AppliedChange.ComponentInstance.output_values:type_name -> terraform1.AppliedChange.ComponentInstance.OutputValuesEntry + 40, // 109: terraform1.AppliedChange.OutputValue.new_value:type_name -> terraform1.DynamicValue + 40, // 110: terraform1.AppliedChange.ComponentInstance.OutputValuesEntry.value:type_name -> terraform1.DynamicValue + 44, // 111: terraform1.StackChangeProgress.ComponentInstanceStatus.addr:type_name -> terraform1.ComponentInstanceInStackAddr 5, // 112: terraform1.StackChangeProgress.ComponentInstanceStatus.status:type_name -> terraform1.StackChangeProgress.ComponentInstanceStatus.Status - 45, // 113: terraform1.StackChangeProgress.ResourceInstanceStatus.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 46, // 113: terraform1.StackChangeProgress.ResourceInstanceStatus.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr 6, // 114: terraform1.StackChangeProgress.ResourceInstanceStatus.status:type_name -> terraform1.StackChangeProgress.ResourceInstanceStatus.Status - 45, // 115: terraform1.StackChangeProgress.ResourceInstancePlannedChange.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 46, // 115: terraform1.StackChangeProgress.ResourceInstancePlannedChange.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr 2, // 116: terraform1.StackChangeProgress.ResourceInstancePlannedChange.actions:type_name -> terraform1.ChangeType - 141, // 117: terraform1.StackChangeProgress.ResourceInstancePlannedChange.moved:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved - 142, // 118: terraform1.StackChangeProgress.ResourceInstancePlannedChange.imported:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange.Imported - 45, // 119: terraform1.StackChangeProgress.ProvisionerStatus.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr - 137, // 120: terraform1.StackChangeProgress.ProvisionerStatus.status:type_name -> terraform1.StackChangeProgress.ProvisionerStatus - 45, // 121: terraform1.StackChangeProgress.ProvisionerOutput.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr - 43, // 122: terraform1.StackChangeProgress.ComponentInstanceChanges.addr:type_name -> terraform1.ComponentInstanceInStackAddr - 44, // 123: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved.prev_addr:type_name -> terraform1.ResourceInstanceInStackAddr - 144, // 124: terraform1.Schema.Block.attributes:type_name -> terraform1.Schema.Attribute - 145, // 125: terraform1.Schema.Block.block_types:type_name -> terraform1.Schema.NestedBlock - 147, // 126: terraform1.Schema.Block.description:type_name -> terraform1.Schema.DocString - 146, // 127: terraform1.Schema.Attribute.nested_type:type_name -> terraform1.Schema.Object - 147, // 128: terraform1.Schema.Attribute.description:type_name -> terraform1.Schema.DocString - 143, // 129: terraform1.Schema.NestedBlock.block:type_name -> terraform1.Schema.Block + 144, // 117: terraform1.StackChangeProgress.ResourceInstancePlannedChange.moved:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved + 145, // 118: terraform1.StackChangeProgress.ResourceInstancePlannedChange.imported:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange.Imported + 46, // 119: terraform1.StackChangeProgress.ProvisionerStatus.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 140, // 120: terraform1.StackChangeProgress.ProvisionerStatus.status:type_name -> terraform1.StackChangeProgress.ProvisionerStatus + 46, // 121: terraform1.StackChangeProgress.ProvisionerOutput.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 44, // 122: terraform1.StackChangeProgress.ComponentInstanceChanges.addr:type_name -> terraform1.ComponentInstanceInStackAddr + 45, // 123: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved.prev_addr:type_name -> terraform1.ResourceInstanceInStackAddr + 147, // 124: terraform1.Schema.Block.attributes:type_name -> terraform1.Schema.Attribute + 148, // 125: terraform1.Schema.Block.block_types:type_name -> terraform1.Schema.NestedBlock + 150, // 126: terraform1.Schema.Block.description:type_name -> terraform1.Schema.DocString + 149, // 127: terraform1.Schema.Attribute.nested_type:type_name -> terraform1.Schema.Object + 150, // 128: terraform1.Schema.Attribute.description:type_name -> terraform1.Schema.DocString + 146, // 129: terraform1.Schema.NestedBlock.block:type_name -> terraform1.Schema.Block 9, // 130: terraform1.Schema.NestedBlock.nesting:type_name -> terraform1.Schema.NestedBlock.NestingMode - 144, // 131: terraform1.Schema.Object.attributes:type_name -> terraform1.Schema.Attribute + 147, // 131: terraform1.Schema.Object.attributes:type_name -> terraform1.Schema.Attribute 10, // 132: terraform1.Schema.Object.nesting:type_name -> terraform1.Schema.Object.NestingMode 11, // 133: terraform1.Schema.DocString.format:type_name -> terraform1.Schema.DocString.Format - 50, // 134: terraform1.ProviderPackageVersions.Response.diagnostics:type_name -> terraform1.Diagnostic - 152, // 135: terraform1.FetchProviderPackage.Response.results:type_name -> terraform1.FetchProviderPackage.PlatformResult - 50, // 136: terraform1.FetchProviderPackage.Response.diagnostics:type_name -> terraform1.Diagnostic - 29, // 137: terraform1.FetchProviderPackage.PlatformResult.provider:type_name -> terraform1.ProviderPackage - 50, // 138: terraform1.FetchProviderPackage.PlatformResult.diagnostics:type_name -> terraform1.Diagnostic - 50, // 139: terraform1.ModulePackageVersions.Response.diagnostics:type_name -> terraform1.Diagnostic - 50, // 140: terraform1.ModulePackageSourceAddr.Response.diagnostics:type_name -> terraform1.Diagnostic - 50, // 141: terraform1.FetchModulePackage.Response.diagnostics:type_name -> terraform1.Diagnostic - 59, // 142: terraform1.Setup.Handshake:input_type -> terraform1.Handshake.Request - 62, // 143: terraform1.Dependencies.OpenSourceBundle:input_type -> terraform1.OpenSourceBundle.Request - 64, // 144: terraform1.Dependencies.CloseSourceBundle:input_type -> terraform1.CloseSourceBundle.Request - 66, // 145: terraform1.Dependencies.OpenDependencyLockFile:input_type -> terraform1.OpenDependencyLockFile.Request - 68, // 146: terraform1.Dependencies.CreateDependencyLocks:input_type -> terraform1.CreateDependencyLocks.Request - 70, // 147: terraform1.Dependencies.CloseDependencyLocks:input_type -> terraform1.CloseDependencyLocks.Request - 72, // 148: terraform1.Dependencies.GetLockedProviderDependencies:input_type -> terraform1.GetLockedProviderDependencies.Request - 74, // 149: terraform1.Dependencies.BuildProviderPluginCache:input_type -> terraform1.BuildProviderPluginCache.Request - 83, // 150: terraform1.Dependencies.OpenProviderPluginCache:input_type -> terraform1.OpenProviderPluginCache.Request - 85, // 151: terraform1.Dependencies.CloseProviderPluginCache:input_type -> terraform1.CloseProviderPluginCache.Request - 87, // 152: terraform1.Dependencies.GetCachedProviders:input_type -> terraform1.GetCachedProviders.Request - 89, // 153: terraform1.Dependencies.GetBuiltInProviders:input_type -> terraform1.GetBuiltInProviders.Request - 91, // 154: terraform1.Dependencies.GetProviderSchema:input_type -> terraform1.GetProviderSchema.Request - 95, // 155: terraform1.Stacks.OpenStackConfiguration:input_type -> terraform1.OpenStackConfiguration.Request - 97, // 156: terraform1.Stacks.CloseStackConfiguration:input_type -> terraform1.CloseStackConfiguration.Request - 99, // 157: terraform1.Stacks.ValidateStackConfiguration:input_type -> terraform1.ValidateStackConfiguration.Request - 101, // 158: terraform1.Stacks.FindStackConfigurationComponents:input_type -> terraform1.FindStackConfigurationComponents.Request - 108, // 159: terraform1.Stacks.PlanStackChanges:input_type -> terraform1.PlanStackChanges.Request - 112, // 160: terraform1.Stacks.ApplyStackChanges:input_type -> terraform1.ApplyStackChanges.Request - 114, // 161: terraform1.Stacks.OpenStackInspector:input_type -> terraform1.OpenStackInspector.Request - 118, // 162: terraform1.Stacks.InspectExpressionResult:input_type -> terraform1.InspectExpressionResult.Request - 148, // 163: terraform1.Packages.ProviderPackageVersions:input_type -> terraform1.ProviderPackageVersions.Request - 150, // 164: terraform1.Packages.FetchProviderPackage:input_type -> terraform1.FetchProviderPackage.Request - 153, // 165: terraform1.Packages.ModulePackageVersions:input_type -> terraform1.ModulePackageVersions.Request - 155, // 166: terraform1.Packages.ModulePackageSourceAddr:input_type -> terraform1.ModulePackageSourceAddr.Request - 157, // 167: terraform1.Packages.FetchModulePackage:input_type -> terraform1.FetchModulePackage.Request - 60, // 168: terraform1.Setup.Handshake:output_type -> terraform1.Handshake.Response - 63, // 169: terraform1.Dependencies.OpenSourceBundle:output_type -> terraform1.OpenSourceBundle.Response - 65, // 170: terraform1.Dependencies.CloseSourceBundle:output_type -> terraform1.CloseSourceBundle.Response - 67, // 171: terraform1.Dependencies.OpenDependencyLockFile:output_type -> terraform1.OpenDependencyLockFile.Response - 69, // 172: terraform1.Dependencies.CreateDependencyLocks:output_type -> terraform1.CreateDependencyLocks.Response - 71, // 173: terraform1.Dependencies.CloseDependencyLocks:output_type -> terraform1.CloseDependencyLocks.Response - 73, // 174: terraform1.Dependencies.GetLockedProviderDependencies:output_type -> terraform1.GetLockedProviderDependencies.Response - 75, // 175: terraform1.Dependencies.BuildProviderPluginCache:output_type -> terraform1.BuildProviderPluginCache.Event - 84, // 176: terraform1.Dependencies.OpenProviderPluginCache:output_type -> terraform1.OpenProviderPluginCache.Response - 86, // 177: terraform1.Dependencies.CloseProviderPluginCache:output_type -> terraform1.CloseProviderPluginCache.Response - 88, // 178: terraform1.Dependencies.GetCachedProviders:output_type -> terraform1.GetCachedProviders.Response - 90, // 179: terraform1.Dependencies.GetBuiltInProviders:output_type -> terraform1.GetBuiltInProviders.Response - 92, // 180: terraform1.Dependencies.GetProviderSchema:output_type -> terraform1.GetProviderSchema.Response - 96, // 181: terraform1.Stacks.OpenStackConfiguration:output_type -> terraform1.OpenStackConfiguration.Response - 98, // 182: terraform1.Stacks.CloseStackConfiguration:output_type -> terraform1.CloseStackConfiguration.Response - 100, // 183: terraform1.Stacks.ValidateStackConfiguration:output_type -> terraform1.ValidateStackConfiguration.Response - 102, // 184: terraform1.Stacks.FindStackConfigurationComponents:output_type -> terraform1.FindStackConfigurationComponents.Response - 109, // 185: terraform1.Stacks.PlanStackChanges:output_type -> terraform1.PlanStackChanges.Event - 113, // 186: terraform1.Stacks.ApplyStackChanges:output_type -> terraform1.ApplyStackChanges.Event - 115, // 187: terraform1.Stacks.OpenStackInspector:output_type -> terraform1.OpenStackInspector.Response - 119, // 188: terraform1.Stacks.InspectExpressionResult:output_type -> terraform1.InspectExpressionResult.Response - 149, // 189: terraform1.Packages.ProviderPackageVersions:output_type -> terraform1.ProviderPackageVersions.Response - 151, // 190: terraform1.Packages.FetchProviderPackage:output_type -> terraform1.FetchProviderPackage.Response - 154, // 191: terraform1.Packages.ModulePackageVersions:output_type -> terraform1.ModulePackageVersions.Response - 156, // 192: terraform1.Packages.ModulePackageSourceAddr:output_type -> terraform1.ModulePackageSourceAddr.Response - 158, // 193: terraform1.Packages.FetchModulePackage:output_type -> terraform1.FetchModulePackage.Response - 168, // [168:194] is the sub-list for method output_type - 142, // [142:168] is the sub-list for method input_type + 51, // 134: terraform1.ProviderPackageVersions.Response.diagnostics:type_name -> terraform1.Diagnostic + 155, // 135: terraform1.FetchProviderPackage.Response.results:type_name -> terraform1.FetchProviderPackage.PlatformResult + 51, // 136: terraform1.FetchProviderPackage.Response.diagnostics:type_name -> terraform1.Diagnostic + 30, // 137: terraform1.FetchProviderPackage.PlatformResult.provider:type_name -> terraform1.ProviderPackage + 51, // 138: terraform1.FetchProviderPackage.PlatformResult.diagnostics:type_name -> terraform1.Diagnostic + 51, // 139: terraform1.ModulePackageVersions.Response.diagnostics:type_name -> terraform1.Diagnostic + 51, // 140: terraform1.ModulePackageSourceAddr.Response.diagnostics:type_name -> terraform1.Diagnostic + 51, // 141: terraform1.FetchModulePackage.Response.diagnostics:type_name -> terraform1.Diagnostic + 60, // 142: terraform1.Setup.Handshake:input_type -> terraform1.Handshake.Request + 62, // 143: terraform1.Setup.Stop:input_type -> terraform1.Stop.Request + 65, // 144: terraform1.Dependencies.OpenSourceBundle:input_type -> terraform1.OpenSourceBundle.Request + 67, // 145: terraform1.Dependencies.CloseSourceBundle:input_type -> terraform1.CloseSourceBundle.Request + 69, // 146: terraform1.Dependencies.OpenDependencyLockFile:input_type -> terraform1.OpenDependencyLockFile.Request + 71, // 147: terraform1.Dependencies.CreateDependencyLocks:input_type -> terraform1.CreateDependencyLocks.Request + 73, // 148: terraform1.Dependencies.CloseDependencyLocks:input_type -> terraform1.CloseDependencyLocks.Request + 75, // 149: terraform1.Dependencies.GetLockedProviderDependencies:input_type -> terraform1.GetLockedProviderDependencies.Request + 77, // 150: terraform1.Dependencies.BuildProviderPluginCache:input_type -> terraform1.BuildProviderPluginCache.Request + 86, // 151: terraform1.Dependencies.OpenProviderPluginCache:input_type -> terraform1.OpenProviderPluginCache.Request + 88, // 152: terraform1.Dependencies.CloseProviderPluginCache:input_type -> terraform1.CloseProviderPluginCache.Request + 90, // 153: terraform1.Dependencies.GetCachedProviders:input_type -> terraform1.GetCachedProviders.Request + 92, // 154: terraform1.Dependencies.GetBuiltInProviders:input_type -> terraform1.GetBuiltInProviders.Request + 94, // 155: terraform1.Dependencies.GetProviderSchema:input_type -> terraform1.GetProviderSchema.Request + 98, // 156: terraform1.Stacks.OpenStackConfiguration:input_type -> terraform1.OpenStackConfiguration.Request + 100, // 157: terraform1.Stacks.CloseStackConfiguration:input_type -> terraform1.CloseStackConfiguration.Request + 102, // 158: terraform1.Stacks.ValidateStackConfiguration:input_type -> terraform1.ValidateStackConfiguration.Request + 104, // 159: terraform1.Stacks.FindStackConfigurationComponents:input_type -> terraform1.FindStackConfigurationComponents.Request + 111, // 160: terraform1.Stacks.PlanStackChanges:input_type -> terraform1.PlanStackChanges.Request + 115, // 161: terraform1.Stacks.ApplyStackChanges:input_type -> terraform1.ApplyStackChanges.Request + 117, // 162: terraform1.Stacks.OpenStackInspector:input_type -> terraform1.OpenStackInspector.Request + 121, // 163: terraform1.Stacks.InspectExpressionResult:input_type -> terraform1.InspectExpressionResult.Request + 151, // 164: terraform1.Packages.ProviderPackageVersions:input_type -> terraform1.ProviderPackageVersions.Request + 153, // 165: terraform1.Packages.FetchProviderPackage:input_type -> terraform1.FetchProviderPackage.Request + 156, // 166: terraform1.Packages.ModulePackageVersions:input_type -> terraform1.ModulePackageVersions.Request + 158, // 167: terraform1.Packages.ModulePackageSourceAddr:input_type -> terraform1.ModulePackageSourceAddr.Request + 160, // 168: terraform1.Packages.FetchModulePackage:input_type -> terraform1.FetchModulePackage.Request + 61, // 169: terraform1.Setup.Handshake:output_type -> terraform1.Handshake.Response + 63, // 170: terraform1.Setup.Stop:output_type -> terraform1.Stop.Response + 66, // 171: terraform1.Dependencies.OpenSourceBundle:output_type -> terraform1.OpenSourceBundle.Response + 68, // 172: terraform1.Dependencies.CloseSourceBundle:output_type -> terraform1.CloseSourceBundle.Response + 70, // 173: terraform1.Dependencies.OpenDependencyLockFile:output_type -> terraform1.OpenDependencyLockFile.Response + 72, // 174: terraform1.Dependencies.CreateDependencyLocks:output_type -> terraform1.CreateDependencyLocks.Response + 74, // 175: terraform1.Dependencies.CloseDependencyLocks:output_type -> terraform1.CloseDependencyLocks.Response + 76, // 176: terraform1.Dependencies.GetLockedProviderDependencies:output_type -> terraform1.GetLockedProviderDependencies.Response + 78, // 177: terraform1.Dependencies.BuildProviderPluginCache:output_type -> terraform1.BuildProviderPluginCache.Event + 87, // 178: terraform1.Dependencies.OpenProviderPluginCache:output_type -> terraform1.OpenProviderPluginCache.Response + 89, // 179: terraform1.Dependencies.CloseProviderPluginCache:output_type -> terraform1.CloseProviderPluginCache.Response + 91, // 180: terraform1.Dependencies.GetCachedProviders:output_type -> terraform1.GetCachedProviders.Response + 93, // 181: terraform1.Dependencies.GetBuiltInProviders:output_type -> terraform1.GetBuiltInProviders.Response + 95, // 182: terraform1.Dependencies.GetProviderSchema:output_type -> terraform1.GetProviderSchema.Response + 99, // 183: terraform1.Stacks.OpenStackConfiguration:output_type -> terraform1.OpenStackConfiguration.Response + 101, // 184: terraform1.Stacks.CloseStackConfiguration:output_type -> terraform1.CloseStackConfiguration.Response + 103, // 185: terraform1.Stacks.ValidateStackConfiguration:output_type -> terraform1.ValidateStackConfiguration.Response + 105, // 186: terraform1.Stacks.FindStackConfigurationComponents:output_type -> terraform1.FindStackConfigurationComponents.Response + 112, // 187: terraform1.Stacks.PlanStackChanges:output_type -> terraform1.PlanStackChanges.Event + 116, // 188: terraform1.Stacks.ApplyStackChanges:output_type -> terraform1.ApplyStackChanges.Event + 118, // 189: terraform1.Stacks.OpenStackInspector:output_type -> terraform1.OpenStackInspector.Response + 122, // 190: terraform1.Stacks.InspectExpressionResult:output_type -> terraform1.InspectExpressionResult.Response + 152, // 191: terraform1.Packages.ProviderPackageVersions:output_type -> terraform1.ProviderPackageVersions.Response + 154, // 192: terraform1.Packages.FetchProviderPackage:output_type -> terraform1.FetchProviderPackage.Response + 157, // 193: terraform1.Packages.ModulePackageVersions:output_type -> terraform1.ModulePackageVersions.Response + 159, // 194: terraform1.Packages.ModulePackageSourceAddr:output_type -> terraform1.ModulePackageSourceAddr.Response + 161, // 195: terraform1.Packages.FetchModulePackage:output_type -> terraform1.FetchModulePackage.Response + 169, // [169:196] is the sub-list for method output_type + 142, // [142:169] is the sub-list for method input_type 142, // [142:142] is the sub-list for extension type_name 142, // [142:142] is the sub-list for extension extendee 0, // [0:142] is the sub-list for field type_name @@ -10548,7 +10673,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClientCapabilities); i { + switch v := v.(*Stop); i { case 0: return &v.state case 1: @@ -10560,7 +10685,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerCapabilities); i { + switch v := v.(*ClientCapabilities); i { case 0: return &v.state case 1: @@ -10572,7 +10697,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Config); i { + switch v := v.(*ServerCapabilities); i { case 0: return &v.state case 1: @@ -10584,7 +10709,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HostCredential); i { + switch v := v.(*Config); i { case 0: return &v.state case 1: @@ -10596,7 +10721,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenSourceBundle); i { + switch v := v.(*HostCredential); i { case 0: return &v.state case 1: @@ -10608,7 +10733,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseSourceBundle); i { + switch v := v.(*OpenSourceBundle); i { case 0: return &v.state case 1: @@ -10620,7 +10745,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenDependencyLockFile); i { + switch v := v.(*CloseSourceBundle); i { case 0: return &v.state case 1: @@ -10632,7 +10757,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateDependencyLocks); i { + switch v := v.(*OpenDependencyLockFile); i { case 0: return &v.state case 1: @@ -10644,7 +10769,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseDependencyLocks); i { + switch v := v.(*CreateDependencyLocks); i { case 0: return &v.state case 1: @@ -10656,7 +10781,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLockedProviderDependencies); i { + switch v := v.(*CloseDependencyLocks); i { case 0: return &v.state case 1: @@ -10668,7 +10793,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache); i { + switch v := v.(*GetLockedProviderDependencies); i { case 0: return &v.state case 1: @@ -10680,7 +10805,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenProviderPluginCache); i { + switch v := v.(*BuildProviderPluginCache); i { case 0: return &v.state case 1: @@ -10692,7 +10817,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseProviderPluginCache); i { + switch v := v.(*OpenProviderPluginCache); i { case 0: return &v.state case 1: @@ -10704,7 +10829,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCachedProviders); i { + switch v := v.(*CloseProviderPluginCache); i { case 0: return &v.state case 1: @@ -10716,7 +10841,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBuiltInProviders); i { + switch v := v.(*GetCachedProviders); i { case 0: return &v.state case 1: @@ -10728,7 +10853,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetProviderSchema); i { + switch v := v.(*GetBuiltInProviders); i { case 0: return &v.state case 1: @@ -10740,7 +10865,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProviderPackage); i { + switch v := v.(*GetProviderSchema); i { case 0: return &v.state case 1: @@ -10752,7 +10877,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProviderSchema); i { + switch v := v.(*ProviderPackage); i { case 0: return &v.state case 1: @@ -10764,7 +10889,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenStackConfiguration); i { + switch v := v.(*ProviderSchema); i { case 0: return &v.state case 1: @@ -10776,7 +10901,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseStackConfiguration); i { + switch v := v.(*OpenStackConfiguration); i { case 0: return &v.state case 1: @@ -10788,7 +10913,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateStackConfiguration); i { + switch v := v.(*CloseStackConfiguration); i { case 0: return &v.state case 1: @@ -10800,7 +10925,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindStackConfigurationComponents); i { + switch v := v.(*ValidateStackConfiguration); i { case 0: return &v.state case 1: @@ -10812,7 +10937,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PlanStackChanges); i { + switch v := v.(*FindStackConfigurationComponents); i { case 0: return &v.state case 1: @@ -10824,7 +10949,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApplyStackChanges); i { + switch v := v.(*PlanStackChanges); i { case 0: return &v.state case 1: @@ -10836,7 +10961,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenStackInspector); i { + switch v := v.(*ApplyStackChanges); i { case 0: return &v.state case 1: @@ -10848,7 +10973,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InspectExpressionResult); i { + switch v := v.(*OpenStackInspector); i { case 0: return &v.state case 1: @@ -10860,7 +10985,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DynamicValue); i { + switch v := v.(*InspectExpressionResult); i { case 0: return &v.state case 1: @@ -10872,7 +10997,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DynamicValueChange); i { + switch v := v.(*DynamicValue); i { case 0: return &v.state case 1: @@ -10884,7 +11009,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DynamicValueWithSource); i { + switch v := v.(*DynamicValueChange); i { case 0: return &v.state case 1: @@ -10896,7 +11021,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttributePath); i { + switch v := v.(*DynamicValueWithSource); i { case 0: return &v.state case 1: @@ -10908,7 +11033,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ComponentInstanceInStackAddr); i { + switch v := v.(*AttributePath); i { case 0: return &v.state case 1: @@ -10920,7 +11045,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceInstanceInStackAddr); i { + switch v := v.(*ComponentInstanceInStackAddr); i { case 0: return &v.state case 1: @@ -10932,7 +11057,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceInstanceObjectInStackAddr); i { + switch v := v.(*ResourceInstanceInStackAddr); i { case 0: return &v.state case 1: @@ -10944,7 +11069,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SourceAddress); i { + switch v := v.(*ResourceInstanceObjectInStackAddr); i { case 0: return &v.state case 1: @@ -10956,7 +11081,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PlannedChange); i { + switch v := v.(*SourceAddress); i { case 0: return &v.state case 1: @@ -10968,7 +11093,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppliedChange); i { + switch v := v.(*PlannedChange); i { case 0: return &v.state case 1: @@ -10980,7 +11105,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StackChangeProgress); i { + switch v := v.(*AppliedChange); i { case 0: return &v.state case 1: @@ -10992,7 +11117,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Diagnostic); i { + switch v := v.(*StackChangeProgress); i { case 0: return &v.state case 1: @@ -11004,7 +11129,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SourceRange); i { + switch v := v.(*Diagnostic); i { case 0: return &v.state case 1: @@ -11016,7 +11141,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SourcePos); i { + switch v := v.(*SourceRange); i { case 0: return &v.state case 1: @@ -11028,7 +11153,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Schema); i { + switch v := v.(*SourcePos); i { case 0: return &v.state case 1: @@ -11040,7 +11165,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProviderPackageVersions); i { + switch v := v.(*Schema); i { case 0: return &v.state case 1: @@ -11052,7 +11177,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FetchProviderPackage); i { + switch v := v.(*ProviderPackageVersions); i { case 0: return &v.state case 1: @@ -11064,7 +11189,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ModulePackageVersions); i { + switch v := v.(*FetchProviderPackage); i { case 0: return &v.state case 1: @@ -11076,7 +11201,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ModulePackageSourceAddr); i { + switch v := v.(*ModulePackageVersions); i { case 0: return &v.state case 1: @@ -11088,7 +11213,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FetchModulePackage); i { + switch v := v.(*ModulePackageSourceAddr); i { case 0: return &v.state case 1: @@ -11100,7 +11225,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Handshake_Request); i { + switch v := v.(*FetchModulePackage); i { case 0: return &v.state case 1: @@ -11112,6 +11237,18 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Handshake_Request); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Handshake_Response); i { case 0: return &v.state @@ -11124,7 +11261,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenSourceBundle_Request); i { + switch v := v.(*Stop_Request); i { case 0: return &v.state case 1: @@ -11136,19 +11273,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenSourceBundle_Response); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_terraform1_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseSourceBundle_Request); i { + switch v := v.(*Stop_Response); i { case 0: return &v.state case 1: @@ -11160,7 +11285,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseSourceBundle_Response); i { + switch v := v.(*OpenSourceBundle_Request); i { case 0: return &v.state case 1: @@ -11172,7 +11297,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenDependencyLockFile_Request); i { + switch v := v.(*OpenSourceBundle_Response); i { case 0: return &v.state case 1: @@ -11184,7 +11309,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenDependencyLockFile_Response); i { + switch v := v.(*CloseSourceBundle_Request); i { case 0: return &v.state case 1: @@ -11196,7 +11321,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateDependencyLocks_Request); i { + switch v := v.(*CloseSourceBundle_Response); i { case 0: return &v.state case 1: @@ -11208,7 +11333,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateDependencyLocks_Response); i { + switch v := v.(*OpenDependencyLockFile_Request); i { case 0: return &v.state case 1: @@ -11220,7 +11345,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseDependencyLocks_Request); i { + switch v := v.(*OpenDependencyLockFile_Response); i { case 0: return &v.state case 1: @@ -11232,7 +11357,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseDependencyLocks_Response); i { + switch v := v.(*CreateDependencyLocks_Request); i { case 0: return &v.state case 1: @@ -11244,7 +11369,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLockedProviderDependencies_Request); i { + switch v := v.(*CreateDependencyLocks_Response); i { case 0: return &v.state case 1: @@ -11256,7 +11381,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLockedProviderDependencies_Response); i { + switch v := v.(*CloseDependencyLocks_Request); i { case 0: return &v.state case 1: @@ -11268,7 +11393,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Request); i { + switch v := v.(*CloseDependencyLocks_Response); i { case 0: return &v.state case 1: @@ -11280,7 +11405,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Event); i { + switch v := v.(*GetLockedProviderDependencies_Request); i { case 0: return &v.state case 1: @@ -11292,7 +11417,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Request_InstallMethod); i { + switch v := v.(*GetLockedProviderDependencies_Response); i { case 0: return &v.state case 1: @@ -11304,7 +11429,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Event_Pending); i { + switch v := v.(*BuildProviderPluginCache_Request); i { case 0: return &v.state case 1: @@ -11316,7 +11441,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Event_ProviderConstraints); i { + switch v := v.(*BuildProviderPluginCache_Event); i { case 0: return &v.state case 1: @@ -11328,7 +11453,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Event_ProviderVersion); i { + switch v := v.(*BuildProviderPluginCache_Request_InstallMethod); i { case 0: return &v.state case 1: @@ -11340,7 +11465,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Event_ProviderWarnings); i { + switch v := v.(*BuildProviderPluginCache_Event_Pending); i { case 0: return &v.state case 1: @@ -11352,7 +11477,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Event_FetchBegin); i { + switch v := v.(*BuildProviderPluginCache_Event_ProviderConstraints); i { case 0: return &v.state case 1: @@ -11364,7 +11489,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildProviderPluginCache_Event_FetchComplete); i { + switch v := v.(*BuildProviderPluginCache_Event_ProviderVersion); i { case 0: return &v.state case 1: @@ -11376,7 +11501,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenProviderPluginCache_Request); i { + switch v := v.(*BuildProviderPluginCache_Event_ProviderWarnings); i { case 0: return &v.state case 1: @@ -11388,7 +11513,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenProviderPluginCache_Response); i { + switch v := v.(*BuildProviderPluginCache_Event_FetchBegin); i { case 0: return &v.state case 1: @@ -11400,7 +11525,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseProviderPluginCache_Request); i { + switch v := v.(*BuildProviderPluginCache_Event_FetchComplete); i { case 0: return &v.state case 1: @@ -11412,7 +11537,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseProviderPluginCache_Response); i { + switch v := v.(*OpenProviderPluginCache_Request); i { case 0: return &v.state case 1: @@ -11424,7 +11549,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCachedProviders_Request); i { + switch v := v.(*OpenProviderPluginCache_Response); i { case 0: return &v.state case 1: @@ -11436,7 +11561,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCachedProviders_Response); i { + switch v := v.(*CloseProviderPluginCache_Request); i { case 0: return &v.state case 1: @@ -11448,7 +11573,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBuiltInProviders_Request); i { + switch v := v.(*CloseProviderPluginCache_Response); i { case 0: return &v.state case 1: @@ -11460,7 +11585,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBuiltInProviders_Response); i { + switch v := v.(*GetCachedProviders_Request); i { case 0: return &v.state case 1: @@ -11472,7 +11597,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetProviderSchema_Request); i { + switch v := v.(*GetCachedProviders_Response); i { case 0: return &v.state case 1: @@ -11484,7 +11609,31 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetProviderSchema_Response); i { + switch v := v.(*GetBuiltInProviders_Request); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetBuiltInProviders_Response); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetProviderSchema_Request); i { case 0: return &v.state case 1: @@ -11496,31 +11645,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenStackConfiguration_Request); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_terraform1_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenStackConfiguration_Response); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_terraform1_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseStackConfiguration_Request); i { + switch v := v.(*GetProviderSchema_Response); i { case 0: return &v.state case 1: @@ -11532,7 +11657,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseStackConfiguration_Response); i { + switch v := v.(*OpenStackConfiguration_Request); i { case 0: return &v.state case 1: @@ -11544,7 +11669,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateStackConfiguration_Request); i { + switch v := v.(*OpenStackConfiguration_Response); i { case 0: return &v.state case 1: @@ -11556,7 +11681,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateStackConfiguration_Response); i { + switch v := v.(*CloseStackConfiguration_Request); i { case 0: return &v.state case 1: @@ -11568,7 +11693,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindStackConfigurationComponents_Request); i { + switch v := v.(*CloseStackConfiguration_Response); i { case 0: return &v.state case 1: @@ -11580,7 +11705,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindStackConfigurationComponents_Response); i { + switch v := v.(*ValidateStackConfiguration_Request); i { case 0: return &v.state case 1: @@ -11592,7 +11717,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindStackConfigurationComponents_StackConfig); i { + switch v := v.(*ValidateStackConfiguration_Response); i { case 0: return &v.state case 1: @@ -11604,7 +11729,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindStackConfigurationComponents_EmbeddedStack); i { + switch v := v.(*FindStackConfigurationComponents_Request); i { case 0: return &v.state case 1: @@ -11616,7 +11741,31 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FindStackConfigurationComponents_Component); i { + switch v := v.(*FindStackConfigurationComponents_Response); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FindStackConfigurationComponents_StackConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FindStackConfigurationComponents_EmbeddedStack); i { case 0: return &v.state case 1: @@ -11628,6 +11777,18 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FindStackConfigurationComponents_Component); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlanStackChanges_Request); i { case 0: return &v.state @@ -11639,7 +11800,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlanStackChanges_Event); i { case 0: return &v.state @@ -11651,7 +11812,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ApplyStackChanges_Request); i { case 0: return &v.state @@ -11663,7 +11824,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ApplyStackChanges_Event); i { case 0: return &v.state @@ -11675,7 +11836,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenStackInspector_Request); i { case 0: return &v.state @@ -11687,7 +11848,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenStackInspector_Response); i { case 0: return &v.state @@ -11699,7 +11860,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InspectExpressionResult_Request); i { case 0: return &v.state @@ -11711,7 +11872,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InspectExpressionResult_Response); i { case 0: return &v.state @@ -11723,7 +11884,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AttributePath_Step); i { case 0: return &v.state @@ -11735,7 +11896,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlannedChange_ChangeDescription); i { case 0: return &v.state @@ -11747,7 +11908,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlannedChange_ComponentInstance); i { case 0: return &v.state @@ -11759,7 +11920,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlannedChange_ResourceInstance); i { case 0: return &v.state @@ -11771,7 +11932,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlannedChange_OutputValue); i { case 0: return &v.state @@ -11783,7 +11944,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlannedChange_ResourceInstance_Moved); i { case 0: return &v.state @@ -11795,7 +11956,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlannedChange_ResourceInstance_Imported); i { case 0: return &v.state @@ -11807,7 +11968,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppliedChange_RawChange); i { case 0: return &v.state @@ -11819,7 +11980,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppliedChange_ChangeDescription); i { case 0: return &v.state @@ -11831,7 +11992,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppliedChange_ResourceInstance); i { case 0: return &v.state @@ -11843,7 +12004,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppliedChange_ComponentInstance); i { case 0: return &v.state @@ -11855,7 +12016,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppliedChange_OutputValue); i { case 0: return &v.state @@ -11867,7 +12028,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AppliedChange_Nothing); i { case 0: return &v.state @@ -11879,7 +12040,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ComponentInstanceStatus); i { case 0: return &v.state @@ -11891,7 +12052,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ResourceInstanceStatus); i { case 0: return &v.state @@ -11903,7 +12064,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ResourceInstancePlannedChange); i { case 0: return &v.state @@ -11915,7 +12076,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ProvisionerStatus); i { case 0: return &v.state @@ -11927,7 +12088,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ProvisionerOutput); i { case 0: return &v.state @@ -11939,7 +12100,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ComponentInstanceChanges); i { case 0: return &v.state @@ -11951,7 +12112,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ComponentInstances); i { case 0: return &v.state @@ -11963,7 +12124,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ResourceInstancePlannedChange_Moved); i { case 0: return &v.state @@ -11975,7 +12136,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StackChangeProgress_ResourceInstancePlannedChange_Imported); i { case 0: return &v.state @@ -11987,7 +12148,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Schema_Block); i { case 0: return &v.state @@ -11999,7 +12160,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Schema_Attribute); i { case 0: return &v.state @@ -12011,7 +12172,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Schema_NestedBlock); i { case 0: return &v.state @@ -12023,7 +12184,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Schema_Object); i { case 0: return &v.state @@ -12035,7 +12196,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Schema_DocString); i { case 0: return &v.state @@ -12047,7 +12208,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProviderPackageVersions_Request); i { case 0: return &v.state @@ -12059,7 +12220,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProviderPackageVersions_Response); i { case 0: return &v.state @@ -12071,7 +12232,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FetchProviderPackage_Request); i { case 0: return &v.state @@ -12083,7 +12244,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FetchProviderPackage_Response); i { case 0: return &v.state @@ -12095,7 +12256,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FetchProviderPackage_PlatformResult); i { case 0: return &v.state @@ -12107,7 +12268,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ModulePackageVersions_Request); i { case 0: return &v.state @@ -12119,7 +12280,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ModulePackageVersions_Response); i { case 0: return &v.state @@ -12131,7 +12292,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ModulePackageSourceAddr_Request); i { case 0: return &v.state @@ -12143,7 +12304,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[147].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ModulePackageSourceAddr_Response); i { case 0: return &v.state @@ -12155,7 +12316,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[148].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FetchModulePackage_Request); i { case 0: return &v.state @@ -12167,7 +12328,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[149].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FetchModulePackage_Response); i { case 0: return &v.state @@ -12180,7 +12341,7 @@ func file_terraform1_proto_init() { } } } - file_terraform1_proto_msgTypes[37].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[38].OneofWrappers = []interface{}{ (*StackChangeProgress_ComponentInstanceStatus_)(nil), (*StackChangeProgress_ResourceInstanceStatus_)(nil), (*StackChangeProgress_ResourceInstancePlannedChange_)(nil), @@ -12189,7 +12350,7 @@ func file_terraform1_proto_init() { (*StackChangeProgress_ComponentInstanceChanges_)(nil), (*StackChangeProgress_ComponentInstances_)(nil), } - file_terraform1_proto_msgTypes[63].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[66].OneofWrappers = []interface{}{ (*BuildProviderPluginCache_Event_Pending_)(nil), (*BuildProviderPluginCache_Event_AlreadyInstalled)(nil), (*BuildProviderPluginCache_Event_BuiltIn)(nil), @@ -12200,33 +12361,33 @@ func file_terraform1_proto_init() { (*BuildProviderPluginCache_Event_FetchComplete_)(nil), (*BuildProviderPluginCache_Event_Diagnostic)(nil), } - file_terraform1_proto_msgTypes[64].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[67].OneofWrappers = []interface{}{ (*BuildProviderPluginCache_Request_InstallMethod_Direct)(nil), (*BuildProviderPluginCache_Request_InstallMethod_LocalMirrorDir)(nil), (*BuildProviderPluginCache_Request_InstallMethod_NetworkMirrorUrl)(nil), } - file_terraform1_proto_msgTypes[97].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[100].OneofWrappers = []interface{}{ (*PlanStackChanges_Event_PlannedChange)(nil), (*PlanStackChanges_Event_Diagnostic)(nil), (*PlanStackChanges_Event_Progress)(nil), } - file_terraform1_proto_msgTypes[101].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[104].OneofWrappers = []interface{}{ (*ApplyStackChanges_Event_AppliedChange)(nil), (*ApplyStackChanges_Event_Diagnostic)(nil), (*ApplyStackChanges_Event_Progress)(nil), } - file_terraform1_proto_msgTypes[108].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[111].OneofWrappers = []interface{}{ (*AttributePath_Step_AttributeName)(nil), (*AttributePath_Step_ElementKeyString)(nil), (*AttributePath_Step_ElementKeyInt)(nil), } - file_terraform1_proto_msgTypes[109].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[112].OneofWrappers = []interface{}{ (*PlannedChange_ChangeDescription_ComponentInstancePlanned)(nil), (*PlannedChange_ChangeDescription_ResourceInstancePlanned)(nil), (*PlannedChange_ChangeDescription_OutputValuePlanned)(nil), (*PlannedChange_ChangeDescription_PlanApplyable)(nil), } - file_terraform1_proto_msgTypes[116].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[119].OneofWrappers = []interface{}{ (*AppliedChange_ChangeDescription_Deleted)(nil), (*AppliedChange_ChangeDescription_ResourceInstance)(nil), (*AppliedChange_ChangeDescription_OutputValue)(nil), @@ -12238,7 +12399,7 @@ func file_terraform1_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_terraform1_proto_rawDesc, NumEnums: 12, - NumMessages: 147, + NumMessages: 150, NumExtensions: 0, NumServices: 4, }, @@ -12271,6 +12432,9 @@ type SetupClient interface { // // This function can be called only once per RPC server. Handshake(ctx context.Context, in *Handshake_Request, opts ...grpc.CallOption) (*Handshake_Response, error) + // At any time after handshaking, clients may call Stop to initiate a + // graceful shutdown of the server. + Stop(ctx context.Context, in *Stop_Request, opts ...grpc.CallOption) (*Stop_Response, error) } type setupClient struct { @@ -12290,6 +12454,15 @@ func (c *setupClient) Handshake(ctx context.Context, in *Handshake_Request, opts return out, nil } +func (c *setupClient) Stop(ctx context.Context, in *Stop_Request, opts ...grpc.CallOption) (*Stop_Response, error) { + out := new(Stop_Response) + err := c.cc.Invoke(ctx, "/terraform1.Setup/Stop", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // SetupServer is the server API for Setup service. type SetupServer interface { // Clients must call Handshake before any other function of any other @@ -12298,6 +12471,9 @@ type SetupServer interface { // // This function can be called only once per RPC server. Handshake(context.Context, *Handshake_Request) (*Handshake_Response, error) + // At any time after handshaking, clients may call Stop to initiate a + // graceful shutdown of the server. + Stop(context.Context, *Stop_Request) (*Stop_Response, error) } // UnimplementedSetupServer can be embedded to have forward compatible implementations. @@ -12307,6 +12483,9 @@ type UnimplementedSetupServer struct { func (*UnimplementedSetupServer) Handshake(context.Context, *Handshake_Request) (*Handshake_Response, error) { return nil, status.Errorf(codes.Unimplemented, "method Handshake not implemented") } +func (*UnimplementedSetupServer) Stop(context.Context, *Stop_Request) (*Stop_Response, error) { + return nil, status.Errorf(codes.Unimplemented, "method Stop not implemented") +} func RegisterSetupServer(s *grpc.Server, srv SetupServer) { s.RegisterService(&_Setup_serviceDesc, srv) @@ -12330,6 +12509,24 @@ func _Setup_Handshake_Handler(srv interface{}, ctx context.Context, dec func(int return interceptor(ctx, in, info, handler) } +func _Setup_Stop_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Stop_Request) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SetupServer).Stop(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/terraform1.Setup/Stop", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SetupServer).Stop(ctx, req.(*Stop_Request)) + } + return interceptor(ctx, in, info, handler) +} + var _Setup_serviceDesc = grpc.ServiceDesc{ ServiceName: "terraform1.Setup", HandlerType: (*SetupServer)(nil), @@ -12338,6 +12535,10 @@ var _Setup_serviceDesc = grpc.ServiceDesc{ MethodName: "Handshake", Handler: _Setup_Handshake_Handler, }, + { + MethodName: "Stop", + Handler: _Setup_Stop_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "terraform1.proto", diff --git a/internal/rpcapi/terraform1/terraform1.proto b/internal/rpcapi/terraform1/terraform1.proto index b7d48196cd..1798f13af3 100644 --- a/internal/rpcapi/terraform1/terraform1.proto +++ b/internal/rpcapi/terraform1/terraform1.proto @@ -13,6 +13,10 @@ service Setup { // // This function can be called only once per RPC server. rpc Handshake(Handshake.Request) returns (Handshake.Response); + + // At any time after handshaking, clients may call Stop to initiate a + // graceful shutdown of the server. + rpc Stop(Stop.Request) returns (Stop.Response); } message Handshake { @@ -25,6 +29,13 @@ message Handshake { } } +message Stop { + message Request { + } + message Response { + } +} + // The capabilities that the client wishes to advertise to the server during // handshake. message ClientCapabilities { From 39373cc0d65917b33826f6df7f0a55151dc0d7d1 Mon Sep 17 00:00:00 2001 From: Alisdair McDiarmid Date: Fri, 24 May 2024 15:16:44 -0700 Subject: [PATCH 121/161] stackeval: Stop operations on context cancellation When our context is cancelled, we instruct the modules runtime to stop. This aborts the graph traversal after any current node operations are completed. --- .../internal/stackeval/component_config.go | 13 ++++++++++ .../internal/stackeval/component_instance.go | 26 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/internal/stacks/stackruntime/internal/stackeval/component_config.go b/internal/stacks/stackruntime/internal/stackeval/component_config.go index b4ddf8f46e..fa390613ff 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_config.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_config.go @@ -503,6 +503,19 @@ func (c *ComponentConfig) checkValid(ctx context.Context, phase EvalPhase) tfdia } }() + // When our given context is cancelled, we want to instruct the + // modules runtime to stop the running operation. We use this + // nested context to ensure that we don't leak a goroutine when the + // parent context isn't cancelled. + operationCtx, operationCancel := context.WithCancel(ctx) + defer operationCancel() + go func() { + <-operationCtx.Done() + if ctx.Err() == context.Canceled { + tfCtx.Stop() + } + }() + diags = diags.Append(tfCtx.Validate(moduleTree, &terraform.ValidateOpts{ ExternalProviders: providerClients, })) diff --git a/internal/stacks/stackruntime/internal/stackeval/component_instance.go b/internal/stacks/stackruntime/internal/stackeval/component_instance.go index b513129497..5af9cef1d0 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_instance.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_instance.go @@ -581,6 +581,19 @@ func (c *ComponentInstance) CheckModuleTreePlan(ctx context.Context) (*plans.Pla deferred = true } + // When our given context is cancelled, we want to instruct the + // modules runtime to stop the running operation. We use this + // nested context to ensure that we don't leak a goroutine when the + // parent context isn't cancelled. + operationCtx, operationCancel := context.WithCancel(ctx) + defer operationCancel() + go func() { + <-operationCtx.Done() + if ctx.Err() == context.Canceled { + tfCtx.Stop() + } + }() + // NOTE: This ComponentInstance type only deals with component // instances currently declared in the configuration. See // [ComponentInstanceRemoved] for the model of a component instance @@ -804,6 +817,19 @@ func (c *ComponentInstance) ApplyModuleTreePlan(ctx context.Context, plan *plans var newState *states.State if modifiedPlan.Applyable { + // When our given context is cancelled, we want to instruct the + // modules runtime to stop the running operation. We use this + // nested context to ensure that we don't leak a goroutine when the + // parent context isn't cancelled. + operationCtx, operationCancel := context.WithCancel(ctx) + defer operationCancel() + go func() { + <-operationCtx.Done() + if ctx.Err() == context.Canceled { + tfCtx.Stop() + } + }() + // NOTE: tfCtx.Apply tends to make changes to the given plan while it // works, and so code after this point should not make any further use // of either "modifiedPlan" or "plan" (since they share lots of the same From 5003af83359e930d209b2b39d5430e7cfe5379f5 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Fri, 24 May 2024 15:16:48 -0700 Subject: [PATCH 122/161] stackeval: If context is cancelled, ask provider instances to stop Co-authored-by: Alisdair McDiarmid --- .../internal/stackeval/provider_instance.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/internal/stacks/stackruntime/internal/stackeval/provider_instance.go b/internal/stacks/stackruntime/internal/stackeval/provider_instance.go index acd2508644..47fb7c1f1c 100644 --- a/internal/stacks/stackruntime/internal/stackeval/provider_instance.go +++ b/internal/stacks/stackruntime/internal/stackeval/provider_instance.go @@ -206,10 +206,28 @@ func (p *ProviderInstance) CheckClient(ctx context.Context, phase EvalPhase) (pr return stubConfiguredProvider{unknown: false}, diags } + // If the context we recieved gets cancelled then we want providers + // to try to cancel any operations they have in progress, so we'll + // watch for that in a separate goroutine. This extra context + // is here just so we can avoid leaking this goroutine if the + // parent doesn't get cancelled. + providerCtx, localCancel := context.WithCancel(ctx) + go func() { + <-providerCtx.Done() + if ctx.Err() == context.Canceled { + // Not all providers respond to this, but some will quickly + // abort operations currently in progress and return a + // cancellation error, thus allowing us to halt more quickly + // when interrupted. + client.Stop() + } + }() + // If this provider is implemented as a separate plugin then we // must terminate its child process once evaluation is complete. p.main.RegisterCleanup(func(ctx context.Context) tfdiags.Diagnostics { var diags tfdiags.Diagnostics + localCancel() // make sure our cancel-monitoring goroutine terminates err := client.Close() if err != nil { diags = diags.Append(&hcl.Diagnostic{ From b5d6b13b3b357837ef04b1dcdbd3978bec5c582a Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Tue, 28 May 2024 08:42:24 +0200 Subject: [PATCH 123/161] stacks: convert sourcebundle source into directory for config SourceDir field (#35245) --- internal/configs/source_bundle_parser.go | 11 +++- .../internal/stackeval/component_instance.go | 6 ++ .../internal/stackeval/planning_test.go | 63 +++++++++++++++++++ .../planning/path_values/module/child/main.tf | 12 ++++ .../planning/path_values/module/main.tf | 25 ++++++++ .../path_values/path_values.tfstack.hcl | 4 ++ 6 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/path_values/module/child/main.tf create mode 100644 internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/path_values/module/main.tf create mode 100644 internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/path_values/path_values.tfstack.hcl diff --git a/internal/configs/source_bundle_parser.go b/internal/configs/source_bundle_parser.go index 9c6686fdc0..6ad8eff944 100644 --- a/internal/configs/source_bundle_parser.go +++ b/internal/configs/source_bundle_parser.go @@ -58,7 +58,16 @@ func (p *SourceBundleParser) LoadConfigDir(source sourceaddrs.FinalSource) (*Mod mod, modDiags := NewModule(primary, override) diags = append(diags, modDiags...) - mod.SourceDir = source.String() + sourceDir, err := p.sources.LocalPathForSource(source) + if err != nil { + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Cannot find configuration source code", + Detail: fmt.Sprintf("Failed to load %s from the pre-installed source packages: %s. This is a bug in Terraform - please report it.", source, err), + }) + return nil, diags + } + mod.SourceDir = sourceDir return mod, diags } diff --git a/internal/stacks/stackruntime/internal/stackeval/component_instance.go b/internal/stacks/stackruntime/internal/stackeval/component_instance.go index b513129497..ab422b5c0a 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_instance.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_instance.go @@ -995,6 +995,12 @@ func (c *ComponentInstance) ResultValue(ctx context.Context, phase EvalPhase) ct if plan.UIMode != plans.DestroyMode { outputChanges := plan.Changes.Outputs for _, changeSrc := range outputChanges { + if len(changeSrc.Addr.Module) > 0 { + // Only include output values of the root module as part + // of the component. + continue + } + name := changeSrc.Addr.OutputValue.Name change, err := changeSrc.Decode() if err != nil { diff --git a/internal/stacks/stackruntime/internal/stackeval/planning_test.go b/internal/stacks/stackruntime/internal/stackeval/planning_test.go index 7ef5200a21..559f1e9aba 100644 --- a/internal/stacks/stackruntime/internal/stackeval/planning_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/planning_test.go @@ -6,6 +6,8 @@ package stackeval import ( "context" "fmt" + "os" + "path/filepath" "strings" "testing" @@ -882,6 +884,67 @@ func TestPlanning_RemoveDataResource(t *testing.T) { } } +func TestPlanning_PathValues(t *testing.T) { + cfg := testStackConfig(t, "planning", "path_values") + main := NewForPlanning(cfg, stackstate.NewState(), PlanOpts{ + PlanningMode: plans.NormalMode, + }) + + inPromisingTask(t, func(ctx context.Context, t *testing.T) { + plan, diags := testPlan(t, main) + if len(diags) > 0 { + t.Fatalf("unexpected diagnostics: %s", diags) + } + + component, ok := plan.Components.GetOk(stackaddrs.AbsComponentInstance{ + Stack: stackaddrs.RootStackInstance, + Item: stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{ + Name: "path_values", + }, + Key: addrs.NoKey, + }, + }) + if !ok { + t.Fatalf("component not found in plan") + } + + cwd, err := os.Getwd() + if err != nil { + t.Fatalf("failed to get current working directory: %s", err) + } + + normalizePath := func(path string) string { + rel, err := filepath.Rel(cwd, path) + if err != nil { + t.Errorf("rel(%s,%s): %s", cwd, path, err) + return path + } + return rel + } + + expected := map[string]string{ + "cwd": ".", + "root": "testdata/sourcebundle/planning/path_values/module", // this is the root module of the component + "module": "testdata/sourcebundle/planning/path_values/module", // this is the root module + "child_root": "testdata/sourcebundle/planning/path_values/module", // should be the same for all modules + "child_module": "testdata/sourcebundle/planning/path_values/module/child", // this is the child module + } + + actual := map[string]string{ + "cwd": normalizePath(component.PlannedOutputValues[addrs.OutputValue{Name: "cwd"}].AsString()), + "root": normalizePath(component.PlannedOutputValues[addrs.OutputValue{Name: "root"}].AsString()), + "module": normalizePath(component.PlannedOutputValues[addrs.OutputValue{Name: "module"}].AsString()), + "child_root": normalizePath(component.PlannedOutputValues[addrs.OutputValue{Name: "child_root"}].AsString()), + "child_module": normalizePath(component.PlannedOutputValues[addrs.OutputValue{Name: "child_module"}].AsString()), + } + + if cmp.Diff(expected, actual) != "" { + t.Fatalf("unexpected path values\n%s", cmp.Diff(expected, actual)) + } + }) +} + func TestPlanning_NoWorkspaceNameRef(t *testing.T) { // This test verifies that a reference to terraform.workspace is treated // as invalid for modules used in a stacks context, because there's diff --git a/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/path_values/module/child/main.tf b/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/path_values/module/child/main.tf new file mode 100644 index 0000000000..37dd809389 --- /dev/null +++ b/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/path_values/module/child/main.tf @@ -0,0 +1,12 @@ + +output "cwd" { + value = path.cwd +} + +output "root" { + value = path.root +} + +output "module" { + value = path.module +} diff --git a/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/path_values/module/main.tf b/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/path_values/module/main.tf new file mode 100644 index 0000000000..58cbed5e97 --- /dev/null +++ b/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/path_values/module/main.tf @@ -0,0 +1,25 @@ + + +module "child" { + source = "./child" +} + +output "child_module" { + value = module.child.module +} + +output "child_root" { + value = module.child.root +} + +output "module" { + value = path.module +} + +output "root" { + value = path.root +} + +output "cwd" { + value = path.cwd +} diff --git a/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/path_values/path_values.tfstack.hcl b/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/path_values/path_values.tfstack.hcl new file mode 100644 index 0000000000..c3255396eb --- /dev/null +++ b/internal/stacks/stackruntime/internal/stackeval/testdata/sourcebundle/planning/path_values/path_values.tfstack.hcl @@ -0,0 +1,4 @@ + +component "path_values" { + source = "./module" +} From 1e2d4a2ecc695a5dbcc53a315458622878ab19da Mon Sep 17 00:00:00 2001 From: kmoe <5575356+kmoe@users.noreply.github.com> Date: Tue, 28 May 2024 16:50:25 +0100 Subject: [PATCH 124/161] lang: stabilise templatestring func experiment (#35224) * lang: stabilise templatestring func experiment * command/jsonfunction: marshal templatestring * docs: add templatestring --- internal/command/jsonfunction/function.go | 27 ++++++++ internal/experiments/experiment.go | 2 +- internal/lang/funcs/descriptions.go | 4 +- internal/lang/functions.go | 4 +- internal/lang/functions_test.go | 23 ++++++- website/data/language-nav-data.json | 9 +++ .../docs/language/functions/templatefile.mdx | 1 + .../language/functions/templatestring.mdx | 67 +++++++++++++++++++ 8 files changed, 130 insertions(+), 7 deletions(-) create mode 100644 website/docs/language/functions/templatestring.mdx diff --git a/internal/command/jsonfunction/function.go b/internal/command/jsonfunction/function.go index 9cedf4e1db..83cc59c8e7 100644 --- a/internal/command/jsonfunction/function.go +++ b/internal/command/jsonfunction/function.go @@ -86,6 +86,8 @@ func Marshal(f map[string]function.Function) ([]byte, tfdiags.Diagnostics) { signatures.Signatures[name] = marshalCan(v) } else if name == "try" || name == "core::try" { signatures.Signatures[name] = marshalTry(v) + } else if name == "templatestring" || name == "core::templatestring" { + signatures.Signatures[name] = marshalTemplatestring(v) } else { signature, err := marshalFunction(v) if err != nil { @@ -194,3 +196,28 @@ func marshalCan(can function.Function) *FunctionSignature { }, } } + +// marshalTemplatestring returns a static function signature for the +// templatestring function. +// We need this exception because the function implementation uses capsule +// types that we can't marshal. +func marshalTemplatestring(templatestring function.Function) *FunctionSignature { + return &FunctionSignature{ + Description: templatestring.Description(), + ReturnType: cty.String, + Parameters: []*parameter{ + { + Name: templatestring.Params()[0].Name, + Description: templatestring.Params()[0].Description, + IsNullable: templatestring.Params()[0].AllowNull, + Type: cty.String, + }, + { + Name: templatestring.Params()[1].Name, + Description: templatestring.Params()[1].Description, + IsNullable: templatestring.Params()[1].AllowNull, + Type: cty.DynamicPseudoType, + }, + }, + } +} diff --git a/internal/experiments/experiment.go b/internal/experiments/experiment.go index 8a7b770962..637a91b3de 100644 --- a/internal/experiments/experiment.go +++ b/internal/experiments/experiment.go @@ -33,7 +33,7 @@ func init() { registerConcludedExperiment(VariableValidation, "Custom variable validation can now be used by default, without enabling an experiment.") registerConcludedExperiment(VariableValidationCrossRef, "Input variable validation rules may now refer to other objects in the same module without enabling any experiment.") registerConcludedExperiment(SuppressProviderSensitiveAttrs, "Provider-defined sensitive attributes are now redacted by default, without enabling an experiment.") - registerCurrentExperiment(TemplateStringFunc) + registerConcludedExperiment(TemplateStringFunc, "The templatestring function can now be used without enabling an experiment.") registerConcludedExperiment(ConfigDrivenMove, "Declarations of moved resource instances using \"moved\" blocks can now be used by default, without enabling an experiment.") registerConcludedExperiment(PreconditionsPostconditions, "Condition blocks can now be used by default, without enabling an experiment.") registerConcludedExperiment(ModuleVariableOptionalAttrs, "The final feature corresponding to this experiment differs from the experimental form and is available in the Terraform language from Terraform v1.3.0 onwards.") diff --git a/internal/lang/funcs/descriptions.go b/internal/lang/funcs/descriptions.go index 1967793ea7..e21dad10ad 100644 --- a/internal/lang/funcs/descriptions.go +++ b/internal/lang/funcs/descriptions.go @@ -423,8 +423,8 @@ var DescriptionList = map[string]descriptionEntry{ "templatestring": { Description: "`templatestring` takes a string from elsewhere in the module and renders its content as a template using a supplied set of template variables.", ParamDescription: []string{ - "a simple reference to a string value containing the template source code", - "object of variables to expose in the template scope", + "A simple reference to a string value containing the template source code.", + "Object of variables to expose in the template scope.", }, }, "textdecodebase64": { diff --git a/internal/lang/functions.go b/internal/lang/functions.go index f811f0b503..0ae17d0836 100644 --- a/internal/lang/functions.go +++ b/internal/lang/functions.go @@ -190,9 +190,7 @@ func (s *Scope) Functions() map[string]function.Function { return s.funcs, filesystemFunctions, templateFunctions } coreFuncs["templatefile"] = funcs.MakeTemplateFileFunc(s.BaseDir, funcsFunc) - if s.activeExperiments.Has(experiments.TemplateStringFunc) { - coreFuncs["templatestring"] = funcs.MakeTemplateStringFunc(funcsFunc) - } + coreFuncs["templatestring"] = funcs.MakeTemplateStringFunc(funcsFunc) if s.ConsoleMode { // The type function is only available in terraform console. diff --git a/internal/lang/functions_test.go b/internal/lang/functions_test.go index bdf1b16de7..d6ebdaafec 100644 --- a/internal/lang/functions_test.go +++ b/internal/lang/functions_test.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/hclsyntax" + "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/experiments" "github.com/hashicorp/terraform/internal/lang/marks" homedir "github.com/mitchellh/go-homedir" @@ -976,6 +977,21 @@ func TestFunctions(t *testing.T) { }, }, + "templatestring": { + { + `templatestring(local.greeting_template, { + name = "Arthur" +})`, + cty.StringVal("Hello, Arthur!"), + }, + { + `core::templatestring(local.greeting_template, { + name = "Namespaced Arthur" +})`, + cty.StringVal("Hello, Namespaced Arthur!"), + }, + }, + "timeadd": { { `timeadd("2017-11-22T00:00:00Z", "1s")`, @@ -1311,9 +1327,14 @@ func TestFunctions(t *testing.T) { for _, test := range funcTests { t.Run(test.src, func(t *testing.T) { - data := &dataForTests{} // no variables available; we only need literals here + data := &dataForTests{ + LocalValues: map[string]cty.Value{ + "greeting_template": cty.StringVal("Hello, ${name}!"), + }, + } scope := &Scope{ Data: data, + ParseRef: addrs.ParseRef, BaseDir: "./testdata/functions-test", // for the functions that read from the filesystem PlanTimestamp: time.Date(2004, 04, 25, 15, 00, 00, 000, time.UTC), ExternalFuncs: externalFuncs, diff --git a/website/data/language-nav-data.json b/website/data/language-nav-data.json index bee6f0b01a..0d812ea150 100644 --- a/website/data/language-nav-data.json +++ b/website/data/language-nav-data.json @@ -365,6 +365,10 @@ "title": "substr", "href": "/language/functions/substr" }, + { + "title": "templatestring", + "href": "/language/functions/templatestring" + }, { "title": "title", "href": "/language/functions/title" @@ -893,6 +897,11 @@ "path": "functions/templatefile", "hidden": true }, + { + "title": "templatestring", + "path": "functions/templatestring", + "hidden": true + }, { "title": "terraform-encode_tfvars", "path": "functions/terraform-encode_tfvars", "hidden": true }, { "title": "terraform-decode_tfvars", "path": "functions/terraform-decode_tfvars", "hidden": true }, { "title": "terraform-encode_expr", "path": "functions/terraform-encode_expr", "hidden": true }, diff --git a/website/docs/language/functions/templatefile.mdx b/website/docs/language/functions/templatefile.mdx index 36e0b37e74..3ab12d9596 100644 --- a/website/docs/language/functions/templatefile.mdx +++ b/website/docs/language/functions/templatefile.mdx @@ -148,3 +148,4 @@ For more information, see the main documentation for * [`file`](/terraform/language/functions/file) reads a file from disk and returns its literal contents without any template interpretation. +* [`templatestring`](/terraform/language/functions/templatestring) takes a simple reference to a string value containing the template and renders its content. diff --git a/website/docs/language/functions/templatestring.mdx b/website/docs/language/functions/templatestring.mdx new file mode 100644 index 0000000000..8f97bb4e1b --- /dev/null +++ b/website/docs/language/functions/templatestring.mdx @@ -0,0 +1,67 @@ +--- +page_title: templatestring - Functions - Configuration Language +description: |- + The templatestring function takes a string from elsewhere in the module and renders its content as a template using a supplied set of template variables. +--- + +# `templatestring` Function + +-> **Note:** The `templatestring` function is intended for advanced use cases. Most use cases require only a [string template expression](/terraform/language/expressions/strings#string-templates). To render a template from a file, use the [`templatefile` function](/terraform/language/functions/templatefile). + +`templatestring` renders a template using a supplied set of template variables. + +```hcl +templatefile(ref, vars) +``` + +The first parameter must be a simple reference to string value containing the template: for example, `data.aws_s3_object.example.body` or `local.inline_template`. + +It is **not** valid to supply the template expression directly as the first argument: + +```hcl +# The following is not allowed +templatestring("Hello, $${name}", { + name = var.name +}) +``` + +Instead of the above, you should instead use a string template expression: + +```hcl +"Hello, ${var.name}" +``` + +The `templatestring` function is needed only when the template is available as a named object in the current module. + +The template syntax is the same as for +[string templates](/terraform/language/expressions/strings#string-templates) +in the main Terraform language, including interpolation sequences delimited with +`${` ... `}`. + +Strings in the Terraform language are sequences of Unicode characters, so +this function will interpret the file contents as UTF-8 encoded text and +return the resulting Unicode characters. If the template contains invalid UTF-8 +sequences then this function will produce an error. + +## Example + +The following example retrieves a template from S3 and dynamically renders it: + +```hcl +data "aws_s3_object" "example" { + bucket = "example-example" + key = "example.tmpl" +} + +output "example" { + value = templatestring(data.aws_s3_object.example.body, { + name = var.name + }) +} +``` + +For more examples of how to use templates, please see the documentation for the [`templatefile`](/terraform/language/functions/templatefile#Examples) function. + +## Related Functions + +* [`templatefile`](/terraform/language/functions/templatefile) reads a file from disk and renders its content as a template. From 0631c95acad7edeca4d747907ce271ca481628bd Mon Sep 17 00:00:00 2001 From: kmoe <5575356+kmoe@users.noreply.github.com> Date: Tue, 28 May 2024 16:51:53 +0100 Subject: [PATCH 125/161] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1958d286f6..bdb1dc1db5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ NEW FEATURES: * **Input variable validation rules can refer to other objects**: Previously input variable validation rules could refer only to the variable being validated. Now they are general expressions, similar to those elsewhere in a module, which can refer to other input variables and to other objects such as data resources. +* `templatestring` function: a new built-in function which is similar to `templatefile` but designed to render templates obtained dynamically, such as from a data resource result. ENHANCEMENTS: From c1e9ddc9111faceebe98794d28edf4810e1b7b51 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Tue, 28 May 2024 09:49:20 -0700 Subject: [PATCH 126/161] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bdb1dc1db5..4b0f3b9565 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ NEW FEATURES: * **Input variable validation rules can refer to other objects**: Previously input variable validation rules could refer only to the variable being validated. Now they are general expressions, similar to those elsewhere in a module, which can refer to other input variables and to other objects such as data resources. -* `templatestring` function: a new built-in function which is similar to `templatefile` but designed to render templates obtained dynamically, such as from a data resource result. +* **`templatestring` function**: a new built-in function which is similar to `templatefile` but designed to render templates obtained dynamically, such as from a data resource result. ENHANCEMENTS: From a384f4407d8f07aeb94e30bb335c6241d38bb6c1 Mon Sep 17 00:00:00 2001 From: Brian McClain Date: Wed, 29 May 2024 09:58:54 -0400 Subject: [PATCH 127/161] [Docs] Migrate "Phases of Terraform Adoption" from tutorials to docs (#35251) Co-authored-by: Rose M Koron <32436232+rkoron007@users.noreply.github.com> --- website/data/intro-nav-data.json | 10 +++++ website/docs/intro/phases/adopt.mdx | 55 +++++++++++++++++++++++ website/docs/intro/phases/collaborate.mdx | 50 +++++++++++++++++++++ website/docs/intro/phases/govern.mdx | 22 +++++++++ website/docs/intro/phases/index.mdx | 40 +++++++++++++++++ website/docs/intro/phases/scale.mdx | 40 +++++++++++++++++ website/docs/language/style.mdx | 2 +- 7 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 website/docs/intro/phases/adopt.mdx create mode 100644 website/docs/intro/phases/collaborate.mdx create mode 100644 website/docs/intro/phases/govern.mdx create mode 100644 website/docs/intro/phases/index.mdx create mode 100644 website/docs/intro/phases/scale.mdx diff --git a/website/data/intro-nav-data.json b/website/data/intro-nav-data.json index 120e29a1aa..4d0da480af 100644 --- a/website/data/intro-nav-data.json +++ b/website/data/intro-nav-data.json @@ -8,6 +8,16 @@ }, { "title": "Terraform Editions", "path": "terraform-editions" }, { "title": "The Core Terraform Workflow", "path": "core-workflow" }, + { + "title": "Phases of Terraform Adoption", + "routes": [ + {"title": "Overview", "path": "phases"}, + {"title": "Adopt", "path": "phases/adopt"}, + {"title": "Collaborate", "path": "phases/collaborate"}, + {"title": "Scale", "path": "phases/scale"}, + {"title": "Govern", "path": "phases/govern"} + ] + }, { "title": "Terraform vs. Alternatives", "routes": [ diff --git a/website/docs/intro/phases/adopt.mdx b/website/docs/intro/phases/adopt.mdx new file mode 100644 index 0000000000..f2ff29b4df --- /dev/null +++ b/website/docs/intro/phases/adopt.mdx @@ -0,0 +1,55 @@ +--- +page_title: Adopt Terraform +description: Establish strong foundational practices that support future scale and make Terraform operations predictable and secure. +--- + +# Adopt Terraform + +An individual practitioner can establish strong foundational practices that support future scale and make Terraform operations predictable and secure. + +## Use version control + +Store your Terraform configuration in a version control system, such as Git, just as you would with your application code. Terraform configuration files are code, and will benefit from the same features as your application in a version control repository such as versioning and easier code reviews. + + + +Do not store [`terraform.tfstate` state files](/terraform/language/state), provider credentials, or sensitive values in version control. Use a [gitignore file](https://github.com/github/gitignore/blob/main/Terraform.gitignore) to avoid accidentally committing sensitive files. + + + +You can [connect your VCS provider to HCP Terraform](/terraform/cloud-docs/vcs) to automatically initiate Terraform runs and view [speculative plans that let you preview your infrastructure changes](/terraform/cloud-docs/run/ui#speculative-plans-on-pull-requests) in your pull requests. + +## Reuse code with modules + +Terraform modules group resources that you usually deploy together, letting you define reusable units of infrastructure code. For example, when you create a VPC in AWS, you may also need to create subnets, the route table, the internet gateway, security groups, and more. Instead of defining the individual resources and configuring the relationships between them every time you need a new VPC, you can use the [VPC module](https://registry.terraform.io/modules/terraform-aws-modules/vpc/aws/latest), which you can customize using input variables to quickly create the required infrastructure. The [public Terraform module registry](https://registry.terraform.io/browse/modules) offers many modules that encode best practices for common use cases. + +You can also create your own modules to deploy the specific infrastructure required by your services. Even a small three-tier application may require many Terraform-managed resources. A module lets you contain that complexity, turning each deployment of the application stack into a short, readable, and reusable configuration. The following Terraform configuration references a local module stored at `./modules/appstack` that takes in two arguments named `web_instance_count` and `api_instance_count`: + +```hcl +module "appstack" { + source = "./modules/appstack" + + web_instance_count = 2 + api_instance_count = 1 +} + +output "web_instance_ips" { + value = module.appstack.web_ips +} +``` + +[Follow our tutorials to learn how to use and develop modules](/terraform/tutorials/modules/module) and explore the [public Terraform module registry](https://registry.terraform.io/browse/modules). + +## Use secrets storage + +Your configuration may rely on sensitive values, such as provider credentials. Although you can mark certain variables as sensitive to prevent displaying them as plaintext in run output, a more robust solution is to use secrets storage such as [HashiCorp Vault](/vault) + +Vault securely stores sensitive information such as credentials and provides granular access control. You can integrate Vault into your Terraform configuration using the [Vault provider](https://registry.terraform.io/providers/hashicorp/vault/latest/docs/data-sources/generic_secret). If you deploy your infrastructure to a major cloud provider, such as AWS, you can also [generate short-lived credentials with Vault](/terraform/tutorials/secrets/secrets-vault) or use [dynamic provider credentials](/terraform/cloud-docs/workspaces/dynamic-provider-credentials), which prevents having to store credentials. + +Vault also integrates into many popular CI/CD solutions such as [GitHub, Jenkins, and CircleCI](/well-architected-framework/security/security-cicd-vault). Vault provides a central system to store and access data, which lets CI/CD pipelines push and pull secrets programmatically. + +## Next steps + +Multiple developers working on the same codebase introduces a new set of challenges, but solutions such as remote state backends help ease collaboration and coordinate execution. + +[Learn how to collaborate with Terraform](/terraform/intro/phases/collaborate). \ No newline at end of file diff --git a/website/docs/intro/phases/collaborate.mdx b/website/docs/intro/phases/collaborate.mdx new file mode 100644 index 0000000000..79d4780a4f --- /dev/null +++ b/website/docs/intro/phases/collaborate.mdx @@ -0,0 +1,50 @@ +--- +page_title: Collaborate with Terraform +description: Ease collaboration and coordinate execution across your team. +--- + +# Collaborate with Terraform + +Multiple developers working on the same codebase introduces a new set of challenges, but solutions such as remote state backends help ease collaboration and coordinate execution. + +## Use remote state storage + +As more team members work on Terraform configuration, you should implement remote state storage to support collaboration. HCP Terraform and remote backends implement several features to help you safely manage your Terraform state: + +- **Storage:** Remote state storage lets you manage infrastructure collaboratively and securely. Different state stores may also support additional features for state management, such as encryption, versioning, automated backups, redundancy, and more. +- **Locking:** Some remote state storage options support [state locking](/terraform/language/state/locking). State locking prevents concurrent Terraform operations on single state files. +- **Execution:** HCP Terraform and Terraform Enterprise support executing Terraform operations in stable, remote environments. + +Since state files may contain sensitive data, refer to your backend documentation and, if supported, use [state encryption](/well-architected-framework/security/security-sensitive-data). [HCP Terraform and Terraform Enterprise](/terraform/cloud-docs/architectural-details/data-security#data-security) both automatically encrypt state, and [AWS, GCP, and Azure](/well-architected-framework/security/security-sensitive-data#storing-terraform-state) backends can implement encryption as well. + +As your team grows, you may run into the risk of concurrent operations on state files. If supported by your remote storage solution, use [state locking](/terraform/language/state/locking) to prevent unpredictable outcomes or corrupted data. [HCP Terraform and Terraform Enterprise](/terraform/cli/cloud/settings) support state locking by default, but other state storage implementations require additional configuration. For example, the [AWS S3 remote backend](/terraform/language/settings/backends/s3) requires that a [DynamoDB table](/terraform/language/settings/backends/s3#dynamodb-table-permissions) for state locking. + +| | Storage | Locking | Execution | +|------------------------------|---------|--------------|-----------| +| HCP Terraform / Enterprise | Yes | Yes | Yes | +| Amazon S3 | Yes | via DynamoDB | No | +| Azure Storage | Yes | Yes | No | +| Google Cloud Storage | Yes | Yes | No | + +[Get started with HCP Terraform](/terraform/tutorials/cloud-get-started) and learn how to [securely store your Terraform state](/well-architected-framework/security/security-sensitive-data#storing-terraform-state). + +## Implement code reviews + +Implement good code practices for your Terraform configuration, including using pull requests for code changes and performing proper code reviews. +Code reviews can prevent introducing errors into your infrastructure configuration. They also help team members share their knowledge of the code base and enforce coding standards. + +Use the integrations offered by your version control system to help with your code reviews. For example, HCP Terraform's VCS integration [generates speculative plans](/terraform/cloud-docs/run/ui#speculative-plans-on-pull-requests) for each pull request, showing the exact changes that Terraform will make to your infrastructure. + +## Automate deployments with CI/CD + +A CI/CD pipeline offers a consistent process for shipping new features and fixes. By storing your Terraform configuration in version control, you define a single source of truth for your infrastructure configuration and can automate your deployments. You can configure a CI pipeline to automatically start a Terraform plan and apply operation for any changes to your code. + +Terraform [integrates](/terraform/tutorials/automation/automate-terraform) with many automation solutions. If you do not have an existing CI/CD workflow, HashiCorp's [Setup Terraform GitHub action](/terraform/tutorials/automation/github-actions) sets up and configures the Terraform CLI in your Github Actions workflow. + +## Next steps + +As Terraform usage expands across your organization, you will need to decide how to define boundaries of infrastructure ownership. + +You will also need to decide on a cloud deployment strategy based on your organization's practices and needs. Possible approaches include using a single account in a single cloud provider, a hybrid or multi-cloud approach, or to divide up resources across accounts by environment. Regardless of your implementation, Terraform lets you manage your infrastructure with a consistent workflow. + +[Learn how to scale Terraform](/terraform/intro/phases/scale). \ No newline at end of file diff --git a/website/docs/intro/phases/govern.mdx b/website/docs/intro/phases/govern.mdx new file mode 100644 index 0000000000..d5ed5748a5 --- /dev/null +++ b/website/docs/intro/phases/govern.mdx @@ -0,0 +1,22 @@ +--- +page_title: Govern Terraform +description: Use codified, automated policy enforcement to govern your organization's standards and best practices. +--- + +# Govern Terraform + +As your teams grow, a common operational challenge is deciding how to enforce your organization's standards and practices. Using codified, automated policy enforcement with Sentinel or OPA ensures consistent application of your standards. + +## Govern infrastructure through policy + +You can use policy as code to ensure your infrastructure meets your organization's security, governance, and cost requirements. You can configure your workflows to automatically run policy checks as part of your Terraform operations and set conditions for how to handle policy failures. Soft enforcement lets prompts a user to approve an operation that fails a policy check, and hard enforcement blocks the operation entirely. + +You can define policies that set standards for both your infrastructure configuration itself, and for the workflows around configuration deployment. Some examples of policy rules you can define include which ports are open in a firewall, the permitted sizes of virtual machines, or that deployments cannot take place on Fridays. In HCP Terraform and Terraform Enterprise you can use either [OPA](/terraform/cloud-docs/policy-enforcement/opa) or [Sentinel](https://www.hashicorp.com/sentinel) for your policy definitions. + +Learn how to [write a Sentinel policy for a Terraform Deployment](/terraform/tutorials/policy/sentinel-policy) and how to [detect infrastructure drift and enforce OPA policies](/terraform/tutorials/cloud/drift-and-opa). + +## Next steps + +This guide introduces considerations to keep in mind as your organization adopts Terraform, but there are many more topics to explore. [HCP Terraform](/terraform/tutorials/cloud-get-started) provides a place to get started with many of these topics, and you can [get started for free](https://app.terraform.io/public/signup/account). + +The [HashiCorp Well-Architected Framework](/well-architected-framework) provides more in-depth information on how to adopt and scale your use of Terraform. \ No newline at end of file diff --git a/website/docs/intro/phases/index.mdx b/website/docs/intro/phases/index.mdx new file mode 100644 index 0000000000..b4f9fad2b3 --- /dev/null +++ b/website/docs/intro/phases/index.mdx @@ -0,0 +1,40 @@ +--- +page_title: Phases of Terraform Adoption +description: Evolve your Terraform strategy as adoption grows within your organization +--- + +# Phases of Terraform Adoption + +As more of your organization adopts Terraform, your infrastructure provisioning workflows will need to change and adapt. The workflows that are suitable for individual practitioners may not scale to larger enterprises. This guide will help you plan your organization's Terraform adoption strategy and presents workflow considerations that you should keep in mind to support future scale. This guide focuses on challenges faced by larger organizations, but we recommend implementing each practice as early as you can to help you scale smoothly. + +## Adopt + +An individual practitioner can establish strong foundational practices that support future scale and make Terraform operations predictable and secure. + +[Learn how to adopt Terraform](/terraform/intro/phases/adopt) + +## Collaborate + +Multiple developers working on the same codebase introduces a new set of challenges, but solutions such as remote state backends help ease collaboration and coordinate execution. + +[Learn how to collaborate with Terraform](/terraform/intro/phases/collaborate). + +## Scale + +As Terraform usage expands across your organization, you will need to decide how to define boundaries of infrastructure ownership. + +You will also need to decide on a cloud deployment strategy based on your organization's practices and needs. Possible approaches include using a single account in a single cloud provider, a hybrid or multi-cloud approach, or to divide up resources across accounts by environment. Regardless of your implementation, Terraform lets you manage your infrastructure with a consistent workflow. + +[Learn how to scale Terraform](/terraform/intro/phases/scale). + +## Govern + +As your teams grow, a common operational challenge is deciding how to enforce your organization's standards and practices. Using codified, automated policy enforcement with Sentinel or OPA ensures consistent application of your standards. + +[Learn how to govern your organization's best practices](/terraform/intro/phases/govern). + +## Next steps + +This guide introduces considerations to keep in mind as your organization adopts Terraform, but there are many more topics to explore. To learn more Terraform best practices, refer to [Terraform style guide](/terraform/language/style). The [HashiCorp Well-Architected Framework](/well-architected-framework) provides more in-depth information on how to adopt and scale your use of Terraform. + +[HCP Terraform](/terraform/tutorials/cloud-get-started) provides a place to get started with many of these topics, and you can [get started for free](https://app.terraform.io/public/signup/account). \ No newline at end of file diff --git a/website/docs/intro/phases/scale.mdx b/website/docs/intro/phases/scale.mdx new file mode 100644 index 0000000000..857c15807c --- /dev/null +++ b/website/docs/intro/phases/scale.mdx @@ -0,0 +1,40 @@ +--- +page_title: Scale Terraform +description: Define boundaries of infrastructure ownership across your team with Terraform. +--- + +# Scale Terraform + +As Terraform usage expands across your organization, you will need to decide how to define boundaries of infrastructure ownership. + +You will also need to decide on a cloud deployment strategy based on your organization's practices and needs. Possible approaches include using a single account in a single cloud provider, a hybrid or multi-cloud approach, or to divide up resources across accounts by environment. Regardless of your implementation, Terraform lets you manage your infrastructure with a consistent workflow. + +## Adopt modules across your organization + +We recommend using modules early in your Terraform adoption process to support consistent infrastructure configuration. As your Terraform usage scales, a central module registry helps teams find and use your modules rather than rewriting the same code. + +Terraform supports [multiple module distribution options](/terraform/language/modules/sources), but we recommend that you use a native Terraform module registry such as HCP Terraform or Terraform Enterprise. These both use the [module registry protocol](/terraform/internals/module-registry-protocol), which is the Terraform-specific protocol to discover metadata about modules available for installation and to locate the distribution package for a selected module. + +If you cannot use a native module registry, there are other source options such as [Git repositories](/terraform/language/modules/sources#generic-git-repository) or [AWS S3](/terraform/language/modules/sources#s3-bucket). + +Modules also help teams establish infrastructure configuration standards. For example, you can write a module to create a database used by your application that includes all of the defaults that your architecture requires. The module can define the database size, type, and handle all of the required networking. This ensures that module consumers provision infrastructure in line with your organization standards and requirements. + +Since modules define their own inputs, you can decide which parameters are configurable by the user. For example, you might want to allow them to change the size of the cluster, but not let them change the engine type. + +Read the [recommended patterns for creating modules](/terraform/tutorials/modules/pattern-module-creation). + +## Divide infrastructure responsibility + +It is common for different teams to focus on different parts of your organization's infrastructure. For example, the networking team may manage the VPCs, while the application team only needs to know where to deploy their application and focuses on configuring servers and databases. In this scenario, there is a division of responsibilities but the application team still needs to access data about the networking resources for their own configuration. + +Terraform lets you [reference data about other resources](/terraform/language/state/remote#delegation-and-teamwork) in your configuration without having to manage them in the same state file, allowing you to maintain distinct areas of ownership and infrastructure decoupling. You can use data sources to query a provider for more data about a particular resource, or reference output values from another state file using the remote state data source. HCP Terraform lets you explicitly grant access to your workspace state file to only the workspaces that need it, reducing access to potentially sensitive data. You can also use the [tfe_outputs](https://registry.terraform.io/providers/hashicorp/tfe/latest/docs/data-sources/outputs) data source to access the outputs of another HCP Terraform workspace. + +## Consider multiple IaaS accounts + +Many Terraform users start by deploying to a single account in their cloud provider. This makes sense when you are managing only a few resources. As your Terraform adoption matures, managing thousands of resources across several cloud providers can become very complex, slow, and hard to secure. One strategy is to split your managed resources into multiple accounts in a way that makes sense to your organization. For example, you may want an account per deployment environment, such as one for development and one for production. + +## Next steps + +As your teams grow, a common operational challenge is deciding how to enforce your organization's standards and practices. Using codified, automated policy enforcement with Sentinel or OPA ensures consistent application of your standards. + +[Learn how to govern your organization's best practices](/terraform/intro/phases/govern). \ No newline at end of file diff --git a/website/docs/language/style.mdx b/website/docs/language/style.mdx index 48b2fdc111..0b9472c0db 100644 --- a/website/docs/language/style.mdx +++ b/website/docs/language/style.mdx @@ -678,4 +678,4 @@ For more information, refer to the [policy enforcement documentation](/terraform This article introduces some considerations to keep in mind as you standardize your organization's Terraform style guidelines. Enforcing a standard way of writing and organizing your Terraform code across your organization ensures that it is readable, maintainable, and shareable. -The [HashiCorp Well-Architected Framework](/well-architected-framework) provides more guidance on [adapting your Terraform workflows for scale](/well-architected-framework/operational-excellence/operational-excellence-terraform-maturity). +To learn more Terraform adoption best practices, refer to [Phases of Terraform adoption](/terraform/intro/phases). From a5443a8bda3058c0085e1208b1fc200276506e8a Mon Sep 17 00:00:00 2001 From: James Bardin Date: Thu, 30 May 2024 15:18:57 -0400 Subject: [PATCH 128/161] don't attempt to import during a destroy operation A full destroy requires Terraform to refresh everything beforehand, but if an instance is missing from the state and has an `import` block, Terraform was attempting to re-import that resource before destroy. The most common reason this could happen would be when resuming a partially completed destroy, where some of the state has already been deleted. In that case the import will fail with an error because the resource no longer exists, and end up blocking the rest of the operation. --- .../terraform/context_plan_import_test.go | 64 +++++++++++++++++++ .../terraform/node_resource_plan_instance.go | 2 +- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/internal/terraform/context_plan_import_test.go b/internal/terraform/context_plan_import_test.go index 611e4cf025..e6e01be372 100644 --- a/internal/terraform/context_plan_import_test.go +++ b/internal/terraform/context_plan_import_test.go @@ -1564,3 +1564,67 @@ import { t.Fatalf("unexpected errors\n%s", diags.Err().Error()) } } +func TestContext2Plan_importDuringDestroy(t *testing.T) { + m := testModuleInline(t, map[string]string{ + "main.tf": ` + resource "test_object" "a" { + test_string = "foo" + } + + import { + to = test_object.a + id = "missing" + } + + resource "test_object" "b" { + test_string = "foo" + } + `, + }) + + p := simpleMockProvider() + ctx := testContext2(t, &ContextOpts{ + Providers: map[addrs.Provider]providers.Factory{ + addrs.NewDefaultProvider("test"): testProviderFuncFixed(p), + }, + }) + p.ReadResourceFn = func(req providers.ReadResourceRequest) (resp providers.ReadResourceResponse) { + // this resource has already been deleted, so return nothing during refresh + if req.PriorState.GetAttr("test_string").AsString() == "missing" { + resp.NewState = cty.NullVal(req.PriorState.Type()) + return resp + } + + resp.NewState = req.PriorState + return resp + } + + p.ImportResourceStateResponse = &providers.ImportResourceStateResponse{ + ImportedResources: []providers.ImportedResource{ + { + TypeName: "test_object", + State: cty.ObjectVal(map[string]cty.Value{ + "test_string": cty.StringVal("missing"), + }), + }, + }, + } + + state := states.NewState() + root := state.EnsureModule(addrs.RootModuleInstance) + root.SetResourceInstanceCurrent( + mustResourceInstanceAddr("test_object.b").Resource, + &states.ResourceInstanceObjectSrc{ + Status: states.ObjectReady, + AttrsJSON: []byte(`{"test_string":"foo"}`), + }, + mustProviderConfig(`provider["registry.terraform.io/hashicorp/test"]`), + ) + + _, diags := ctx.Plan(m, state, &PlanOpts{ + Mode: plans.DestroyMode, + }) + if diags.HasErrors() { + t.Fatalf("unexpected errors\n%s", diags.Err().Error()) + } +} diff --git a/internal/terraform/node_resource_plan_instance.go b/internal/terraform/node_resource_plan_instance.go index e8f314e452..b3d7131453 100644 --- a/internal/terraform/node_resource_plan_instance.go +++ b/internal/terraform/node_resource_plan_instance.go @@ -161,7 +161,7 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext) } } - importing := n.importTarget.IDString != "" + importing := n.importTarget.IDString != "" && !n.preDestroyRefresh importId := n.importTarget.IDString var deferred *providers.Deferred From d9c2b99ae199b641453929ce01769d9316ae056f Mon Sep 17 00:00:00 2001 From: Brandon Croft Date: Thu, 30 May 2024 13:22:35 -0600 Subject: [PATCH 129/161] Update settings.mdx --- website/docs/cli/cloud/settings.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/cli/cloud/settings.mdx b/website/docs/cli/cloud/settings.mdx index 3c7247cfa8..4d052fb648 100644 --- a/website/docs/cli/cloud/settings.mdx +++ b/website/docs/cli/cloud/settings.mdx @@ -62,8 +62,8 @@ The `cloud` block supports the following configuration arguments: workspace(s) the current configuration should use. - `workspaces` - (Required) A nested block that specifies which remote HCP Terraform workspaces to - use for the current configuration. The `workspaces` block must contain **exactly one** of the - following arguments, each denoting a strategy for how workspaces should be mapped: + use for the current configuration. The `workspaces` block must contain **exactly one** of either `tags` + or `name` argument, each denoting a strategy for how workspaces should be mapped: - `tags` - (Optional) A set of HCP Terraform workspace tags. You will be able to use this working directory with any workspaces that have all of the specified tags, From 3a5221269bc04558a776d09e20c83d31c94467f6 Mon Sep 17 00:00:00 2001 From: Brandon Croft Date: Thu, 30 May 2024 16:01:39 -0600 Subject: [PATCH 130/161] Revert "Add Warning for Deprecated Modules in `Init` (Second Revision)" --- internal/command/views/json/diagnostic.go | 8 -- internal/initwd/module_install.go | 106 +++--------------- internal/initwd/module_install_test.go | 67 +---------- internal/registry/response/module_versions.go | 13 +-- internal/tfdiags/diagnostic.go | 5 - website/docs/cli/commands/validate.mdx | 3 - 6 files changed, 18 insertions(+), 184 deletions(-) diff --git a/internal/command/views/json/diagnostic.go b/internal/command/views/json/diagnostic.go index 17ff4e12b7..4b5f7f4abc 100644 --- a/internal/command/views/json/diagnostic.go +++ b/internal/command/views/json/diagnostic.go @@ -38,7 +38,6 @@ type Diagnostic struct { Address string `json:"address,omitempty"` Range *DiagnosticRange `json:"range,omitempty"` Snippet *DiagnosticSnippet `json:"snippet,omitempty"` - Extra any `json:"extra,omitempty"` } // Pos represents a position in the source code. @@ -145,18 +144,11 @@ func NewDiagnostic(diag tfdiags.Diagnostic, sources map[string][]byte) *Diagnost desc := diag.Description() - extra := diag.ExtraInfo() - var publicExtra tfdiags.PublicExtraInfo - if e, ok := extra.(tfdiags.PublicExtraInfo); ok { - publicExtra = e - } - diagnostic := &Diagnostic{ Severity: sev, Summary: desc.Summary, Detail: desc.Detail, Address: desc.Address, - Extra: publicExtra, } sourceRefs := diag.Source() diff --git a/internal/initwd/module_install.go b/internal/initwd/module_install.go index 796837b94d..fbcfc0774a 100644 --- a/internal/initwd/module_install.go +++ b/internal/initwd/module_install.go @@ -49,28 +49,6 @@ type moduleVersion struct { version string } -// TypeModuleVersionDeprecation is a constant of TypeDiagnosticExtra indicating -// that a Warning is related to a deprecated module version is in use. -type TypeDiagnosticExtra string - -const TypeModuleVersionDeprecation TypeDiagnosticExtra = "module_version_deprecation" - -// ModuleVersionDeprecationDiagnosticExtra holds the diagnostic information -// about the deprecation of a module version. This ends up being serialized as extra data within a -// diagnostic and should be considered public API. -type ModuleVersionDeprecationDiagnosticExtra struct { - Type TypeDiagnosticExtra `json:"type"` - Version string `json:"version"` - SourceAddr string `json:"source_name"` - DeprecationMessage string `json:"deprecation_message"` - Link string `json:"link"` -} - -// IsPublic confirms the visibility of the extra field in the public API. -func (m ModuleVersionDeprecationDiagnosticExtra) IsPublic() { - // NOP -} - func NewModuleInstaller(modsDir string, loader *configload.Loader, reg *registry.Client) *ModuleInstaller { return &ModuleInstaller{ modsDir: modsDir, @@ -276,32 +254,6 @@ func (i *ModuleInstaller) moduleInstallWalker(ctx context.Context, manifest mods } log.Printf("[TRACE] ModuleInstaller: Module installer: %s %s already installed in %s", key, record.Version, record.Dir) - - // Checking for module deprecations in the case no new module versions need installation - if addr, isRegistryModule := req.SourceAddr.(addrs.ModuleSourceRegistry); isRegistryModule { - regClient := i.reg - - regsrcAddr := regsrc.ModuleFromRegistryPackageAddr(addr.Package) - resp, err := regClient.ModuleVersions(ctx, regsrcAddr) - if err != nil { - log.Printf("[WARN] Deprecation for %s could not be checked: call to registry failed: %v", addr.Package.String(), err) - - } else { - found: - for _, modProviderVersions := range resp.Modules { - for _, modVersion := range modProviderVersions.Versions { - vm, _ := version.NewVersion(modVersion.Version) - if vm.Equal(record.Version) { - if modVersion.Deprecation != nil { - diags = append(diags, buildModuleVersionDeprecationWarning(modVersion, req, addr.Package.String())) - } - break found - } - } - } - } - } - return mod, record.Version, diags } } @@ -528,8 +480,7 @@ func (i *ModuleInstaller) installRegistryModule(ctx context.Context, req *config modMeta := resp.Modules[0] - var latestMatch *response.ModuleVersion - var latestMatchVersion *version.Version + var latestMatch *version.Version var latestVersion *version.Version for _, mv := range modMeta.Versions { v, err := version.NewVersion(mv.Version) @@ -594,9 +545,8 @@ func (i *ModuleInstaller) installRegistryModule(ctx context.Context, req *config } if req.VersionConstraint.Required.Check(v) { - if latestMatch == nil || v.GreaterThan(latestMatchVersion) { - latestMatch = mv - latestMatchVersion = v + if latestMatch == nil || v.GreaterThan(latestMatch) { + latestMatch = v } } } @@ -621,27 +571,23 @@ func (i *ModuleInstaller) installRegistryModule(ctx context.Context, req *config return nil, nil, diags } - if latestMatch.Deprecation != nil { - diags = diags.Append(buildModuleVersionDeprecationWarning(latestMatch, req, addr.Package.String())) - } - // Report up to the caller that we're about to start downloading. - hooks.Download(key, packageAddr.String(), latestMatchVersion) + hooks.Download(key, packageAddr.String(), latestMatch) // If we manage to get down here then we've found a suitable version to // install, so we need to ask the registry where we should download it from. // The response to this is a go-getter-style address string. // first check the cache for the download URL - moduleAddr := moduleVersion{module: packageAddr, version: latestMatchVersion.String()} + moduleAddr := moduleVersion{module: packageAddr, version: latestMatch.String()} if _, exists := i.registryPackageSources[moduleAddr]; !exists { - realAddrRaw, err := reg.ModuleLocation(ctx, regsrcAddr, latestMatchVersion.String()) + realAddrRaw, err := reg.ModuleLocation(ctx, regsrcAddr, latestMatch.String()) if err != nil { - log.Printf("[ERROR] %s from %s %s: %s", key, addr, latestMatchVersion, err) + log.Printf("[ERROR] %s from %s %s: %s", key, addr, latestMatch, err) diags = diags.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, Summary: "Error accessing remote module registry", - Detail: fmt.Sprintf("Failed to retrieve a download URL for %s %s from %s: %s", addr, latestMatchVersion, hostname, err), + Detail: fmt.Sprintf("Failed to retrieve a download URL for %s %s from %s: %s", addr, latestMatch, hostname, err), }) return nil, nil, diags } @@ -650,7 +596,7 @@ func (i *ModuleInstaller) installRegistryModule(ctx context.Context, req *config diags = diags.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, Summary: "Invalid package location from module registry", - Detail: fmt.Sprintf("Module registry %s returned invalid source location %q for %s %s: %s.", hostname, realAddrRaw, addr, latestMatchVersion, err), + Detail: fmt.Sprintf("Module registry %s returned invalid source location %q for %s %s: %s.", hostname, realAddrRaw, addr, latestMatch, err), }) return nil, nil, diags } @@ -665,7 +611,7 @@ func (i *ModuleInstaller) installRegistryModule(ctx context.Context, req *config diags = diags.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, Summary: "Invalid package location from module registry", - Detail: fmt.Sprintf("Module registry %s returned invalid source location %q for %s %s: must be a direct remote package address.", hostname, realAddrRaw, addr, latestMatchVersion), + Detail: fmt.Sprintf("Module registry %s returned invalid source location %q for %s %s: must be a direct remote package address.", hostname, realAddrRaw, addr, latestMatch), }) return nil, nil, diags } @@ -673,7 +619,7 @@ func (i *ModuleInstaller) installRegistryModule(ctx context.Context, req *config dlAddr := i.registryPackageSources[moduleAddr] - log.Printf("[TRACE] ModuleInstaller: %s %s %s is available at %q", key, packageAddr, latestMatchVersion, dlAddr.Package) + log.Printf("[TRACE] ModuleInstaller: %s %s %s is available at %q", key, packageAddr, latestMatch, dlAddr.Package) err := fetcher.FetchPackage(ctx, instPath, dlAddr.Package.String()) if errors.Is(err, context.Canceled) { @@ -735,14 +681,14 @@ func (i *ModuleInstaller) installRegistryModule(ctx context.Context, req *config // Note the local location in our manifest. manifest[key] = modsdir.Record{ Key: key, - Version: latestMatchVersion, + Version: latestMatch, Dir: modDir, SourceAddr: req.SourceAddr.String(), } log.Printf("[DEBUG] Module installer: %s installed at %s", key, modDir) - hooks.Install(key, latestMatchVersion, modDir) + hooks.Install(key, latestMatch, modDir) - return mod, latestMatchVersion, diags + return mod, latestMatch, diags } func (i *ModuleInstaller) installGoGetterModule(ctx context.Context, req *configs.ModuleRequest, key string, instPath string, manifest modsdir.Manifest, hooks ModuleInstallHooks, fetcher *getmodules.PackageFetcher) (*configs.Module, hcl.Diagnostics) { @@ -990,27 +936,3 @@ func splitAddrSubdir(addr addrs.ModuleSource) (string, string) { return addr.String(), "" } } - -func buildModuleVersionDeprecationWarning(modVersion *response.ModuleVersion, req *configs.ModuleRequest, packageAddr string) *hcl.Diagnostic { - var additionalInfo []string - if modVersion.Deprecation.Reason != "" { - additionalInfo = append(additionalInfo, modVersion.Deprecation.Reason) - } - if modVersion.Deprecation.Link != "" { - additionalInfo = append(additionalInfo, fmt.Sprintf("More information: %s", modVersion.Deprecation.Link)) - } - detail := strings.Join(additionalInfo, "\n\n") - return &hcl.Diagnostic{ - Severity: hcl.DiagWarning, - Summary: fmt.Sprintf("Module version %s of %s is deprecated", modVersion.Version, packageAddr), - Detail: detail, - Subject: req.CallRange.Ptr(), - Extra: &ModuleVersionDeprecationDiagnosticExtra{ - Type: TypeModuleVersionDeprecation, - Version: modVersion.Version, - SourceAddr: packageAddr, - DeprecationMessage: modVersion.Deprecation.Reason, - Link: modVersion.Deprecation.Link, - }, - } -} diff --git a/internal/initwd/module_install_test.go b/internal/initwd/module_install_test.go index 81ba5c6bf8..217b6cfd8f 100644 --- a/internal/initwd/module_install_test.go +++ b/internal/initwd/module_install_test.go @@ -25,7 +25,6 @@ import ( "github.com/hashicorp/terraform/internal/configs/configload" "github.com/hashicorp/terraform/internal/copy" "github.com/hashicorp/terraform/internal/registry" - "github.com/hashicorp/terraform/internal/registry/response" "github.com/hashicorp/terraform/internal/tfdiags" _ "github.com/hashicorp/terraform/internal/logging" @@ -596,70 +595,6 @@ func TestLoaderInstallModules_registry(t *testing.T) { } -func TestLoaderInstallModules_registry_deprecated(t *testing.T) { - fixtureDir := filepath.Clean("testdata/registry-module-from-test") - tmpDir, done := tempChdir(t, fixtureDir) - // the module installer runs filepath.EvalSymlinks() on the destination - // directory before copying files, and the resultant directory is what is - // returned by the install hooks. Without this, tests could fail on machines - // where the default temp dir was a symlink. - dir, err := filepath.EvalSymlinks(tmpDir) - if err != nil { - t.Error(err) - } - - defer done() - - hooks := &testInstallHooks{} - modulesDir := filepath.Join(dir, ".terraform/modules") - - loader, close := configload.NewLoaderForTests(t) - defer close() - - inst := NewModuleInstaller(modulesDir, loader, registry.NewClient(nil, nil)) - - // Avoid actual registry lookup by populating registry cache - packageAddr := addrs.ModuleRegistryPackage{ - Host: svchost.Hostname("registry.terraform.io"), - Namespace: "hashicorp", - Name: "module-installer-acctest", - TargetSystem: "aws", - } - - inst.registryPackageVersions[packageAddr] = &response.ModuleVersions{ - Modules: []*response.ModuleProviderVersions{ - { - Source: "", - Versions: []*response.ModuleVersion{ - { - Version: "0.0.1", - Root: response.VersionSubmodule{}, - Submodules: []*response.VersionSubmodule{}, - Deprecation: &response.Deprecation{ - Reason: "This module version is deprecated", - Link: "https://example.com/deprecation", - }, - }, - }, - }, - }, - } - - _, diags := inst.InstallModules(context.Background(), dir, "tests", false, false, hooks) - - if !diags.HasWarnings() { - t.Fatal("expected warning") - } else { - assertDiagnosticCount(t, diags, 1) - assertDiagnosticSummary(t, diags, "Module version 0.0.1 of registry.terraform.io/hashicorp/module-installer-acctest/aws is deprecated") - - wantDetail := "This module version is deprecated\n\nMore information: https://example.com/deprecation" - if diags[0].Description().Detail != wantDetail { - t.Errorf("wrong deprecation detail\nwant: %s\ngot: %s", wantDetail, diags[0].Description().Detail) - } - } -} - func TestLoaderInstallModules_goGetter(t *testing.T) { if os.Getenv("TF_ACC") == "" { t.Skip("this test accesses github.com; set TF_ACC=1 to run it") @@ -1033,7 +968,7 @@ func assertDiagnosticCount(t *testing.T, diags tfdiags.Diagnostics, want int) bo if len(diags) != want { t.Errorf("wrong number of diagnostics %d; want %d", len(diags), want) for _, diag := range diags { - t.Logf("- %#v", diag.Description().Summary) + t.Logf("- %#v", diag) } return true } diff --git a/internal/registry/response/module_versions.go b/internal/registry/response/module_versions.go index 8272ed268b..a2dafa0238 100644 --- a/internal/registry/response/module_versions.go +++ b/internal/registry/response/module_versions.go @@ -20,16 +20,9 @@ type ModuleProviderVersions struct { // ModuleVersion is the output metadata for a given version needed by CLI to // resolve candidate versions to satisfy requirements. type ModuleVersion struct { - Version string `json:"version"` - Root VersionSubmodule `json:"root"` - Submodules []*VersionSubmodule `json:"submodules"` - Deprecation *Deprecation `json:"deprecation"` -} - -// Deprecation holds the user provided reason and link for the specific module version deprecation -type Deprecation struct { - Reason string `json:"reason"` - Link string `json:"link"` + Version string `json:"version"` + Root VersionSubmodule `json:"root"` + Submodules []*VersionSubmodule `json:"submodules"` } // VersionSubmodule is the output metadata for a submodule within a given diff --git a/internal/tfdiags/diagnostic.go b/internal/tfdiags/diagnostic.go index 528ba11a42..c50c81890c 100644 --- a/internal/tfdiags/diagnostic.go +++ b/internal/tfdiags/diagnostic.go @@ -65,8 +65,3 @@ type FromExpr struct { Expression hcl.Expression EvalContext *hcl.EvalContext } - -// PublicExtraInfo is an interface for marking Extra field that contain public extra information -type PublicExtraInfo interface { - IsPublic() -} diff --git a/website/docs/cli/commands/validate.mdx b/website/docs/cli/commands/validate.mdx index 8b688a5862..1ae22f36b1 100644 --- a/website/docs/cli/commands/validate.mdx +++ b/website/docs/cli/commands/validate.mdx @@ -178,9 +178,6 @@ The nested objects in `diagnostics` have the following properties: which may be useful in understanding the source of a diagnostic in a complex expression. These expression value objects are described below. - - `extra` (object): An optional object that serves as an extension point for additional - machine-readable information about the problem. - ### Source Position A source position object, as used in the `range` property of a diagnostic From cdf88b30cc944b2ea5800c345737aaca7754876d Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Fri, 31 May 2024 13:46:31 +0200 Subject: [PATCH 131/161] complete creation of v1.9 branch (#35268) --- CHANGELOG.md | 34 ++-------------------------------- version/VERSION | 2 +- 2 files changed, 3 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b0f3b9565..bda82a0bcc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,35 +1,4 @@ -## 1.9.0 (Unreleased) - -NEW FEATURES: - -* **Input variable validation rules can refer to other objects**: Previously input variable validation rules could refer only to the variable being validated. Now they are general expressions, similar to those elsewhere in a module, which can refer to other input variables and to other objects such as data resources. -* **`templatestring` function**: a new built-in function which is similar to `templatefile` but designed to render templates obtained dynamically, such as from a data resource result. - -ENHANCEMENTS: - -* `terraform plan`: Improved presentation of OPA and Sentinel policy evaluations in HCP Terraform remote runs, for logical separation. -* `terraform init` now accepts a `-json` option. If specified, enables the machine readable JSON output. ([#34886](https://github.com/hashicorp/terraform/pull/34886)) -* `terraform test`: Test runs can now pass sensitive values to input variables while preserving their dynamic sensitivity. Previously sensitivity would be preserved only for variables statically declared as being sensitive, using `sensitive = true`. ([#35021](https://github.com/hashicorp/terraform/pull/35021)) -* config: Input variable validation rules can now refer to other objects in the same module. ([#34955](https://github.com/hashicorp/terraform/pull/34955)) -* core: Performance improvement during graph building for configurations with an extremely large number of `resource` blocks. ([#35088](https://github.com/hashicorp/terraform/pull/35088)) -* built-in `terraform` provider: Allows `moved` block refactoring from the `hashicorp/null` provider `null_resource` resource type to the `terraform_data` resource type. ([#35163](https://github.com/hashicorp/terraform/pull/35163)) -* `terraform output` with `cloud` block: Terraform no longer suggests that data loss could occur when outputs are not available. [GH-35143] -* `terraform console`: Now has basic support for multi-line input in interactive mode. ([#34822](https://github.com/hashicorp/terraform/pull/34822)) - If an entered line contains opening parentheses/etc that are not closed, Terraform will await another line of input to complete the expression. This initial implementation is primarily intended to support pasting in multi-line expressions from elsewhere, rather than for manual multi-line editing, so the interactive editing support is currently limited. -* cli: Reduced copying of state to improve performance with larges numbers of resources. [GH-35164] -* `removed` blocks can now declare destroy-time provisioners which will be executed when the associated resource instances are destroyed. [GH-35230] - -BUG FIXES: - -* `remote-exec` provisioner: Each remote connection will now be closed immediately after use. ([#34137](https://github.com/hashicorp/terraform/issues/34137)) -* backend/s3: Fixed the digest value displayed for DynamoDB/S3 state checksum mismatches. ([#34387](https://github.com/hashicorp/terraform/issues/34387)) -* `terraform test`: Fix bug in which non-Hashicorp providers required by testing modules and initialised within the test files were assigned incorrect registry addresses. ([#35161](https://github.com/hashicorp/terraform/issues/35161)) -* config: The `templatefile` function no longer returns a "panic" error if the template file path is marked as sensitive. Instead, the template rendering result is also marked as sensitive. ([#35180](https://github.com/hashicorp/terraform/issues/35180)) -* `terraform init`: When selecting a version for a provider that has both positive and negative version constraints for the same prerelease -- e.g. `1.2.0-beta.1, !1.2.0-beta.1` -- the negative constraint will now overrule the positive, for consistency with how negative constraints are handled otherwise. Previously Terraform would incorrectly treat the positive as overriding the negative if the specified version was a prerelease. ([#35181](https://github.com/hashicorp/terraform/issues/35181)) - -UPGRADE NOTES: - -* `terraform test`: It is no longer valid to specify version constraints within provider blocks within .tftest.hcl files. Instead, version constraints must be supplied within the main configuration where the provider is in use. +## 1.10.0 (Unreleased) EXPERIMENTS: @@ -45,6 +14,7 @@ Experiments are only enabled in alpha releases of Terraform CLI. The following f For information on prior major and minor releases, see their changelogs: +* [v1.9](https://github.com/hashicorp/terraform/blob/v1.9/CHANGELOG.md) * [v1.8](https://github.com/hashicorp/terraform/blob/v1.8/CHANGELOG.md) * [v1.7](https://github.com/hashicorp/terraform/blob/v1.7/CHANGELOG.md) * [v1.6](https://github.com/hashicorp/terraform/blob/v1.6/CHANGELOG.md) diff --git a/version/VERSION b/version/VERSION index 27167ba29c..81c871de46 100644 --- a/version/VERSION +++ b/version/VERSION @@ -1 +1 @@ -1.9.0-alpha +1.10.0 From a73e4e658648e0d507e89c4cd389a2af5edf9395 Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Fri, 31 May 2024 13:50:16 +0200 Subject: [PATCH 132/161] Update CHANGELOG.md --- CHANGELOG.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bda82a0bcc..64fe61ad2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,9 @@ EXPERIMENTS: Experiments are only enabled in alpha releases of Terraform CLI. The following features are not yet available in stable releases. -* `template_string_func`: This [language experiment](https://developer.hashicorp.com/terraform/language/settings#experimental-language-features) introduces a new built-in function named `templatestring` which is similar to `templatefile` but designed to render templates obtained dynamically, such as from a data resource result. * `terraform test` accepts a new option `-junit-xml=FILENAME`. If specified, and if the test configuration is valid enough to begin executing, then Terraform writes a JUnit XML test result report to the given filename, describing similar information as included in the normal test output. ([#34291](https://github.com/hashicorp/terraform/issues/34291)) * The new command `terraform rpcapi` exposes some Terraform Core functionality through an RPC interface compatible with [`go-plugin`](https://github.com/hashicorp/go-plugin). The exact RPC API exposed here is currently subject to change at any time, because it's here primarily as a vehicle to support the [Terraform Stacks](https://www.hashicorp.com/blog/terraform-stacks-explained) private preview and so will be broken if necessary to respond to feedback from private preview participants, or possibly for other reasons. Do not use this mechanism yet outside of Terraform Stacks private preview. -* The experimental "deferred actions" feature, enabled by passing the `-allow-deferral` option to `terraform plan`, permits `count` and `for_each` arguments in `module`, `resource`, and `data` blocks to have unknown values and allows providers to react more flexibly to unknown values. This experiment is under active development, and so it's not yet useful to participate in this experiment. -* `variable_validation_crossref`: This [language experiment](https://developer.hashicorp.com/terraform/language/settings#experimental-language-features) previously allowed `validation` blocks inside input variable declarations to refer to other objects inside the module where the variable is declared. This experiment has now been stabilized, so you no longer need to enable this experiment. +* The experimental "deferred actions" feature, enabled by passing the `-allow-deferral` option to `terraform plan`, permits `count` and `for_each` arguments in `module`, `resource`, and `data` blocks to have unknown values and allows providers to react more flexibly to unknown values. This experiment is under active development, and so it's not yet useful to participate in this experiment ## Previous Releases From 6b19b9e82a48ff90065988cc5235e2966c860ede Mon Sep 17 00:00:00 2001 From: James Bardin Date: Fri, 31 May 2024 14:24:23 -0400 Subject: [PATCH 133/161] render entirely unknown blocks in the plan output The plan renderer was missing a check for entirely unknown blocks, causing them to be omitted from the human readable output. An unknown block can happen when using an unknown for_each value in a dynamic block assignment. --- internal/command/jsonformat/differ/block.go | 7 ++++ .../command/jsonformat/differ/differ_test.go | 35 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/internal/command/jsonformat/differ/block.go b/internal/command/jsonformat/differ/block.go index a53e11ac50..f4a3817dc7 100644 --- a/internal/command/jsonformat/differ/block.go +++ b/internal/command/jsonformat/differ/block.go @@ -74,6 +74,13 @@ func ComputeDiffForBlock(change structured.Change, block *jsonprovider.Block) co afterSensitive := childValue.IsAfterSensitive() forcesReplacement := childValue.ReplacePaths.Matches() + if unknown, ok := checkForUnknownBlock(childValue, block); ok { + // An unknown block doesn't render any type information, so we can + // render it as a single block rather than switching on all types. + blocks.AddSingleBlock(key, unknown, forcesReplacement, beforeSensitive, afterSensitive) + continue + } + switch NestingMode(blockType.NestingMode) { case nestingModeSet: diffs, action := computeBlockDiffsAsSet(childValue, blockType.Block) diff --git a/internal/command/jsonformat/differ/differ_test.go b/internal/command/jsonformat/differ/differ_test.go index 77a6465ddf..9a2d09940e 100644 --- a/internal/command/jsonformat/differ/differ_test.go +++ b/internal/command/jsonformat/differ/differ_test.go @@ -99,6 +99,41 @@ func TestValue_SimpleBlocks(t *testing.T) { "normal_attribute": renderers.ValidatePrimitive(nil, "some value", plans.Create, false), }, nil, nil, nil, nil, plans.Create, false), }, + "create_with_unknown_block": { + input: structured.Change{ + Before: nil, + After: map[string]interface{}{ + "normal_attribute": "some value", + }, + Unknown: map[string]any{ + "nested": true, + }, + }, + block: &jsonprovider.Block{ + Attributes: map[string]*jsonprovider.Attribute{ + "normal_attribute": { + AttributeType: unmarshalType(t, cty.String), + }, + }, + BlockTypes: map[string]*jsonprovider.BlockType{ + "nested": { + NestingMode: "single", + Block: &jsonprovider.Block{ + Attributes: map[string]*jsonprovider.Attribute{ + "attr": { + AttributeType: unmarshalType(t, cty.String), + Optional: true, + }, + }, + }, + }, + }, + }, + validate: renderers.ValidateBlock(map[string]renderers.ValidateDiffFunction{ + "normal_attribute": renderers.ValidatePrimitive(nil, "some value", plans.Create, false), + }, map[string]renderers.ValidateDiffFunction{ + "nested": renderers.ValidateUnknown(nil, plans.Create, false), + }, nil, nil, nil, plans.Create, false)}, } for name, tc := range tcs { // Set some default values From e23e6b84c7ec8bc165d93211094319148579c836 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Mon, 3 Jun 2024 09:16:42 -0700 Subject: [PATCH 134/161] lang/funcs: Allow some more expression types in templatestring The templatestring function has some special constraints on its first argument that are included to add some intentional friction for those who are new to Terraform, want to do some simple template rendering, but have only found the templatestring function so far. We know from previous experience with the hashicorp/template provider that this sort of functionality tends to attract those who haven't yet learned that the Terraform language has built-in support for string templates (without calling any function), who would then get confused by the need for an extra level of escaping to render a template string only indirectly through this function. However, this rule is not intended to be onerous and require writing the rest of the containing module in an unnatural way to work around it, so here we loosen the rule to allow some additional forms: - An index expression whose collection operand meets these rules. - A relative traversal whose source operand meets these rules. In particular this makes it possible to write an expression like: data.example.example[each.key].result ...which is a relative traversal from an index from a scope traversal, and is a very reasonable thing to write if you've retrieved multiple templates using a data resource that uses for_each. This also treats splat expressions in the same way as index expressions at the static check stage, but that's only to allow us to reach the dynamic type check that will ultimately report that a string is required, because the result of a splat expression is a tuple. The type-related error message is (subjectively) more helpful/relevant than the syntax-related one for this case. Finally, this includes some revisions to the documentation for this function to correct some editing errors from the first pass and to slightly loosen the language about what's allowed. It's still a little vague about what exactly is allowed, but I'm doubtful that a precise definition in terms of HCL's expression types would be very enlightening for a typical reader anyway. We can tweak the specificity of the language here if we start to see repeated questions about what is and is not valid. --- internal/lang/funcs/string.go | 72 +++++++++++++++---- internal/lang/funcs/string_test.go | 49 +++++++++++++ .../language/functions/templatestring.mdx | 29 ++++---- 3 files changed, 126 insertions(+), 24 deletions(-) diff --git a/internal/lang/funcs/string.go b/internal/lang/funcs/string.go index 33142f2952..c026bb9508 100644 --- a/internal/lang/funcs/string.go +++ b/internal/lang/funcs/string.go @@ -213,8 +213,6 @@ func MakeTemplateStringFunc(funcsCb func() (funcs map[string]function.Function, // the function documentation to learn about the other options that // are probably more suitable for what they need. switch expr := templateClosure.Expression.(type) { - case *hclsyntax.ScopeTraversalExpr: - // A standalone traversal is always acceptable. case *hclsyntax.TemplateWrapExpr: // This situation occurs when someone writes an interpolation-only // expression as was required in Terraform v0.11 and earlier. @@ -249,16 +247,17 @@ func MakeTemplateStringFunc(funcsCb func() (funcs map[string]function.Function, ) } default: - // Nothing else is allowed. - // Someone who really does want to construct a template dynamically - // can factor out that construction into a local value and refer - // to it in the templatestring call, but it's not really feasible - // to explain that clearly in a short error message so we'll deal - // with that option on the function's documentation page instead, - // where we can show a full example. - return cty.UnknownVal(retType), function.NewArgErrorf( - 0, "invalid template expression: must be a direct reference to a single string from elsewhere, containing valid Terraform template syntax", - ) + if !isValidTemplateStringExpr(expr) { + // Someone who really does want to construct a template dynamically + // can factor out that construction into a local value and refer + // to it in the templatestring call, but it's not really feasible + // to explain that clearly in a short error message so we'll deal + // with that option on the function's documentation page instead, + // where we can show a full example. + return cty.UnknownVal(retType), function.NewArgErrorf( + 0, "invalid template expression: must be a direct reference to a single string from elsewhere, containing valid Terraform template syntax", + ) + } } templateVal, diags := templateClosure.Value() @@ -385,6 +384,55 @@ func makeRenderTemplateFunc(funcsCb func() (funcs map[string]function.Function, } } +func isValidTemplateStringExpr(expr hcl.Expression) bool { + // Our goal with this heuristic is to be as permissive as possible with + // allowing things that authors might try to use as references to a + // template string defined elsewhere, while rejecting complex expressions + // that seem like they might be trying to construct templates dynamically + // or might have resulted from a misunderstanding that "templatestring" is + // the only way to render a template, because someone hasn't learned + // about template expressions yet. + // + // This is here only to give better feedback to folks who seem to be using + // templatestring for something other than what it's intended for, and not + // to block dynamic template generation altogether. Authors who have a + // genuine need for dynamic template generation can always assert that to + // Terraform by factoring out their dynamic generation into a local value + // and referring to it; this rule is just a little speedbump to prompt + // the author to consider whether there's a better way to solve their + // problem, as opposed to just using the first solution they found. + switch expr := expr.(type) { + case *hclsyntax.ScopeTraversalExpr: + // A simple static reference from the current scope is always valid. + return true + + case *hclsyntax.RelativeTraversalExpr: + // Relative traversals are allowed as long as they begin from + // something that would otherwise be allowed. + return isValidTemplateStringExpr(expr.Source) + + case *hclsyntax.IndexExpr: + // Index expressions are allowed as long as the collection is + // also specified using an expression that conforms to these rules. + // The key operand is intentionally unconstrained because that + // is a rule for how to select an element, and so doesn't represent + // a source from which the template string is being retrieved. + return isValidTemplateStringExpr(expr.Collection) + + case *hclsyntax.SplatExpr: + // Splat expressions would be weird to use because they'd typically + // return a tuple and that wouldn't be valid as a template string, + // but we allow it here (as long as the operand would otherwise have + // been allowed) because then we'll let the type mismatch error + // show through, and that's likely a more helpful error message. + return isValidTemplateStringExpr(expr.Source) + + default: + // Nothing else is allowed. + return false + } +} + // Replace searches a given string for another given substring, // and replaces all occurences with a given replacement string. func Replace(str, substr, replace cty.Value) (cty.Value, error) { diff --git a/internal/lang/funcs/string_test.go b/internal/lang/funcs/string_test.go index c0de6b3239..19f2f7f138 100644 --- a/internal/lang/funcs/string_test.go +++ b/internal/lang/funcs/string_test.go @@ -335,6 +335,55 @@ func TestTemplateString(t *testing.T) { cty.StringVal(`it's a value`), ``, }, + { + `data.whatever.whatever[each.key].result`, + map[string]cty.Value{ + "data": cty.ObjectVal(map[string]cty.Value{ + "whatever": cty.ObjectVal(map[string]cty.Value{ + "whatever": cty.MapVal(map[string]cty.Value{ + "foo": cty.ObjectVal(map[string]cty.Value{ + "result": cty.StringVal("it's ${a}"), + }), + }), + }), + }), + "each": cty.ObjectVal(map[string]cty.Value{ + "key": cty.StringVal("foo"), + }), + }, + cty.ObjectVal(map[string]cty.Value{ + "a": cty.StringVal("a value"), + }), + cty.StringVal(`it's a value`), + ``, + }, + { + `data.whatever.whatever[*].result`, + map[string]cty.Value{ + "data": cty.ObjectVal(map[string]cty.Value{ + "whatever": cty.ObjectVal(map[string]cty.Value{ + "whatever": cty.TupleVal([]cty.Value{ + cty.ObjectVal(map[string]cty.Value{ + "result": cty.StringVal("it's ${a}"), + }), + }), + }), + }), + "each": cty.ObjectVal(map[string]cty.Value{ + "key": cty.StringVal("foo"), + }), + }, + cty.ObjectVal(map[string]cty.Value{ + "a": cty.StringVal("a value"), + }), + cty.NilVal, + // We have an intentional hole in our heuristic for whether the + // first argument is a suitable expression which permits splat + // expressions just so that we can return the type mismatch error + // from the result not being a string, instead of the more general + // error about it not being a supported expression type. + `invalid template value: a string is required`, + }, { `"can't write $${not_allowed}"`, map[string]cty.Value{}, diff --git a/website/docs/language/functions/templatestring.mdx b/website/docs/language/functions/templatestring.mdx index 8f97bb4e1b..fd83f88a93 100644 --- a/website/docs/language/functions/templatestring.mdx +++ b/website/docs/language/functions/templatestring.mdx @@ -8,13 +8,13 @@ description: |- -> **Note:** The `templatestring` function is intended for advanced use cases. Most use cases require only a [string template expression](/terraform/language/expressions/strings#string-templates). To render a template from a file, use the [`templatefile` function](/terraform/language/functions/templatefile). -`templatestring` renders a template using a supplied set of template variables. +`templatestring` renders a template given as a string value, using a supplied set of template variables. ```hcl -templatefile(ref, vars) +templatestring(ref, vars) ``` -The first parameter must be a simple reference to string value containing the template: for example, `data.aws_s3_object.example.body` or `local.inline_template`. +The first parameter must be a direct reference to string value containing the template: for example, `data.aws_s3_object.example.body` or `local.inline_template`. It is **not** valid to supply the template expression directly as the first argument: @@ -25,23 +25,18 @@ templatestring("Hello, $${name}", { }) ``` -Instead of the above, you should instead use a string template expression: +Instead of the above, you should use a normal string template expression: ```hcl "Hello, ${var.name}" ``` -The `templatestring` function is needed only when the template is available as a named object in the current module. +The `templatestring` function is needed only when the template is available from a named object, such as a data resource, declared in the current module. The template syntax is the same as for [string templates](/terraform/language/expressions/strings#string-templates) in the main Terraform language, including interpolation sequences delimited with -`${` ... `}`. - -Strings in the Terraform language are sequences of Unicode characters, so -this function will interpret the file contents as UTF-8 encoded text and -return the resulting Unicode characters. If the template contains invalid UTF-8 -sequences then this function will produce an error. +`${` ... `}`. ## Example @@ -60,7 +55,17 @@ output "example" { } ``` -For more examples of how to use templates, please see the documentation for the [`templatefile`](/terraform/language/functions/templatefile#Examples) function. +For more examples of how to use templates, refer to the documentation for [the `templatefile` function](/terraform/language/functions/templatefile#Examples). + +## Dynamic Template Construction + +This function is primarily intended for rendering templates fetched as a single string from remote locations, often using data resources. + +You can also use this as a way to construct a template dynamically and then render it, but we recommend treating that only as a last resort because the result tends to be hard to understand, hard to maintain, and fragile to unexpected input. + +The restrictions on what kind of syntax is allowed in the first argument are a guardrail to help avoid those new to Terraform thinking that this function is the primary way to render templates in Terraform, but you can bypass those restrictions if you wish by writing an expression that builds a template dynamically and then assigning that expression to a [local value](/terraform/language/values/locals). You can then use a reference to that local value as the first argument to `templatestring`. + +If you _do_ choose to construct templates from parts dynamically, be mindful that Terraform has built-in functions that can interact with the local filesystem, and so maliciously-crafted input might produce a template whose result includes data from arbitrary files on the system where Terraform is running. ## Related Functions From acc4c12ac25455be1b863574be6d81caf8271073 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Mon, 3 Jun 2024 16:15:40 -0400 Subject: [PATCH 135/161] variable validation rules must still point to self While variable validation rules can now include other references, they also still need to reference the variable itself. If the variable itself wasn't referenced, then the resulting `Invalid value for variable` error would not make sense. Having no self-references will also cause a panic when trying to reinsert the variable name into the evaluation context, because the context variables map could be nil. A check for a nil map does not need to be added however, because ensuring that a self-reference exists means there will always be at least 1 variable in scope. --- internal/configs/named_values.go | 29 ++++++++++++++++++- .../variable-validation-condition-noself.tf | 10 +++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 internal/configs/testdata/invalid-files/variable-validation-condition-noself.tf diff --git a/internal/configs/named_values.go b/internal/configs/named_values.go index 286c507a11..43a624d9d8 100644 --- a/internal/configs/named_values.go +++ b/internal/configs/named_values.go @@ -180,8 +180,9 @@ func decodeVariableBlock(block *hcl.Block, override bool) (*Variable, hcl.Diagno case "validation": vv, moreDiags := decodeCheckRuleBlock(block, override) diags = append(diags, moreDiags...) - v.Validations = append(v.Validations, vv) + diags = append(diags, checkVariableValidationBlock(v.Name, vv)...) + v.Validations = append(v.Validations, vv) default: // The above cases should be exhaustive for all block types // defined in variableBlockSchema @@ -504,3 +505,29 @@ var outputBlockSchema = &hcl.BodySchema{ {Type: "postcondition"}, }, } + +func checkVariableValidationBlock(varName string, vv *CheckRule) hcl.Diagnostics { + var diags hcl.Diagnostics + + if vv.Condition != nil { + // The validation condition must include a reference to the variable itself + for _, traversal := range vv.Condition.Variables() { + ref, moreDiags := addrs.ParseRef(traversal) + if !moreDiags.HasErrors() { + if addr, ok := ref.Subject.(addrs.InputVariable); ok { + if addr.Name == varName { + return nil + } + } + } + } + + return diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Invalid variable validation condition", + Detail: fmt.Sprintf("The condition for variable %q must refer to var.%s in order to test incoming values.", varName, varName), + Subject: vv.Condition.Range().Ptr(), + }) + } + return nil +} diff --git a/internal/configs/testdata/invalid-files/variable-validation-condition-noself.tf b/internal/configs/testdata/invalid-files/variable-validation-condition-noself.tf new file mode 100644 index 0000000000..3571a58ab1 --- /dev/null +++ b/internal/configs/testdata/invalid-files/variable-validation-condition-noself.tf @@ -0,0 +1,10 @@ +locals { + something = "else" +} + +variable "validation" { + validation { + condition = local.something == "else" + error_message = "Something else." + } +} From 92ab27f8e907a094dbd418e95f132c23e6d6e381 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Thu, 30 May 2024 14:24:11 -0400 Subject: [PATCH 136/161] store CreateBeforeDestroy even when not refreshing The ordering for CreateBeforeDestroy is determined by the value stored in the resource instance state. If the destroy plan was created with `-refresh=false`, _and_ the configuration changed the value of `create_before_destroy`, then there was no chance for the state to be updated, and we now have a mismatch between the configuration and the state. This disagreement causes the plan to record the resource replacement as destroy-then-create, but order the apply actions as create-before-destroy, and since the create is expected to be last, the destroy operation end up showing a noop and is skipped. The fix is relatively small, just ensure that we re-write the state when there is no refresh but there was a change in `CreateBeforeDestroy`. The replacement ordering optimally should be decided entirely by the plan, and then we can rely on the planned changes to determine the CreateBeforeDestroy status without re-inspecting the config and state. This would require very careful auditing however, since not all nodes are represented exactly in the changes, and the way `CreateBeforeDestroy` propagates through the graph is extremely important for correctness and to prevent cycles. --- internal/terraform/context_apply2_test.go | 78 +++++++++++++++++++ .../terraform/node_resource_plan_instance.go | 25 ++++-- internal/terraform/transform_destroy_cbd.go | 9 ++- 3 files changed, 103 insertions(+), 9 deletions(-) diff --git a/internal/terraform/context_apply2_test.go b/internal/terraform/context_apply2_test.go index 1bf3f759e3..d908f49795 100644 --- a/internal/terraform/context_apply2_test.go +++ b/internal/terraform/context_apply2_test.go @@ -2978,3 +2978,81 @@ resource "test_object" "obj" { t.Fatalf("expected exactly one diagnostic, but got %d: %s", len(diags), diags) } } + +// Using refresh=false when create_before_destroy disagrees between state and +// config, should still destroy instance. +func TestContext2Apply_35218(t *testing.T) { + m := testModuleInline(t, map[string]string{ + "main.tf": ` +resource "test_instance" "obj" { + // was created with create_before_destroy=true + lifecycle { + // create_before_destroy=true + } + value = "replace" +} +`, + }) + + p := testProvider("test") + p.GetProviderSchemaResponse.ServerCapabilities.PlanDestroy = true + p.PlanResourceChangeFn = func(req providers.PlanResourceChangeRequest) (resp providers.PlanResourceChangeResponse) { + if req.ProposedNewState.IsNull() { + // plan destroy + resp.PlannedState = req.ProposedNewState + return resp + } + + obj := req.ProposedNewState.AsValueMap() + if obj["id"].IsNull() { + obj["id"] = cty.UnknownVal(cty.String) + resp.PlannedState = cty.ObjectVal(obj) + return resp + } + + // plan to replace the configured instance + resp.PlannedState = cty.ObjectVal(obj) + resp.RequiresReplace = []cty.Path{cty.GetAttrPath("value")} + return resp + } + + destroyCalled := false + p.ApplyResourceChangeFn = func(req providers.ApplyResourceChangeRequest) (resp providers.ApplyResourceChangeResponse) { + if req.PlannedState.IsNull() { + destroyCalled = true + resp.NewState = req.PlannedState + return resp + } + + obj := req.PlannedState.AsValueMap() + obj["id"] = cty.StringVal("new_id") + resp.NewState = cty.ObjectVal(obj) + return resp + } + + state := states.BuildState(func(s *states.SyncState) { + s.SetResourceInstanceCurrent(mustResourceInstanceAddr("test_instance.obj"), &states.ResourceInstanceObjectSrc{ + AttrsJSON: []byte(`{"id":"old_id"}`), + Status: states.ObjectReady, + CreateBeforeDestroy: true, + }, mustProviderConfig(`provider["registry.terraform.io/hashicorp/test"]`)) + }) + ctx := testContext2(t, &ContextOpts{ + Providers: map[addrs.Provider]providers.Factory{ + addrs.NewDefaultProvider("test"): testProviderFuncFixed(p), + }, + }) + + plan, diags := ctx.Plan(m, state, &PlanOpts{ + SkipRefresh: true, + Mode: plans.NormalMode, + }) + assertNoErrors(t, diags) + + _, diags = ctx.Apply(plan, m, nil) + assertNoErrors(t, diags) + + if !destroyCalled { + t.Fatal("old instance not destroyed") + } +} diff --git a/internal/terraform/node_resource_plan_instance.go b/internal/terraform/node_resource_plan_instance.go index e8f314e452..3dcfad33f7 100644 --- a/internal/terraform/node_resource_plan_instance.go +++ b/internal/terraform/node_resource_plan_instance.go @@ -197,14 +197,13 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext) } } - // In 0.13 we could be refreshing a resource with no config. - // We should be operating on managed resource, but check here to be certain - if n.Config == nil || n.Config.Managed == nil { - log.Printf("[WARN] managedResourceExecute: no Managed config value found in instance state for %q", n.Addr) - } else { - if instanceRefreshState != nil { - instanceRefreshState.CreateBeforeDestroy = n.Config.Managed.CreateBeforeDestroy || n.ForceCreateBeforeDestroy - } + // we may need to detect a change in CreateBeforeDestroy to ensure it's + // stored when we are not refreshing + updatedCBD := false + if n.Config != nil && n.Config.Managed != nil && instanceRefreshState != nil { + newCBD := n.Config.Managed.CreateBeforeDestroy || n.ForceCreateBeforeDestroy + updatedCBD = instanceRefreshState.CreateBeforeDestroy != newCBD + instanceRefreshState.CreateBeforeDestroy = newCBD } var refreshDeferred *providers.Deferred @@ -243,6 +242,16 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext) } } + if n.skipRefresh && !importing && updatedCBD { + // CreateBeforeDestroy must be set correctly in the state which us used + // to create the apply graph, so if we did not refresh the state make + // sure we still update any changes to CreateBeforeDestroy. + diags = diags.Append(n.writeResourceInstanceState(ctx, instanceRefreshState, refreshState)) + if diags.HasErrors() { + return diags + } + } + // Plan the instance, unless we're in the refresh-only mode if !n.skipPlanChanges { diff --git a/internal/terraform/transform_destroy_cbd.go b/internal/terraform/transform_destroy_cbd.go index 6fc1ecc2dc..aa4e143e1d 100644 --- a/internal/terraform/transform_destroy_cbd.go +++ b/internal/terraform/transform_destroy_cbd.go @@ -115,9 +115,16 @@ func (t *ForcedCBDTransformer) hasCBDDescendent(g *Graph, v dag.Vertex) bool { // DiffTransformer when building the apply graph. type CBDEdgeTransformer struct { // Module and State are only needed to look up dependencies in - // any way possible. Either can be nil if not availabile. + // any way possible. Either can be nil if not available. Config *configs.Config State *states.State + + // FIXME: This should optimally be decided entirely during plan, and then we + // can rely on the planned changes to determine the CreateBeforeDestroy + // status. This would require very careful auditing however, since not all + // nodes are represented exactly in the changes, and the way + // CreateBeforeDestroy propagates through the graph is extremely important + // for correctness and to prevent cycles. } func (t *CBDEdgeTransformer) Transform(g *Graph) error { From 2297c76be54d5fed7fe633dbd303538a92a9a6bd Mon Sep 17 00:00:00 2001 From: James Bardin Date: Mon, 3 Jun 2024 17:18:30 -0400 Subject: [PATCH 137/161] add section for removed block provisioners --- website/docs/language/resources/syntax.mdx | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/website/docs/language/resources/syntax.mdx b/website/docs/language/resources/syntax.mdx index 9408ca6dc6..827ed908e1 100644 --- a/website/docs/language/resources/syntax.mdx +++ b/website/docs/language/resources/syntax.mdx @@ -137,6 +137,25 @@ The `from` argument is the address of the resource you want to remove, without a The `lifecycle` block is required. The `destroy` argument determines whether Terraform will attempt to destroy the object managed by the resource or not. A value of `false` means that Terraform will remove the resource from state without destroying it. +A `removed` block may also contain a [Destroy-Time Provisioner](/terraform/language/resources/provisioners/syntax#destroy-time-provisioners), so that the provisioner can remain in the configuration even though the `resource` block has been removed. + +``` +removed { + from = aws_instance.example + + lifecycle { + destroy = true + } + + provisioner "local-exec" { + when = destroy + command = "echo 'Instance ${self.id} has been destroyed.'" + } +} +``` + +The same referencing rules apply as in normal destroy-time provisioners, with only `count.index`, `each.key`, and `self` allowed. The provisioner must specify `when = destroy`, and the `removed` block must use `destroy = true` in order for the provisioner to execute. + ## Custom Condition Checks You can use `precondition` and `postcondition` blocks to specify assumptions and guarantees about how the resource operates. The following example creates a precondition that checks whether the AMI is properly configured. From 59ead5356fb3b8e011253028573dca4b44e42bd8 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Tue, 4 Jun 2024 15:14:00 +0200 Subject: [PATCH 138/161] stacks: update RPC APIs with deferral information (#35125) * stacks: add deferred resource instance planned change to protobuf * stacks: add deferred resource instance to stack plan sequence * stacks: add planned change for deferred actions * stacks: refactor planned change resource instance planned moving the components out of the main function definition so that we can reuse the implementation for deferred resource instances which wraps the message used for PlannedChangeResourceInstancePlanned * stacks: track deferred changes in stackplan * add simple tests * fix tests * address comments --------- Co-authored-by: Liam Cervante --- internal/plans/planfile/tfplan.go | 4 +- internal/rpcapi/terraform1/terraform1.pb.go | 3220 +++++++++-------- internal/rpcapi/terraform1/terraform1.proto | 30 + internal/stacks/stackplan/component.go | 5 +- internal/stacks/stackplan/from_proto.go | 149 +- internal/stacks/stackplan/planned_change.go | 206 +- .../stacks/stackplan/planned_change_test.go | 106 + internal/stacks/stackruntime/helper_test.go | 2 + .../internal/stackeval/component_instance.go | 46 + internal/stacks/stackruntime/plan.go | 2 + internal/stacks/stackruntime/plan_test.go | 153 +- .../test/deferrable-component/main.tf | 24 + .../deferrable-component/main.tfstack.hcl | 31 + .../stacks/stackruntime/testing/provider.go | 22 + .../stacks/tfstackdata1/tfstackdata1.pb.go | 470 ++- .../stacks/tfstackdata1/tfstackdata1.proto | 23 + 16 files changed, 2834 insertions(+), 1659 deletions(-) create mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/deferrable-component/main.tf create mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/deferrable-component/main.tfstack.hcl diff --git a/internal/plans/planfile/tfplan.go b/internal/plans/planfile/tfplan.go index 290cd10baf..20f7c6f90e 100644 --- a/internal/plans/planfile/tfplan.go +++ b/internal/plans/planfile/tfplan.go @@ -450,7 +450,7 @@ func deferredChangeFromTfplan(dc *planproto.DeferredResourceInstanceChange) (*pl return nil, err } - reason, err := deferredReasonFromProto(dc.Deferred.Reason) + reason, err := DeferredReasonFromProto(dc.Deferred.Reason) if err != nil { return nil, err } @@ -461,7 +461,7 @@ func deferredChangeFromTfplan(dc *planproto.DeferredResourceInstanceChange) (*pl }, nil } -func deferredReasonFromProto(reason planproto.DeferredReason) (providers.DeferredReason, error) { +func DeferredReasonFromProto(reason planproto.DeferredReason) (providers.DeferredReason, error) { switch reason { case planproto.DeferredReason_INSTANCE_COUNT_UNKNOWN: return providers.DeferredReasonInstanceCountUnknown, nil diff --git a/internal/rpcapi/terraform1/terraform1.pb.go b/internal/rpcapi/terraform1/terraform1.pb.go index de30a430bb..0ec1140232 100644 --- a/internal/rpcapi/terraform1/terraform1.pb.go +++ b/internal/rpcapi/terraform1/terraform1.pb.go @@ -285,6 +285,66 @@ func (FindStackConfigurationComponents_Instances) EnumDescriptor() ([]byte, []in return file_terraform1_proto_rawDescGZIP(), []int{23, 0} } +// Reason describes the reason why a resource instance change was +// deferred. +type Deferred_Reason int32 + +const ( + Deferred_INVALID Deferred_Reason = 0 + Deferred_INSTANCE_COUNT_UNKNOWN Deferred_Reason = 1 + Deferred_RESOURCE_CONFIG_UNKNOWN Deferred_Reason = 2 + Deferred_PROVIDER_CONFIG_UNKNOWN Deferred_Reason = 3 + Deferred_ABSENT_PREREQ Deferred_Reason = 4 + Deferred_DEFERRED_PREREQ Deferred_Reason = 5 +) + +// Enum value maps for Deferred_Reason. +var ( + Deferred_Reason_name = map[int32]string{ + 0: "INVALID", + 1: "INSTANCE_COUNT_UNKNOWN", + 2: "RESOURCE_CONFIG_UNKNOWN", + 3: "PROVIDER_CONFIG_UNKNOWN", + 4: "ABSENT_PREREQ", + 5: "DEFERRED_PREREQ", + } + Deferred_Reason_value = map[string]int32{ + "INVALID": 0, + "INSTANCE_COUNT_UNKNOWN": 1, + "RESOURCE_CONFIG_UNKNOWN": 2, + "PROVIDER_CONFIG_UNKNOWN": 3, + "ABSENT_PREREQ": 4, + "DEFERRED_PREREQ": 5, + } +) + +func (x Deferred_Reason) Enum() *Deferred_Reason { + p := new(Deferred_Reason) + *p = x + return p +} + +func (x Deferred_Reason) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Deferred_Reason) Descriptor() protoreflect.EnumDescriptor { + return file_terraform1_proto_enumTypes[5].Descriptor() +} + +func (Deferred_Reason) Type() protoreflect.EnumType { + return &file_terraform1_proto_enumTypes[5] +} + +func (x Deferred_Reason) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Deferred_Reason.Descriptor instead. +func (Deferred_Reason) EnumDescriptor() ([]byte, []int) { + return file_terraform1_proto_rawDescGZIP(), []int{37, 0} +} + type StackChangeProgress_ComponentInstanceStatus_Status int32 const ( @@ -330,11 +390,11 @@ func (x StackChangeProgress_ComponentInstanceStatus_Status) String() string { } func (StackChangeProgress_ComponentInstanceStatus_Status) Descriptor() protoreflect.EnumDescriptor { - return file_terraform1_proto_enumTypes[5].Descriptor() + return file_terraform1_proto_enumTypes[6].Descriptor() } func (StackChangeProgress_ComponentInstanceStatus_Status) Type() protoreflect.EnumType { - return &file_terraform1_proto_enumTypes[5] + return &file_terraform1_proto_enumTypes[6] } func (x StackChangeProgress_ComponentInstanceStatus_Status) Number() protoreflect.EnumNumber { @@ -343,7 +403,7 @@ func (x StackChangeProgress_ComponentInstanceStatus_Status) Number() protoreflec // Deprecated: Use StackChangeProgress_ComponentInstanceStatus_Status.Descriptor instead. func (StackChangeProgress_ComponentInstanceStatus_Status) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{38, 0, 0} + return file_terraform1_proto_rawDescGZIP(), []int{39, 0, 0} } type StackChangeProgress_ResourceInstanceStatus_Status int32 @@ -397,11 +457,11 @@ func (x StackChangeProgress_ResourceInstanceStatus_Status) String() string { } func (StackChangeProgress_ResourceInstanceStatus_Status) Descriptor() protoreflect.EnumDescriptor { - return file_terraform1_proto_enumTypes[6].Descriptor() + return file_terraform1_proto_enumTypes[7].Descriptor() } func (StackChangeProgress_ResourceInstanceStatus_Status) Type() protoreflect.EnumType { - return &file_terraform1_proto_enumTypes[6] + return &file_terraform1_proto_enumTypes[7] } func (x StackChangeProgress_ResourceInstanceStatus_Status) Number() protoreflect.EnumNumber { @@ -410,7 +470,7 @@ func (x StackChangeProgress_ResourceInstanceStatus_Status) Number() protoreflect // Deprecated: Use StackChangeProgress_ResourceInstanceStatus_Status.Descriptor instead. func (StackChangeProgress_ResourceInstanceStatus_Status) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{38, 1, 0} + return file_terraform1_proto_rawDescGZIP(), []int{39, 1, 0} } type StackChangeProgress_ProvisionerStatus_Status int32 @@ -449,11 +509,11 @@ func (x StackChangeProgress_ProvisionerStatus_Status) String() string { } func (StackChangeProgress_ProvisionerStatus_Status) Descriptor() protoreflect.EnumDescriptor { - return file_terraform1_proto_enumTypes[7].Descriptor() + return file_terraform1_proto_enumTypes[8].Descriptor() } func (StackChangeProgress_ProvisionerStatus_Status) Type() protoreflect.EnumType { - return &file_terraform1_proto_enumTypes[7] + return &file_terraform1_proto_enumTypes[8] } func (x StackChangeProgress_ProvisionerStatus_Status) Number() protoreflect.EnumNumber { @@ -462,7 +522,7 @@ func (x StackChangeProgress_ProvisionerStatus_Status) Number() protoreflect.Enum // Deprecated: Use StackChangeProgress_ProvisionerStatus_Status.Descriptor instead. func (StackChangeProgress_ProvisionerStatus_Status) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{38, 3, 0} + return file_terraform1_proto_rawDescGZIP(), []int{39, 4, 0} } type Diagnostic_Severity int32 @@ -498,11 +558,11 @@ func (x Diagnostic_Severity) String() string { } func (Diagnostic_Severity) Descriptor() protoreflect.EnumDescriptor { - return file_terraform1_proto_enumTypes[8].Descriptor() + return file_terraform1_proto_enumTypes[9].Descriptor() } func (Diagnostic_Severity) Type() protoreflect.EnumType { - return &file_terraform1_proto_enumTypes[8] + return &file_terraform1_proto_enumTypes[9] } func (x Diagnostic_Severity) Number() protoreflect.EnumNumber { @@ -511,7 +571,7 @@ func (x Diagnostic_Severity) Number() protoreflect.EnumNumber { // Deprecated: Use Diagnostic_Severity.Descriptor instead. func (Diagnostic_Severity) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{39, 0} + return file_terraform1_proto_rawDescGZIP(), []int{40, 0} } type Schema_NestedBlock_NestingMode int32 @@ -556,11 +616,11 @@ func (x Schema_NestedBlock_NestingMode) String() string { } func (Schema_NestedBlock_NestingMode) Descriptor() protoreflect.EnumDescriptor { - return file_terraform1_proto_enumTypes[9].Descriptor() + return file_terraform1_proto_enumTypes[10].Descriptor() } func (Schema_NestedBlock_NestingMode) Type() protoreflect.EnumType { - return &file_terraform1_proto_enumTypes[9] + return &file_terraform1_proto_enumTypes[10] } func (x Schema_NestedBlock_NestingMode) Number() protoreflect.EnumNumber { @@ -569,7 +629,7 @@ func (x Schema_NestedBlock_NestingMode) Number() protoreflect.EnumNumber { // Deprecated: Use Schema_NestedBlock_NestingMode.Descriptor instead. func (Schema_NestedBlock_NestingMode) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{42, 2, 0} + return file_terraform1_proto_rawDescGZIP(), []int{43, 2, 0} } type Schema_Object_NestingMode int32 @@ -611,11 +671,11 @@ func (x Schema_Object_NestingMode) String() string { } func (Schema_Object_NestingMode) Descriptor() protoreflect.EnumDescriptor { - return file_terraform1_proto_enumTypes[10].Descriptor() + return file_terraform1_proto_enumTypes[11].Descriptor() } func (Schema_Object_NestingMode) Type() protoreflect.EnumType { - return &file_terraform1_proto_enumTypes[10] + return &file_terraform1_proto_enumTypes[11] } func (x Schema_Object_NestingMode) Number() protoreflect.EnumNumber { @@ -624,7 +684,7 @@ func (x Schema_Object_NestingMode) Number() protoreflect.EnumNumber { // Deprecated: Use Schema_Object_NestingMode.Descriptor instead. func (Schema_Object_NestingMode) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{42, 3, 0} + return file_terraform1_proto_rawDescGZIP(), []int{43, 3, 0} } type Schema_DocString_Format int32 @@ -657,11 +717,11 @@ func (x Schema_DocString_Format) String() string { } func (Schema_DocString_Format) Descriptor() protoreflect.EnumDescriptor { - return file_terraform1_proto_enumTypes[11].Descriptor() + return file_terraform1_proto_enumTypes[12].Descriptor() } func (Schema_DocString_Format) Type() protoreflect.EnumType { - return &file_terraform1_proto_enumTypes[11] + return &file_terraform1_proto_enumTypes[12] } func (x Schema_DocString_Format) Number() protoreflect.EnumNumber { @@ -670,7 +730,7 @@ func (x Schema_DocString_Format) Number() protoreflect.EnumNumber { // Deprecated: Use Schema_DocString_Format.Descriptor instead. func (Schema_DocString_Format) EnumDescriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{42, 4, 0} + return file_terraform1_proto_rawDescGZIP(), []int{43, 4, 0} } type Handshake struct { @@ -2410,6 +2470,55 @@ func (x *PlannedChange) GetDescriptions() []*PlannedChange_ChangeDescription { return nil } +// Deferred contains all the metadata about a the deferral of a resource +// instance change. +type Deferred struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Reason Deferred_Reason `protobuf:"varint,1,opt,name=reason,proto3,enum=terraform1.Deferred_Reason" json:"reason,omitempty"` +} + +func (x *Deferred) Reset() { + *x = Deferred{} + if protoimpl.UnsafeEnabled { + mi := &file_terraform1_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Deferred) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Deferred) ProtoMessage() {} + +func (x *Deferred) ProtoReflect() protoreflect.Message { + mi := &file_terraform1_proto_msgTypes[37] + 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 Deferred.ProtoReflect.Descriptor instead. +func (*Deferred) Descriptor() ([]byte, []int) { + return file_terraform1_proto_rawDescGZIP(), []int{37} +} + +func (x *Deferred) GetReason() Deferred_Reason { + if x != nil { + return x.Reason + } + return Deferred_INVALID +} + // Describes a change made during a Stacks.ApplyStackChanges call. // // All of the events of this type taken together represent a sort of "patch" @@ -2484,7 +2593,7 @@ type AppliedChange struct { func (x *AppliedChange) Reset() { *x = AppliedChange{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[37] + mi := &file_terraform1_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2497,7 +2606,7 @@ func (x *AppliedChange) String() string { func (*AppliedChange) ProtoMessage() {} func (x *AppliedChange) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[37] + mi := &file_terraform1_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2510,7 +2619,7 @@ func (x *AppliedChange) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange.ProtoReflect.Descriptor instead. func (*AppliedChange) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37} + return file_terraform1_proto_rawDescGZIP(), []int{38} } func (x *AppliedChange) GetRaw() []*AppliedChange_RawChange { @@ -2548,13 +2657,14 @@ type StackChangeProgress struct { // *StackChangeProgress_ProvisionerOutput_ // *StackChangeProgress_ComponentInstanceChanges_ // *StackChangeProgress_ComponentInstances_ + // *StackChangeProgress_DeferredResourceInstancePlannedChange_ Event isStackChangeProgress_Event `protobuf_oneof:"event"` } func (x *StackChangeProgress) Reset() { *x = StackChangeProgress{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[38] + mi := &file_terraform1_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2567,7 +2677,7 @@ func (x *StackChangeProgress) String() string { func (*StackChangeProgress) ProtoMessage() {} func (x *StackChangeProgress) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[38] + mi := &file_terraform1_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2580,7 +2690,7 @@ func (x *StackChangeProgress) ProtoReflect() protoreflect.Message { // Deprecated: Use StackChangeProgress.ProtoReflect.Descriptor instead. func (*StackChangeProgress) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{38} + return file_terraform1_proto_rawDescGZIP(), []int{39} } func (m *StackChangeProgress) GetEvent() isStackChangeProgress_Event { @@ -2639,6 +2749,13 @@ func (x *StackChangeProgress) GetComponentInstances() *StackChangeProgress_Compo return nil } +func (x *StackChangeProgress) GetDeferredResourceInstancePlannedChange() *StackChangeProgress_DeferredResourceInstancePlannedChange { + if x, ok := x.GetEvent().(*StackChangeProgress_DeferredResourceInstancePlannedChange_); ok { + return x.DeferredResourceInstancePlannedChange + } + return nil +} + type isStackChangeProgress_Event interface { isStackChangeProgress_Event() } @@ -2671,6 +2788,10 @@ type StackChangeProgress_ComponentInstances_ struct { ComponentInstances *StackChangeProgress_ComponentInstances `protobuf:"bytes,7,opt,name=component_instances,json=componentInstances,proto3,oneof"` } +type StackChangeProgress_DeferredResourceInstancePlannedChange_ struct { + DeferredResourceInstancePlannedChange *StackChangeProgress_DeferredResourceInstancePlannedChange `protobuf:"bytes,8,opt,name=deferred_resource_instance_planned_change,json=deferredResourceInstancePlannedChange,proto3,oneof"` +} + func (*StackChangeProgress_ComponentInstanceStatus_) isStackChangeProgress_Event() {} func (*StackChangeProgress_ResourceInstanceStatus_) isStackChangeProgress_Event() {} @@ -2685,6 +2806,8 @@ func (*StackChangeProgress_ComponentInstanceChanges_) isStackChangeProgress_Even func (*StackChangeProgress_ComponentInstances_) isStackChangeProgress_Event() {} +func (*StackChangeProgress_DeferredResourceInstancePlannedChange_) isStackChangeProgress_Event() {} + type Diagnostic struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2700,7 +2823,7 @@ type Diagnostic struct { func (x *Diagnostic) Reset() { *x = Diagnostic{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[39] + mi := &file_terraform1_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2713,7 +2836,7 @@ func (x *Diagnostic) String() string { func (*Diagnostic) ProtoMessage() {} func (x *Diagnostic) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[39] + mi := &file_terraform1_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2726,7 +2849,7 @@ func (x *Diagnostic) ProtoReflect() protoreflect.Message { // Deprecated: Use Diagnostic.ProtoReflect.Descriptor instead. func (*Diagnostic) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{39} + return file_terraform1_proto_rawDescGZIP(), []int{40} } func (x *Diagnostic) GetSeverity() Diagnostic_Severity { @@ -2777,7 +2900,7 @@ type SourceRange struct { func (x *SourceRange) Reset() { *x = SourceRange{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[40] + mi := &file_terraform1_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2790,7 +2913,7 @@ func (x *SourceRange) String() string { func (*SourceRange) ProtoMessage() {} func (x *SourceRange) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[40] + mi := &file_terraform1_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2803,7 +2926,7 @@ func (x *SourceRange) ProtoReflect() protoreflect.Message { // Deprecated: Use SourceRange.ProtoReflect.Descriptor instead. func (*SourceRange) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{40} + return file_terraform1_proto_rawDescGZIP(), []int{41} } func (x *SourceRange) GetSourceAddr() string { @@ -2840,7 +2963,7 @@ type SourcePos struct { func (x *SourcePos) Reset() { *x = SourcePos{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[41] + mi := &file_terraform1_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2853,7 +2976,7 @@ func (x *SourcePos) String() string { func (*SourcePos) ProtoMessage() {} func (x *SourcePos) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[41] + mi := &file_terraform1_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2866,7 +2989,7 @@ func (x *SourcePos) ProtoReflect() protoreflect.Message { // Deprecated: Use SourcePos.ProtoReflect.Descriptor instead. func (*SourcePos) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{41} + return file_terraform1_proto_rawDescGZIP(), []int{42} } func (x *SourcePos) GetByte() int64 { @@ -2904,7 +3027,7 @@ type Schema struct { func (x *Schema) Reset() { *x = Schema{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[42] + mi := &file_terraform1_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2917,7 +3040,7 @@ func (x *Schema) String() string { func (*Schema) ProtoMessage() {} func (x *Schema) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[42] + mi := &file_terraform1_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2930,7 +3053,7 @@ func (x *Schema) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema.ProtoReflect.Descriptor instead. func (*Schema) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{42} + return file_terraform1_proto_rawDescGZIP(), []int{43} } func (x *Schema) GetBlock() *Schema_Block { @@ -2949,7 +3072,7 @@ type ProviderPackageVersions struct { func (x *ProviderPackageVersions) Reset() { *x = ProviderPackageVersions{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[43] + mi := &file_terraform1_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2962,7 +3085,7 @@ func (x *ProviderPackageVersions) String() string { func (*ProviderPackageVersions) ProtoMessage() {} func (x *ProviderPackageVersions) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[43] + mi := &file_terraform1_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2975,7 +3098,7 @@ func (x *ProviderPackageVersions) ProtoReflect() protoreflect.Message { // Deprecated: Use ProviderPackageVersions.ProtoReflect.Descriptor instead. func (*ProviderPackageVersions) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{43} + return file_terraform1_proto_rawDescGZIP(), []int{44} } type FetchProviderPackage struct { @@ -2987,7 +3110,7 @@ type FetchProviderPackage struct { func (x *FetchProviderPackage) Reset() { *x = FetchProviderPackage{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[44] + mi := &file_terraform1_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3000,7 +3123,7 @@ func (x *FetchProviderPackage) String() string { func (*FetchProviderPackage) ProtoMessage() {} func (x *FetchProviderPackage) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[44] + mi := &file_terraform1_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3013,7 +3136,7 @@ func (x *FetchProviderPackage) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchProviderPackage.ProtoReflect.Descriptor instead. func (*FetchProviderPackage) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{44} + return file_terraform1_proto_rawDescGZIP(), []int{45} } type ModulePackageVersions struct { @@ -3025,7 +3148,7 @@ type ModulePackageVersions struct { func (x *ModulePackageVersions) Reset() { *x = ModulePackageVersions{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[45] + mi := &file_terraform1_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3038,7 +3161,7 @@ func (x *ModulePackageVersions) String() string { func (*ModulePackageVersions) ProtoMessage() {} func (x *ModulePackageVersions) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[45] + mi := &file_terraform1_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3051,7 +3174,7 @@ func (x *ModulePackageVersions) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageVersions.ProtoReflect.Descriptor instead. func (*ModulePackageVersions) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{45} + return file_terraform1_proto_rawDescGZIP(), []int{46} } type ModulePackageSourceAddr struct { @@ -3063,7 +3186,7 @@ type ModulePackageSourceAddr struct { func (x *ModulePackageSourceAddr) Reset() { *x = ModulePackageSourceAddr{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[46] + mi := &file_terraform1_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3076,7 +3199,7 @@ func (x *ModulePackageSourceAddr) String() string { func (*ModulePackageSourceAddr) ProtoMessage() {} func (x *ModulePackageSourceAddr) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[46] + mi := &file_terraform1_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3089,7 +3212,7 @@ func (x *ModulePackageSourceAddr) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageSourceAddr.ProtoReflect.Descriptor instead. func (*ModulePackageSourceAddr) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{46} + return file_terraform1_proto_rawDescGZIP(), []int{47} } type FetchModulePackage struct { @@ -3101,7 +3224,7 @@ type FetchModulePackage struct { func (x *FetchModulePackage) Reset() { *x = FetchModulePackage{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[47] + mi := &file_terraform1_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3114,7 +3237,7 @@ func (x *FetchModulePackage) String() string { func (*FetchModulePackage) ProtoMessage() {} func (x *FetchModulePackage) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[47] + mi := &file_terraform1_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3127,7 +3250,7 @@ func (x *FetchModulePackage) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchModulePackage.ProtoReflect.Descriptor instead. func (*FetchModulePackage) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{47} + return file_terraform1_proto_rawDescGZIP(), []int{48} } type Handshake_Request struct { @@ -3142,7 +3265,7 @@ type Handshake_Request struct { func (x *Handshake_Request) Reset() { *x = Handshake_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[48] + mi := &file_terraform1_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3155,7 +3278,7 @@ func (x *Handshake_Request) String() string { func (*Handshake_Request) ProtoMessage() {} func (x *Handshake_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[48] + mi := &file_terraform1_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3196,7 +3319,7 @@ type Handshake_Response struct { func (x *Handshake_Response) Reset() { *x = Handshake_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[49] + mi := &file_terraform1_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3209,7 +3332,7 @@ func (x *Handshake_Response) String() string { func (*Handshake_Response) ProtoMessage() {} func (x *Handshake_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[49] + mi := &file_terraform1_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3241,7 +3364,7 @@ type Stop_Request struct { func (x *Stop_Request) Reset() { *x = Stop_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[50] + mi := &file_terraform1_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3254,7 +3377,7 @@ func (x *Stop_Request) String() string { func (*Stop_Request) ProtoMessage() {} func (x *Stop_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[50] + mi := &file_terraform1_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3279,7 +3402,7 @@ type Stop_Response struct { func (x *Stop_Response) Reset() { *x = Stop_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[51] + mi := &file_terraform1_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3292,7 +3415,7 @@ func (x *Stop_Response) String() string { func (*Stop_Response) ProtoMessage() {} func (x *Stop_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[51] + mi := &file_terraform1_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3319,7 +3442,7 @@ type OpenSourceBundle_Request struct { func (x *OpenSourceBundle_Request) Reset() { *x = OpenSourceBundle_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[53] + mi := &file_terraform1_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3332,7 +3455,7 @@ func (x *OpenSourceBundle_Request) String() string { func (*OpenSourceBundle_Request) ProtoMessage() {} func (x *OpenSourceBundle_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[53] + mi := &file_terraform1_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3366,7 +3489,7 @@ type OpenSourceBundle_Response struct { func (x *OpenSourceBundle_Response) Reset() { *x = OpenSourceBundle_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[54] + mi := &file_terraform1_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3379,7 +3502,7 @@ func (x *OpenSourceBundle_Response) String() string { func (*OpenSourceBundle_Response) ProtoMessage() {} func (x *OpenSourceBundle_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[54] + mi := &file_terraform1_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3413,7 +3536,7 @@ type CloseSourceBundle_Request struct { func (x *CloseSourceBundle_Request) Reset() { *x = CloseSourceBundle_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[55] + mi := &file_terraform1_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3426,7 +3549,7 @@ func (x *CloseSourceBundle_Request) String() string { func (*CloseSourceBundle_Request) ProtoMessage() {} func (x *CloseSourceBundle_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[55] + mi := &file_terraform1_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3458,7 +3581,7 @@ type CloseSourceBundle_Response struct { func (x *CloseSourceBundle_Response) Reset() { *x = CloseSourceBundle_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[56] + mi := &file_terraform1_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3471,7 +3594,7 @@ func (x *CloseSourceBundle_Response) String() string { func (*CloseSourceBundle_Response) ProtoMessage() {} func (x *CloseSourceBundle_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[56] + mi := &file_terraform1_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3499,7 +3622,7 @@ type OpenDependencyLockFile_Request struct { func (x *OpenDependencyLockFile_Request) Reset() { *x = OpenDependencyLockFile_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[57] + mi := &file_terraform1_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3512,7 +3635,7 @@ func (x *OpenDependencyLockFile_Request) String() string { func (*OpenDependencyLockFile_Request) ProtoMessage() {} func (x *OpenDependencyLockFile_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[57] + mi := &file_terraform1_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3554,7 +3677,7 @@ type OpenDependencyLockFile_Response struct { func (x *OpenDependencyLockFile_Response) Reset() { *x = OpenDependencyLockFile_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[58] + mi := &file_terraform1_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3567,7 +3690,7 @@ func (x *OpenDependencyLockFile_Response) String() string { func (*OpenDependencyLockFile_Response) ProtoMessage() {} func (x *OpenDependencyLockFile_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[58] + mi := &file_terraform1_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3614,7 +3737,7 @@ type CreateDependencyLocks_Request struct { func (x *CreateDependencyLocks_Request) Reset() { *x = CreateDependencyLocks_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[59] + mi := &file_terraform1_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3627,7 +3750,7 @@ func (x *CreateDependencyLocks_Request) String() string { func (*CreateDependencyLocks_Request) ProtoMessage() {} func (x *CreateDependencyLocks_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[59] + mi := &file_terraform1_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3661,7 +3784,7 @@ type CreateDependencyLocks_Response struct { func (x *CreateDependencyLocks_Response) Reset() { *x = CreateDependencyLocks_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[60] + mi := &file_terraform1_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3674,7 +3797,7 @@ func (x *CreateDependencyLocks_Response) String() string { func (*CreateDependencyLocks_Response) ProtoMessage() {} func (x *CreateDependencyLocks_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[60] + mi := &file_terraform1_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3708,7 +3831,7 @@ type CloseDependencyLocks_Request struct { func (x *CloseDependencyLocks_Request) Reset() { *x = CloseDependencyLocks_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[61] + mi := &file_terraform1_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3721,7 +3844,7 @@ func (x *CloseDependencyLocks_Request) String() string { func (*CloseDependencyLocks_Request) ProtoMessage() {} func (x *CloseDependencyLocks_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[61] + mi := &file_terraform1_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3753,7 +3876,7 @@ type CloseDependencyLocks_Response struct { func (x *CloseDependencyLocks_Response) Reset() { *x = CloseDependencyLocks_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[62] + mi := &file_terraform1_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3766,7 +3889,7 @@ func (x *CloseDependencyLocks_Response) String() string { func (*CloseDependencyLocks_Response) ProtoMessage() {} func (x *CloseDependencyLocks_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[62] + mi := &file_terraform1_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3793,7 +3916,7 @@ type GetLockedProviderDependencies_Request struct { func (x *GetLockedProviderDependencies_Request) Reset() { *x = GetLockedProviderDependencies_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[63] + mi := &file_terraform1_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3806,7 +3929,7 @@ func (x *GetLockedProviderDependencies_Request) String() string { func (*GetLockedProviderDependencies_Request) ProtoMessage() {} func (x *GetLockedProviderDependencies_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[63] + mi := &file_terraform1_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3840,7 +3963,7 @@ type GetLockedProviderDependencies_Response struct { func (x *GetLockedProviderDependencies_Response) Reset() { *x = GetLockedProviderDependencies_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[64] + mi := &file_terraform1_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3853,7 +3976,7 @@ func (x *GetLockedProviderDependencies_Response) String() string { func (*GetLockedProviderDependencies_Response) ProtoMessage() {} func (x *GetLockedProviderDependencies_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[64] + mi := &file_terraform1_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3898,7 +4021,7 @@ type BuildProviderPluginCache_Request struct { func (x *BuildProviderPluginCache_Request) Reset() { *x = BuildProviderPluginCache_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[65] + mi := &file_terraform1_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3911,7 +4034,7 @@ func (x *BuildProviderPluginCache_Request) String() string { func (*BuildProviderPluginCache_Request) ProtoMessage() {} func (x *BuildProviderPluginCache_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[65] + mi := &file_terraform1_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3977,7 +4100,7 @@ type BuildProviderPluginCache_Event struct { func (x *BuildProviderPluginCache_Event) Reset() { *x = BuildProviderPluginCache_Event{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[66] + mi := &file_terraform1_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3990,7 +4113,7 @@ func (x *BuildProviderPluginCache_Event) String() string { func (*BuildProviderPluginCache_Event) ProtoMessage() {} func (x *BuildProviderPluginCache_Event) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[66] + mi := &file_terraform1_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4152,7 +4275,7 @@ type BuildProviderPluginCache_Request_InstallMethod struct { func (x *BuildProviderPluginCache_Request_InstallMethod) Reset() { *x = BuildProviderPluginCache_Request_InstallMethod{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[67] + mi := &file_terraform1_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4165,7 +4288,7 @@ func (x *BuildProviderPluginCache_Request_InstallMethod) String() string { func (*BuildProviderPluginCache_Request_InstallMethod) ProtoMessage() {} func (x *BuildProviderPluginCache_Request_InstallMethod) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[67] + mi := &file_terraform1_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4259,7 +4382,7 @@ type BuildProviderPluginCache_Event_Pending struct { func (x *BuildProviderPluginCache_Event_Pending) Reset() { *x = BuildProviderPluginCache_Event_Pending{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[68] + mi := &file_terraform1_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4272,7 +4395,7 @@ func (x *BuildProviderPluginCache_Event_Pending) String() string { func (*BuildProviderPluginCache_Event_Pending) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_Pending) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[68] + mi := &file_terraform1_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4307,7 +4430,7 @@ type BuildProviderPluginCache_Event_ProviderConstraints struct { func (x *BuildProviderPluginCache_Event_ProviderConstraints) Reset() { *x = BuildProviderPluginCache_Event_ProviderConstraints{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[69] + mi := &file_terraform1_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4320,7 +4443,7 @@ func (x *BuildProviderPluginCache_Event_ProviderConstraints) String() string { func (*BuildProviderPluginCache_Event_ProviderConstraints) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_ProviderConstraints) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[69] + mi := &file_terraform1_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4362,7 +4485,7 @@ type BuildProviderPluginCache_Event_ProviderVersion struct { func (x *BuildProviderPluginCache_Event_ProviderVersion) Reset() { *x = BuildProviderPluginCache_Event_ProviderVersion{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[70] + mi := &file_terraform1_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4375,7 +4498,7 @@ func (x *BuildProviderPluginCache_Event_ProviderVersion) String() string { func (*BuildProviderPluginCache_Event_ProviderVersion) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_ProviderVersion) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[70] + mi := &file_terraform1_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4417,7 +4540,7 @@ type BuildProviderPluginCache_Event_ProviderWarnings struct { func (x *BuildProviderPluginCache_Event_ProviderWarnings) Reset() { *x = BuildProviderPluginCache_Event_ProviderWarnings{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[71] + mi := &file_terraform1_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4430,7 +4553,7 @@ func (x *BuildProviderPluginCache_Event_ProviderWarnings) String() string { func (*BuildProviderPluginCache_Event_ProviderWarnings) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_ProviderWarnings) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[71] + mi := &file_terraform1_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4472,7 +4595,7 @@ type BuildProviderPluginCache_Event_FetchBegin struct { func (x *BuildProviderPluginCache_Event_FetchBegin) Reset() { *x = BuildProviderPluginCache_Event_FetchBegin{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[72] + mi := &file_terraform1_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4485,7 +4608,7 @@ func (x *BuildProviderPluginCache_Event_FetchBegin) String() string { func (*BuildProviderPluginCache_Event_FetchBegin) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_FetchBegin) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[72] + mi := &file_terraform1_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4533,7 +4656,7 @@ type BuildProviderPluginCache_Event_FetchComplete struct { func (x *BuildProviderPluginCache_Event_FetchComplete) Reset() { *x = BuildProviderPluginCache_Event_FetchComplete{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[73] + mi := &file_terraform1_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4546,7 +4669,7 @@ func (x *BuildProviderPluginCache_Event_FetchComplete) String() string { func (*BuildProviderPluginCache_Event_FetchComplete) ProtoMessage() {} func (x *BuildProviderPluginCache_Event_FetchComplete) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[73] + mi := &file_terraform1_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4603,7 +4726,7 @@ type OpenProviderPluginCache_Request struct { func (x *OpenProviderPluginCache_Request) Reset() { *x = OpenProviderPluginCache_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[74] + mi := &file_terraform1_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4616,7 +4739,7 @@ func (x *OpenProviderPluginCache_Request) String() string { func (*OpenProviderPluginCache_Request) ProtoMessage() {} func (x *OpenProviderPluginCache_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[74] + mi := &file_terraform1_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4657,7 +4780,7 @@ type OpenProviderPluginCache_Response struct { func (x *OpenProviderPluginCache_Response) Reset() { *x = OpenProviderPluginCache_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[75] + mi := &file_terraform1_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4670,7 +4793,7 @@ func (x *OpenProviderPluginCache_Response) String() string { func (*OpenProviderPluginCache_Response) ProtoMessage() {} func (x *OpenProviderPluginCache_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[75] + mi := &file_terraform1_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4704,7 +4827,7 @@ type CloseProviderPluginCache_Request struct { func (x *CloseProviderPluginCache_Request) Reset() { *x = CloseProviderPluginCache_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[76] + mi := &file_terraform1_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4717,7 +4840,7 @@ func (x *CloseProviderPluginCache_Request) String() string { func (*CloseProviderPluginCache_Request) ProtoMessage() {} func (x *CloseProviderPluginCache_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[76] + mi := &file_terraform1_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4749,7 +4872,7 @@ type CloseProviderPluginCache_Response struct { func (x *CloseProviderPluginCache_Response) Reset() { *x = CloseProviderPluginCache_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[77] + mi := &file_terraform1_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4762,7 +4885,7 @@ func (x *CloseProviderPluginCache_Response) String() string { func (*CloseProviderPluginCache_Response) ProtoMessage() {} func (x *CloseProviderPluginCache_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[77] + mi := &file_terraform1_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4789,7 +4912,7 @@ type GetCachedProviders_Request struct { func (x *GetCachedProviders_Request) Reset() { *x = GetCachedProviders_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[78] + mi := &file_terraform1_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4802,7 +4925,7 @@ func (x *GetCachedProviders_Request) String() string { func (*GetCachedProviders_Request) ProtoMessage() {} func (x *GetCachedProviders_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[78] + mi := &file_terraform1_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4836,7 +4959,7 @@ type GetCachedProviders_Response struct { func (x *GetCachedProviders_Response) Reset() { *x = GetCachedProviders_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[79] + mi := &file_terraform1_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4849,7 +4972,7 @@ func (x *GetCachedProviders_Response) String() string { func (*GetCachedProviders_Response) ProtoMessage() {} func (x *GetCachedProviders_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[79] + mi := &file_terraform1_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4881,7 +5004,7 @@ type GetBuiltInProviders_Request struct { func (x *GetBuiltInProviders_Request) Reset() { *x = GetBuiltInProviders_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[80] + mi := &file_terraform1_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4894,7 +5017,7 @@ func (x *GetBuiltInProviders_Request) String() string { func (*GetBuiltInProviders_Request) ProtoMessage() {} func (x *GetBuiltInProviders_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[80] + mi := &file_terraform1_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4928,7 +5051,7 @@ type GetBuiltInProviders_Response struct { func (x *GetBuiltInProviders_Response) Reset() { *x = GetBuiltInProviders_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[81] + mi := &file_terraform1_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4941,7 +5064,7 @@ func (x *GetBuiltInProviders_Response) String() string { func (*GetBuiltInProviders_Response) ProtoMessage() {} func (x *GetBuiltInProviders_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[81] + mi := &file_terraform1_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4998,7 +5121,7 @@ type GetProviderSchema_Request struct { func (x *GetProviderSchema_Request) Reset() { *x = GetProviderSchema_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[82] + mi := &file_terraform1_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5011,7 +5134,7 @@ func (x *GetProviderSchema_Request) String() string { func (*GetProviderSchema_Request) ProtoMessage() {} func (x *GetProviderSchema_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[82] + mi := &file_terraform1_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5059,7 +5182,7 @@ type GetProviderSchema_Response struct { func (x *GetProviderSchema_Response) Reset() { *x = GetProviderSchema_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[83] + mi := &file_terraform1_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5072,7 +5195,7 @@ func (x *GetProviderSchema_Response) String() string { func (*GetProviderSchema_Response) ProtoMessage() {} func (x *GetProviderSchema_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[83] + mi := &file_terraform1_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5107,7 +5230,7 @@ type OpenStackConfiguration_Request struct { func (x *OpenStackConfiguration_Request) Reset() { *x = OpenStackConfiguration_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[86] + mi := &file_terraform1_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5120,7 +5243,7 @@ func (x *OpenStackConfiguration_Request) String() string { func (*OpenStackConfiguration_Request) ProtoMessage() {} func (x *OpenStackConfiguration_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[86] + mi := &file_terraform1_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5162,7 +5285,7 @@ type OpenStackConfiguration_Response struct { func (x *OpenStackConfiguration_Response) Reset() { *x = OpenStackConfiguration_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[87] + mi := &file_terraform1_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5175,7 +5298,7 @@ func (x *OpenStackConfiguration_Response) String() string { func (*OpenStackConfiguration_Response) ProtoMessage() {} func (x *OpenStackConfiguration_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[87] + mi := &file_terraform1_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5216,7 +5339,7 @@ type CloseStackConfiguration_Request struct { func (x *CloseStackConfiguration_Request) Reset() { *x = CloseStackConfiguration_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[88] + mi := &file_terraform1_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5229,7 +5352,7 @@ func (x *CloseStackConfiguration_Request) String() string { func (*CloseStackConfiguration_Request) ProtoMessage() {} func (x *CloseStackConfiguration_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[88] + mi := &file_terraform1_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5261,7 +5384,7 @@ type CloseStackConfiguration_Response struct { func (x *CloseStackConfiguration_Response) Reset() { *x = CloseStackConfiguration_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[89] + mi := &file_terraform1_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5274,7 +5397,7 @@ func (x *CloseStackConfiguration_Response) String() string { func (*CloseStackConfiguration_Response) ProtoMessage() {} func (x *CloseStackConfiguration_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[89] + mi := &file_terraform1_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5303,7 +5426,7 @@ type ValidateStackConfiguration_Request struct { func (x *ValidateStackConfiguration_Request) Reset() { *x = ValidateStackConfiguration_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[90] + mi := &file_terraform1_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5316,7 +5439,7 @@ func (x *ValidateStackConfiguration_Request) String() string { func (*ValidateStackConfiguration_Request) ProtoMessage() {} func (x *ValidateStackConfiguration_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[90] + mi := &file_terraform1_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5364,7 +5487,7 @@ type ValidateStackConfiguration_Response struct { func (x *ValidateStackConfiguration_Response) Reset() { *x = ValidateStackConfiguration_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[91] + mi := &file_terraform1_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5377,7 +5500,7 @@ func (x *ValidateStackConfiguration_Response) String() string { func (*ValidateStackConfiguration_Response) ProtoMessage() {} func (x *ValidateStackConfiguration_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[91] + mi := &file_terraform1_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5411,7 +5534,7 @@ type FindStackConfigurationComponents_Request struct { func (x *FindStackConfigurationComponents_Request) Reset() { *x = FindStackConfigurationComponents_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[92] + mi := &file_terraform1_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5424,7 +5547,7 @@ func (x *FindStackConfigurationComponents_Request) String() string { func (*FindStackConfigurationComponents_Request) ProtoMessage() {} func (x *FindStackConfigurationComponents_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[92] + mi := &file_terraform1_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5458,7 +5581,7 @@ type FindStackConfigurationComponents_Response struct { func (x *FindStackConfigurationComponents_Response) Reset() { *x = FindStackConfigurationComponents_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[93] + mi := &file_terraform1_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5471,7 +5594,7 @@ func (x *FindStackConfigurationComponents_Response) String() string { func (*FindStackConfigurationComponents_Response) ProtoMessage() {} func (x *FindStackConfigurationComponents_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[93] + mi := &file_terraform1_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5506,7 +5629,7 @@ type FindStackConfigurationComponents_StackConfig struct { func (x *FindStackConfigurationComponents_StackConfig) Reset() { *x = FindStackConfigurationComponents_StackConfig{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[94] + mi := &file_terraform1_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5519,7 +5642,7 @@ func (x *FindStackConfigurationComponents_StackConfig) String() string { func (*FindStackConfigurationComponents_StackConfig) ProtoMessage() {} func (x *FindStackConfigurationComponents_StackConfig) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[94] + mi := &file_terraform1_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5562,7 +5685,7 @@ type FindStackConfigurationComponents_EmbeddedStack struct { func (x *FindStackConfigurationComponents_EmbeddedStack) Reset() { *x = FindStackConfigurationComponents_EmbeddedStack{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[95] + mi := &file_terraform1_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5575,7 +5698,7 @@ func (x *FindStackConfigurationComponents_EmbeddedStack) String() string { func (*FindStackConfigurationComponents_EmbeddedStack) ProtoMessage() {} func (x *FindStackConfigurationComponents_EmbeddedStack) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[95] + mi := &file_terraform1_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5625,7 +5748,7 @@ type FindStackConfigurationComponents_Component struct { func (x *FindStackConfigurationComponents_Component) Reset() { *x = FindStackConfigurationComponents_Component{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[96] + mi := &file_terraform1_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5638,7 +5761,7 @@ func (x *FindStackConfigurationComponents_Component) String() string { func (*FindStackConfigurationComponents_Component) ProtoMessage() {} func (x *FindStackConfigurationComponents_Component) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[96] + mi := &file_terraform1_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5691,7 +5814,7 @@ type PlanStackChanges_Request struct { func (x *PlanStackChanges_Request) Reset() { *x = PlanStackChanges_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[99] + mi := &file_terraform1_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5704,7 +5827,7 @@ func (x *PlanStackChanges_Request) String() string { func (*PlanStackChanges_Request) ProtoMessage() {} func (x *PlanStackChanges_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[99] + mi := &file_terraform1_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5778,7 +5901,7 @@ type PlanStackChanges_Event struct { func (x *PlanStackChanges_Event) Reset() { *x = PlanStackChanges_Event{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[100] + mi := &file_terraform1_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5791,7 +5914,7 @@ func (x *PlanStackChanges_Event) String() string { func (*PlanStackChanges_Event) ProtoMessage() {} func (x *PlanStackChanges_Event) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[100] + mi := &file_terraform1_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5888,7 +6011,7 @@ type ApplyStackChanges_Request struct { func (x *ApplyStackChanges_Request) Reset() { *x = ApplyStackChanges_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[103] + mi := &file_terraform1_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5901,7 +6024,7 @@ func (x *ApplyStackChanges_Request) String() string { func (*ApplyStackChanges_Request) ProtoMessage() {} func (x *ApplyStackChanges_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[103] + mi := &file_terraform1_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5968,7 +6091,7 @@ type ApplyStackChanges_Event struct { func (x *ApplyStackChanges_Event) Reset() { *x = ApplyStackChanges_Event{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[104] + mi := &file_terraform1_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5981,7 +6104,7 @@ func (x *ApplyStackChanges_Event) String() string { func (*ApplyStackChanges_Event) ProtoMessage() {} func (x *ApplyStackChanges_Event) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[104] + mi := &file_terraform1_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6062,7 +6185,7 @@ type OpenStackInspector_Request struct { func (x *OpenStackInspector_Request) Reset() { *x = OpenStackInspector_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[105] + mi := &file_terraform1_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6075,7 +6198,7 @@ func (x *OpenStackInspector_Request) String() string { func (*OpenStackInspector_Request) ProtoMessage() {} func (x *OpenStackInspector_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[105] + mi := &file_terraform1_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6138,7 +6261,7 @@ type OpenStackInspector_Response struct { func (x *OpenStackInspector_Response) Reset() { *x = OpenStackInspector_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[106] + mi := &file_terraform1_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6151,7 +6274,7 @@ func (x *OpenStackInspector_Response) String() string { func (*OpenStackInspector_Response) ProtoMessage() {} func (x *OpenStackInspector_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[106] + mi := &file_terraform1_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6194,7 +6317,7 @@ type InspectExpressionResult_Request struct { func (x *InspectExpressionResult_Request) Reset() { *x = InspectExpressionResult_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[109] + mi := &file_terraform1_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6207,7 +6330,7 @@ func (x *InspectExpressionResult_Request) String() string { func (*InspectExpressionResult_Request) ProtoMessage() {} func (x *InspectExpressionResult_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[109] + mi := &file_terraform1_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6262,7 +6385,7 @@ type InspectExpressionResult_Response struct { func (x *InspectExpressionResult_Response) Reset() { *x = InspectExpressionResult_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[110] + mi := &file_terraform1_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6275,7 +6398,7 @@ func (x *InspectExpressionResult_Response) String() string { func (*InspectExpressionResult_Response) ProtoMessage() {} func (x *InspectExpressionResult_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[110] + mi := &file_terraform1_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6321,7 +6444,7 @@ type AttributePath_Step struct { func (x *AttributePath_Step) Reset() { *x = AttributePath_Step{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[111] + mi := &file_terraform1_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6334,7 +6457,7 @@ func (x *AttributePath_Step) String() string { func (*AttributePath_Step) ProtoMessage() {} func (x *AttributePath_Step) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[111] + mi := &file_terraform1_proto_msgTypes[112] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6423,13 +6546,14 @@ type PlannedChange_ChangeDescription struct { // *PlannedChange_ChangeDescription_ResourceInstancePlanned // *PlannedChange_ChangeDescription_OutputValuePlanned // *PlannedChange_ChangeDescription_PlanApplyable + // *PlannedChange_ChangeDescription_ResourceInstanceDeferred Description isPlannedChange_ChangeDescription_Description `protobuf_oneof:"description"` } func (x *PlannedChange_ChangeDescription) Reset() { *x = PlannedChange_ChangeDescription{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[112] + mi := &file_terraform1_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6442,7 +6566,7 @@ func (x *PlannedChange_ChangeDescription) String() string { func (*PlannedChange_ChangeDescription) ProtoMessage() {} func (x *PlannedChange_ChangeDescription) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[112] + mi := &file_terraform1_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6493,6 +6617,13 @@ func (x *PlannedChange_ChangeDescription) GetPlanApplyable() bool { return false } +func (x *PlannedChange_ChangeDescription) GetResourceInstanceDeferred() *PlannedChange_ResourceInstanceDeferred { + if x, ok := x.GetDescription().(*PlannedChange_ChangeDescription_ResourceInstanceDeferred); ok { + return x.ResourceInstanceDeferred + } + return nil +} + type isPlannedChange_ChangeDescription_Description interface { isPlannedChange_ChangeDescription_Description() } @@ -6513,6 +6644,10 @@ type PlannedChange_ChangeDescription_PlanApplyable struct { PlanApplyable bool `protobuf:"varint,4,opt,name=plan_applyable,json=planApplyable,proto3,oneof"` } +type PlannedChange_ChangeDescription_ResourceInstanceDeferred struct { + ResourceInstanceDeferred *PlannedChange_ResourceInstanceDeferred `protobuf:"bytes,5,opt,name=resource_instance_deferred,json=resourceInstanceDeferred,proto3,oneof"` +} + func (*PlannedChange_ChangeDescription_ComponentInstancePlanned) isPlannedChange_ChangeDescription_Description() { } @@ -6525,6 +6660,9 @@ func (*PlannedChange_ChangeDescription_OutputValuePlanned) isPlannedChange_Chang func (*PlannedChange_ChangeDescription_PlanApplyable) isPlannedChange_ChangeDescription_Description() { } +func (*PlannedChange_ChangeDescription_ResourceInstanceDeferred) isPlannedChange_ChangeDescription_Description() { +} + // Reports the existence of a particular instance of a component, // once Terraform has resolved arguments such as "for_each" that // might make the set of instances dynamic. @@ -6556,7 +6694,7 @@ type PlannedChange_ComponentInstance struct { func (x *PlannedChange_ComponentInstance) Reset() { *x = PlannedChange_ComponentInstance{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[113] + mi := &file_terraform1_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6569,7 +6707,7 @@ func (x *PlannedChange_ComponentInstance) String() string { func (*PlannedChange_ComponentInstance) ProtoMessage() {} func (x *PlannedChange_ComponentInstance) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[113] + mi := &file_terraform1_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6645,7 +6783,7 @@ type PlannedChange_ResourceInstance struct { func (x *PlannedChange_ResourceInstance) Reset() { *x = PlannedChange_ResourceInstance{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[114] + mi := &file_terraform1_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6658,7 +6796,7 @@ func (x *PlannedChange_ResourceInstance) String() string { func (*PlannedChange_ResourceInstance) ProtoMessage() {} func (x *PlannedChange_ResourceInstance) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[114] + mi := &file_terraform1_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6767,7 +6905,7 @@ type PlannedChange_OutputValue struct { func (x *PlannedChange_OutputValue) Reset() { *x = PlannedChange_OutputValue{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[115] + mi := &file_terraform1_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6780,7 +6918,7 @@ func (x *PlannedChange_OutputValue) String() string { func (*PlannedChange_OutputValue) ProtoMessage() {} func (x *PlannedChange_OutputValue) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[115] + mi := &file_terraform1_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6817,6 +6955,61 @@ func (x *PlannedChange_OutputValue) GetValues() *DynamicValueChange { return nil } +type PlannedChange_ResourceInstanceDeferred struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ResourceInstance *PlannedChange_ResourceInstance `protobuf:"bytes,1,opt,name=resource_instance,json=resourceInstance,proto3" json:"resource_instance,omitempty"` + Deferred *Deferred `protobuf:"bytes,2,opt,name=deferred,proto3" json:"deferred,omitempty"` +} + +func (x *PlannedChange_ResourceInstanceDeferred) Reset() { + *x = PlannedChange_ResourceInstanceDeferred{} + if protoimpl.UnsafeEnabled { + mi := &file_terraform1_proto_msgTypes[117] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlannedChange_ResourceInstanceDeferred) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlannedChange_ResourceInstanceDeferred) ProtoMessage() {} + +func (x *PlannedChange_ResourceInstanceDeferred) ProtoReflect() protoreflect.Message { + mi := &file_terraform1_proto_msgTypes[117] + 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 PlannedChange_ResourceInstanceDeferred.ProtoReflect.Descriptor instead. +func (*PlannedChange_ResourceInstanceDeferred) Descriptor() ([]byte, []int) { + return file_terraform1_proto_rawDescGZIP(), []int{36, 4} +} + +func (x *PlannedChange_ResourceInstanceDeferred) GetResourceInstance() *PlannedChange_ResourceInstance { + if x != nil { + return x.ResourceInstance + } + return nil +} + +func (x *PlannedChange_ResourceInstanceDeferred) GetDeferred() *Deferred { + if x != nil { + return x.Deferred + } + return nil +} + type PlannedChange_ResourceInstance_Moved struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6828,7 +7021,7 @@ type PlannedChange_ResourceInstance_Moved struct { func (x *PlannedChange_ResourceInstance_Moved) Reset() { *x = PlannedChange_ResourceInstance_Moved{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[116] + mi := &file_terraform1_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6841,7 +7034,7 @@ func (x *PlannedChange_ResourceInstance_Moved) String() string { func (*PlannedChange_ResourceInstance_Moved) ProtoMessage() {} func (x *PlannedChange_ResourceInstance_Moved) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[116] + mi := &file_terraform1_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6875,7 +7068,7 @@ type PlannedChange_ResourceInstance_Imported struct { func (x *PlannedChange_ResourceInstance_Imported) Reset() { *x = PlannedChange_ResourceInstance_Imported{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[117] + mi := &file_terraform1_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6888,7 +7081,7 @@ func (x *PlannedChange_ResourceInstance_Imported) String() string { func (*PlannedChange_ResourceInstance_Imported) ProtoMessage() {} func (x *PlannedChange_ResourceInstance_Imported) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[117] + mi := &file_terraform1_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6923,7 +7116,7 @@ type AppliedChange_RawChange struct { func (x *AppliedChange_RawChange) Reset() { *x = AppliedChange_RawChange{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[118] + mi := &file_terraform1_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6936,7 +7129,7 @@ func (x *AppliedChange_RawChange) String() string { func (*AppliedChange_RawChange) ProtoMessage() {} func (x *AppliedChange_RawChange) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[118] + mi := &file_terraform1_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6949,7 +7142,7 @@ func (x *AppliedChange_RawChange) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_RawChange.ProtoReflect.Descriptor instead. func (*AppliedChange_RawChange) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 0} + return file_terraform1_proto_rawDescGZIP(), []int{38, 0} } func (x *AppliedChange_RawChange) GetKey() string { @@ -6984,7 +7177,7 @@ type AppliedChange_ChangeDescription struct { func (x *AppliedChange_ChangeDescription) Reset() { *x = AppliedChange_ChangeDescription{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[119] + mi := &file_terraform1_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6997,7 +7190,7 @@ func (x *AppliedChange_ChangeDescription) String() string { func (*AppliedChange_ChangeDescription) ProtoMessage() {} func (x *AppliedChange_ChangeDescription) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[119] + mi := &file_terraform1_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7010,7 +7203,7 @@ func (x *AppliedChange_ChangeDescription) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_ChangeDescription.ProtoReflect.Descriptor instead. func (*AppliedChange_ChangeDescription) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 1} + return file_terraform1_proto_rawDescGZIP(), []int{38, 1} } func (x *AppliedChange_ChangeDescription) GetKey() string { @@ -7122,7 +7315,7 @@ type AppliedChange_ResourceInstance struct { func (x *AppliedChange_ResourceInstance) Reset() { *x = AppliedChange_ResourceInstance{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[120] + mi := &file_terraform1_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7135,7 +7328,7 @@ func (x *AppliedChange_ResourceInstance) String() string { func (*AppliedChange_ResourceInstance) ProtoMessage() {} func (x *AppliedChange_ResourceInstance) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[120] + mi := &file_terraform1_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7148,7 +7341,7 @@ func (x *AppliedChange_ResourceInstance) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_ResourceInstance.ProtoReflect.Descriptor instead. func (*AppliedChange_ResourceInstance) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 2} + return file_terraform1_proto_rawDescGZIP(), []int{38, 2} } func (x *AppliedChange_ResourceInstance) GetAddr() *ResourceInstanceObjectInStackAddr { @@ -7206,7 +7399,7 @@ type AppliedChange_ComponentInstance struct { func (x *AppliedChange_ComponentInstance) Reset() { *x = AppliedChange_ComponentInstance{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[121] + mi := &file_terraform1_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7219,7 +7412,7 @@ func (x *AppliedChange_ComponentInstance) String() string { func (*AppliedChange_ComponentInstance) ProtoMessage() {} func (x *AppliedChange_ComponentInstance) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[121] + mi := &file_terraform1_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7232,7 +7425,7 @@ func (x *AppliedChange_ComponentInstance) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_ComponentInstance.ProtoReflect.Descriptor instead. func (*AppliedChange_ComponentInstance) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 3} + return file_terraform1_proto_rawDescGZIP(), []int{38, 3} } func (x *AppliedChange_ComponentInstance) GetComponentAddr() string { @@ -7268,7 +7461,7 @@ type AppliedChange_OutputValue struct { func (x *AppliedChange_OutputValue) Reset() { *x = AppliedChange_OutputValue{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[122] + mi := &file_terraform1_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7281,7 +7474,7 @@ func (x *AppliedChange_OutputValue) String() string { func (*AppliedChange_OutputValue) ProtoMessage() {} func (x *AppliedChange_OutputValue) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[122] + mi := &file_terraform1_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7294,7 +7487,7 @@ func (x *AppliedChange_OutputValue) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_OutputValue.ProtoReflect.Descriptor instead. func (*AppliedChange_OutputValue) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 4} + return file_terraform1_proto_rawDescGZIP(), []int{38, 4} } func (x *AppliedChange_OutputValue) GetName() string { @@ -7320,7 +7513,7 @@ type AppliedChange_Nothing struct { func (x *AppliedChange_Nothing) Reset() { *x = AppliedChange_Nothing{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[123] + mi := &file_terraform1_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7333,7 +7526,7 @@ func (x *AppliedChange_Nothing) String() string { func (*AppliedChange_Nothing) ProtoMessage() {} func (x *AppliedChange_Nothing) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[123] + mi := &file_terraform1_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7346,7 +7539,7 @@ func (x *AppliedChange_Nothing) ProtoReflect() protoreflect.Message { // Deprecated: Use AppliedChange_Nothing.ProtoReflect.Descriptor instead. func (*AppliedChange_Nothing) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{37, 5} + return file_terraform1_proto_rawDescGZIP(), []int{38, 5} } // ComponentInstanceStatus describes the current status of a component instance @@ -7363,7 +7556,7 @@ type StackChangeProgress_ComponentInstanceStatus struct { func (x *StackChangeProgress_ComponentInstanceStatus) Reset() { *x = StackChangeProgress_ComponentInstanceStatus{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[125] + mi := &file_terraform1_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7376,7 +7569,7 @@ func (x *StackChangeProgress_ComponentInstanceStatus) String() string { func (*StackChangeProgress_ComponentInstanceStatus) ProtoMessage() {} func (x *StackChangeProgress_ComponentInstanceStatus) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[125] + mi := &file_terraform1_proto_msgTypes[127] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7389,7 +7582,7 @@ func (x *StackChangeProgress_ComponentInstanceStatus) ProtoReflect() protoreflec // Deprecated: Use StackChangeProgress_ComponentInstanceStatus.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ComponentInstanceStatus) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{38, 0} + return file_terraform1_proto_rawDescGZIP(), []int{39, 0} } func (x *StackChangeProgress_ComponentInstanceStatus) GetAddr() *ComponentInstanceInStackAddr { @@ -7421,7 +7614,7 @@ type StackChangeProgress_ResourceInstanceStatus struct { func (x *StackChangeProgress_ResourceInstanceStatus) Reset() { *x = StackChangeProgress_ResourceInstanceStatus{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[126] + mi := &file_terraform1_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7434,7 +7627,7 @@ func (x *StackChangeProgress_ResourceInstanceStatus) String() string { func (*StackChangeProgress_ResourceInstanceStatus) ProtoMessage() {} func (x *StackChangeProgress_ResourceInstanceStatus) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[126] + mi := &file_terraform1_proto_msgTypes[128] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7447,7 +7640,7 @@ func (x *StackChangeProgress_ResourceInstanceStatus) ProtoReflect() protoreflect // Deprecated: Use StackChangeProgress_ResourceInstanceStatus.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ResourceInstanceStatus) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{38, 1} + return file_terraform1_proto_rawDescGZIP(), []int{39, 1} } func (x *StackChangeProgress_ResourceInstanceStatus) GetAddr() *ResourceInstanceObjectInStackAddr { @@ -7491,7 +7684,7 @@ type StackChangeProgress_ResourceInstancePlannedChange struct { func (x *StackChangeProgress_ResourceInstancePlannedChange) Reset() { *x = StackChangeProgress_ResourceInstancePlannedChange{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[127] + mi := &file_terraform1_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7504,7 +7697,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange) String() string { func (*StackChangeProgress_ResourceInstancePlannedChange) ProtoMessage() {} func (x *StackChangeProgress_ResourceInstancePlannedChange) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[127] + mi := &file_terraform1_proto_msgTypes[129] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7517,7 +7710,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange) ProtoReflect() proto // Deprecated: Use StackChangeProgress_ResourceInstancePlannedChange.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ResourceInstancePlannedChange) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{38, 2} + return file_terraform1_proto_rawDescGZIP(), []int{39, 2} } func (x *StackChangeProgress_ResourceInstancePlannedChange) GetAddr() *ResourceInstanceObjectInStackAddr { @@ -7555,6 +7748,63 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange) GetProviderAddr() st return "" } +// DeferredResourceInstancePlannedChange represents a planned change for a +// resource instance that is deferred due to the reason provided. +type StackChangeProgress_DeferredResourceInstancePlannedChange struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Deferred *Deferred `protobuf:"bytes,1,opt,name=deferred,proto3" json:"deferred,omitempty"` + Change *StackChangeProgress_ResourceInstancePlannedChange `protobuf:"bytes,2,opt,name=change,proto3" json:"change,omitempty"` +} + +func (x *StackChangeProgress_DeferredResourceInstancePlannedChange) Reset() { + *x = StackChangeProgress_DeferredResourceInstancePlannedChange{} + if protoimpl.UnsafeEnabled { + mi := &file_terraform1_proto_msgTypes[130] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StackChangeProgress_DeferredResourceInstancePlannedChange) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StackChangeProgress_DeferredResourceInstancePlannedChange) ProtoMessage() {} + +func (x *StackChangeProgress_DeferredResourceInstancePlannedChange) ProtoReflect() protoreflect.Message { + mi := &file_terraform1_proto_msgTypes[130] + 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 StackChangeProgress_DeferredResourceInstancePlannedChange.ProtoReflect.Descriptor instead. +func (*StackChangeProgress_DeferredResourceInstancePlannedChange) Descriptor() ([]byte, []int) { + return file_terraform1_proto_rawDescGZIP(), []int{39, 3} +} + +func (x *StackChangeProgress_DeferredResourceInstancePlannedChange) GetDeferred() *Deferred { + if x != nil { + return x.Deferred + } + return nil +} + +func (x *StackChangeProgress_DeferredResourceInstancePlannedChange) GetChange() *StackChangeProgress_ResourceInstancePlannedChange { + if x != nil { + return x.Change + } + return nil +} + // ProvisionerStatus represents the progress of a given provisioner during its // resource instance's apply operation. type StackChangeProgress_ProvisionerStatus struct { @@ -7570,7 +7820,7 @@ type StackChangeProgress_ProvisionerStatus struct { func (x *StackChangeProgress_ProvisionerStatus) Reset() { *x = StackChangeProgress_ProvisionerStatus{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[128] + mi := &file_terraform1_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7583,7 +7833,7 @@ func (x *StackChangeProgress_ProvisionerStatus) String() string { func (*StackChangeProgress_ProvisionerStatus) ProtoMessage() {} func (x *StackChangeProgress_ProvisionerStatus) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[128] + mi := &file_terraform1_proto_msgTypes[131] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7596,7 +7846,7 @@ func (x *StackChangeProgress_ProvisionerStatus) ProtoReflect() protoreflect.Mess // Deprecated: Use StackChangeProgress_ProvisionerStatus.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ProvisionerStatus) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{38, 3} + return file_terraform1_proto_rawDescGZIP(), []int{39, 4} } func (x *StackChangeProgress_ProvisionerStatus) GetAddr() *ResourceInstanceObjectInStackAddr { @@ -7635,7 +7885,7 @@ type StackChangeProgress_ProvisionerOutput struct { func (x *StackChangeProgress_ProvisionerOutput) Reset() { *x = StackChangeProgress_ProvisionerOutput{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[129] + mi := &file_terraform1_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7648,7 +7898,7 @@ func (x *StackChangeProgress_ProvisionerOutput) String() string { func (*StackChangeProgress_ProvisionerOutput) ProtoMessage() {} func (x *StackChangeProgress_ProvisionerOutput) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[129] + mi := &file_terraform1_proto_msgTypes[132] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7661,7 +7911,7 @@ func (x *StackChangeProgress_ProvisionerOutput) ProtoReflect() protoreflect.Mess // Deprecated: Use StackChangeProgress_ProvisionerOutput.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ProvisionerOutput) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{38, 4} + return file_terraform1_proto_rawDescGZIP(), []int{39, 5} } func (x *StackChangeProgress_ProvisionerOutput) GetAddr() *ResourceInstanceObjectInStackAddr { @@ -7710,7 +7960,7 @@ type StackChangeProgress_ComponentInstanceChanges struct { func (x *StackChangeProgress_ComponentInstanceChanges) Reset() { *x = StackChangeProgress_ComponentInstanceChanges{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[130] + mi := &file_terraform1_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7723,7 +7973,7 @@ func (x *StackChangeProgress_ComponentInstanceChanges) String() string { func (*StackChangeProgress_ComponentInstanceChanges) ProtoMessage() {} func (x *StackChangeProgress_ComponentInstanceChanges) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[130] + mi := &file_terraform1_proto_msgTypes[133] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7736,7 +7986,7 @@ func (x *StackChangeProgress_ComponentInstanceChanges) ProtoReflect() protorefle // Deprecated: Use StackChangeProgress_ComponentInstanceChanges.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ComponentInstanceChanges) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{38, 5} + return file_terraform1_proto_rawDescGZIP(), []int{39, 6} } func (x *StackChangeProgress_ComponentInstanceChanges) GetAddr() *ComponentInstanceInStackAddr { @@ -7795,7 +8045,7 @@ type StackChangeProgress_ComponentInstances struct { func (x *StackChangeProgress_ComponentInstances) Reset() { *x = StackChangeProgress_ComponentInstances{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[131] + mi := &file_terraform1_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7808,7 +8058,7 @@ func (x *StackChangeProgress_ComponentInstances) String() string { func (*StackChangeProgress_ComponentInstances) ProtoMessage() {} func (x *StackChangeProgress_ComponentInstances) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[131] + mi := &file_terraform1_proto_msgTypes[134] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7821,7 +8071,7 @@ func (x *StackChangeProgress_ComponentInstances) ProtoReflect() protoreflect.Mes // Deprecated: Use StackChangeProgress_ComponentInstances.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ComponentInstances) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{38, 6} + return file_terraform1_proto_rawDescGZIP(), []int{39, 7} } func (x *StackChangeProgress_ComponentInstances) GetComponentAddr() string { @@ -7849,7 +8099,7 @@ type StackChangeProgress_ResourceInstancePlannedChange_Moved struct { func (x *StackChangeProgress_ResourceInstancePlannedChange_Moved) Reset() { *x = StackChangeProgress_ResourceInstancePlannedChange_Moved{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[132] + mi := &file_terraform1_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7862,7 +8112,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange_Moved) String() strin func (*StackChangeProgress_ResourceInstancePlannedChange_Moved) ProtoMessage() {} func (x *StackChangeProgress_ResourceInstancePlannedChange_Moved) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[132] + mi := &file_terraform1_proto_msgTypes[135] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7875,7 +8125,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange_Moved) ProtoReflect() // Deprecated: Use StackChangeProgress_ResourceInstancePlannedChange_Moved.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ResourceInstancePlannedChange_Moved) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{38, 2, 0} + return file_terraform1_proto_rawDescGZIP(), []int{39, 2, 0} } func (x *StackChangeProgress_ResourceInstancePlannedChange_Moved) GetPrevAddr() *ResourceInstanceInStackAddr { @@ -7896,7 +8146,7 @@ type StackChangeProgress_ResourceInstancePlannedChange_Imported struct { func (x *StackChangeProgress_ResourceInstancePlannedChange_Imported) Reset() { *x = StackChangeProgress_ResourceInstancePlannedChange_Imported{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[133] + mi := &file_terraform1_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7909,7 +8159,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange_Imported) String() st func (*StackChangeProgress_ResourceInstancePlannedChange_Imported) ProtoMessage() {} func (x *StackChangeProgress_ResourceInstancePlannedChange_Imported) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[133] + mi := &file_terraform1_proto_msgTypes[136] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7922,7 +8172,7 @@ func (x *StackChangeProgress_ResourceInstancePlannedChange_Imported) ProtoReflec // Deprecated: Use StackChangeProgress_ResourceInstancePlannedChange_Imported.ProtoReflect.Descriptor instead. func (*StackChangeProgress_ResourceInstancePlannedChange_Imported) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{38, 2, 1} + return file_terraform1_proto_rawDescGZIP(), []int{39, 2, 1} } func (x *StackChangeProgress_ResourceInstancePlannedChange_Imported) GetImportId() string { @@ -7946,7 +8196,7 @@ type Schema_Block struct { func (x *Schema_Block) Reset() { *x = Schema_Block{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[134] + mi := &file_terraform1_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7959,7 +8209,7 @@ func (x *Schema_Block) String() string { func (*Schema_Block) ProtoMessage() {} func (x *Schema_Block) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[134] + mi := &file_terraform1_proto_msgTypes[137] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7972,7 +8222,7 @@ func (x *Schema_Block) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema_Block.ProtoReflect.Descriptor instead. func (*Schema_Block) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{42, 0} + return file_terraform1_proto_rawDescGZIP(), []int{43, 0} } func (x *Schema_Block) GetAttributes() []*Schema_Attribute { @@ -8022,7 +8272,7 @@ type Schema_Attribute struct { func (x *Schema_Attribute) Reset() { *x = Schema_Attribute{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[135] + mi := &file_terraform1_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8035,7 +8285,7 @@ func (x *Schema_Attribute) String() string { func (*Schema_Attribute) ProtoMessage() {} func (x *Schema_Attribute) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[135] + mi := &file_terraform1_proto_msgTypes[138] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8048,7 +8298,7 @@ func (x *Schema_Attribute) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema_Attribute.ProtoReflect.Descriptor instead. func (*Schema_Attribute) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{42, 1} + return file_terraform1_proto_rawDescGZIP(), []int{43, 1} } func (x *Schema_Attribute) GetName() string { @@ -8127,7 +8377,7 @@ type Schema_NestedBlock struct { func (x *Schema_NestedBlock) Reset() { *x = Schema_NestedBlock{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[136] + mi := &file_terraform1_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8140,7 +8390,7 @@ func (x *Schema_NestedBlock) String() string { func (*Schema_NestedBlock) ProtoMessage() {} func (x *Schema_NestedBlock) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[136] + mi := &file_terraform1_proto_msgTypes[139] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8153,7 +8403,7 @@ func (x *Schema_NestedBlock) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema_NestedBlock.ProtoReflect.Descriptor instead. func (*Schema_NestedBlock) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{42, 2} + return file_terraform1_proto_rawDescGZIP(), []int{43, 2} } func (x *Schema_NestedBlock) GetTypeName() string { @@ -8189,7 +8439,7 @@ type Schema_Object struct { func (x *Schema_Object) Reset() { *x = Schema_Object{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[137] + mi := &file_terraform1_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8202,7 +8452,7 @@ func (x *Schema_Object) String() string { func (*Schema_Object) ProtoMessage() {} func (x *Schema_Object) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[137] + mi := &file_terraform1_proto_msgTypes[140] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8215,7 +8465,7 @@ func (x *Schema_Object) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema_Object.ProtoReflect.Descriptor instead. func (*Schema_Object) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{42, 3} + return file_terraform1_proto_rawDescGZIP(), []int{43, 3} } func (x *Schema_Object) GetAttributes() []*Schema_Attribute { @@ -8244,7 +8494,7 @@ type Schema_DocString struct { func (x *Schema_DocString) Reset() { *x = Schema_DocString{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[138] + mi := &file_terraform1_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8257,7 +8507,7 @@ func (x *Schema_DocString) String() string { func (*Schema_DocString) ProtoMessage() {} func (x *Schema_DocString) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[138] + mi := &file_terraform1_proto_msgTypes[141] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8270,7 +8520,7 @@ func (x *Schema_DocString) ProtoReflect() protoreflect.Message { // Deprecated: Use Schema_DocString.ProtoReflect.Descriptor instead. func (*Schema_DocString) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{42, 4} + return file_terraform1_proto_rawDescGZIP(), []int{43, 4} } func (x *Schema_DocString) GetDescription() string { @@ -8298,7 +8548,7 @@ type ProviderPackageVersions_Request struct { func (x *ProviderPackageVersions_Request) Reset() { *x = ProviderPackageVersions_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[139] + mi := &file_terraform1_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8311,7 +8561,7 @@ func (x *ProviderPackageVersions_Request) String() string { func (*ProviderPackageVersions_Request) ProtoMessage() {} func (x *ProviderPackageVersions_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[139] + mi := &file_terraform1_proto_msgTypes[142] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8324,7 +8574,7 @@ func (x *ProviderPackageVersions_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use ProviderPackageVersions_Request.ProtoReflect.Descriptor instead. func (*ProviderPackageVersions_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{43, 0} + return file_terraform1_proto_rawDescGZIP(), []int{44, 0} } func (x *ProviderPackageVersions_Request) GetSourceAddr() string { @@ -8346,7 +8596,7 @@ type ProviderPackageVersions_Response struct { func (x *ProviderPackageVersions_Response) Reset() { *x = ProviderPackageVersions_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[140] + mi := &file_terraform1_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8359,7 +8609,7 @@ func (x *ProviderPackageVersions_Response) String() string { func (*ProviderPackageVersions_Response) ProtoMessage() {} func (x *ProviderPackageVersions_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[140] + mi := &file_terraform1_proto_msgTypes[143] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8372,7 +8622,7 @@ func (x *ProviderPackageVersions_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use ProviderPackageVersions_Response.ProtoReflect.Descriptor instead. func (*ProviderPackageVersions_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{43, 1} + return file_terraform1_proto_rawDescGZIP(), []int{44, 1} } func (x *ProviderPackageVersions_Response) GetVersions() []string { @@ -8404,7 +8654,7 @@ type FetchProviderPackage_Request struct { func (x *FetchProviderPackage_Request) Reset() { *x = FetchProviderPackage_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[141] + mi := &file_terraform1_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8417,7 +8667,7 @@ func (x *FetchProviderPackage_Request) String() string { func (*FetchProviderPackage_Request) ProtoMessage() {} func (x *FetchProviderPackage_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[141] + mi := &file_terraform1_proto_msgTypes[144] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8430,7 +8680,7 @@ func (x *FetchProviderPackage_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchProviderPackage_Request.ProtoReflect.Descriptor instead. func (*FetchProviderPackage_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{44, 0} + return file_terraform1_proto_rawDescGZIP(), []int{45, 0} } func (x *FetchProviderPackage_Request) GetCacheDir() string { @@ -8485,7 +8735,7 @@ type FetchProviderPackage_Response struct { func (x *FetchProviderPackage_Response) Reset() { *x = FetchProviderPackage_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[142] + mi := &file_terraform1_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8498,7 +8748,7 @@ func (x *FetchProviderPackage_Response) String() string { func (*FetchProviderPackage_Response) ProtoMessage() {} func (x *FetchProviderPackage_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[142] + mi := &file_terraform1_proto_msgTypes[145] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8511,7 +8761,7 @@ func (x *FetchProviderPackage_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchProviderPackage_Response.ProtoReflect.Descriptor instead. func (*FetchProviderPackage_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{44, 1} + return file_terraform1_proto_rawDescGZIP(), []int{45, 1} } func (x *FetchProviderPackage_Response) GetResults() []*FetchProviderPackage_PlatformResult { @@ -8540,7 +8790,7 @@ type FetchProviderPackage_PlatformResult struct { func (x *FetchProviderPackage_PlatformResult) Reset() { *x = FetchProviderPackage_PlatformResult{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[143] + mi := &file_terraform1_proto_msgTypes[146] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8553,7 +8803,7 @@ func (x *FetchProviderPackage_PlatformResult) String() string { func (*FetchProviderPackage_PlatformResult) ProtoMessage() {} func (x *FetchProviderPackage_PlatformResult) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[143] + mi := &file_terraform1_proto_msgTypes[146] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8566,7 +8816,7 @@ func (x *FetchProviderPackage_PlatformResult) ProtoReflect() protoreflect.Messag // Deprecated: Use FetchProviderPackage_PlatformResult.ProtoReflect.Descriptor instead. func (*FetchProviderPackage_PlatformResult) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{44, 2} + return file_terraform1_proto_rawDescGZIP(), []int{45, 2} } func (x *FetchProviderPackage_PlatformResult) GetProvider() *ProviderPackage { @@ -8594,7 +8844,7 @@ type ModulePackageVersions_Request struct { func (x *ModulePackageVersions_Request) Reset() { *x = ModulePackageVersions_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[144] + mi := &file_terraform1_proto_msgTypes[147] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8607,7 +8857,7 @@ func (x *ModulePackageVersions_Request) String() string { func (*ModulePackageVersions_Request) ProtoMessage() {} func (x *ModulePackageVersions_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[144] + mi := &file_terraform1_proto_msgTypes[147] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8620,7 +8870,7 @@ func (x *ModulePackageVersions_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageVersions_Request.ProtoReflect.Descriptor instead. func (*ModulePackageVersions_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{45, 0} + return file_terraform1_proto_rawDescGZIP(), []int{46, 0} } func (x *ModulePackageVersions_Request) GetSourceAddr() string { @@ -8642,7 +8892,7 @@ type ModulePackageVersions_Response struct { func (x *ModulePackageVersions_Response) Reset() { *x = ModulePackageVersions_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[145] + mi := &file_terraform1_proto_msgTypes[148] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8655,7 +8905,7 @@ func (x *ModulePackageVersions_Response) String() string { func (*ModulePackageVersions_Response) ProtoMessage() {} func (x *ModulePackageVersions_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[145] + mi := &file_terraform1_proto_msgTypes[148] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8668,7 +8918,7 @@ func (x *ModulePackageVersions_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageVersions_Response.ProtoReflect.Descriptor instead. func (*ModulePackageVersions_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{45, 1} + return file_terraform1_proto_rawDescGZIP(), []int{46, 1} } func (x *ModulePackageVersions_Response) GetVersions() []string { @@ -8697,7 +8947,7 @@ type ModulePackageSourceAddr_Request struct { func (x *ModulePackageSourceAddr_Request) Reset() { *x = ModulePackageSourceAddr_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[146] + mi := &file_terraform1_proto_msgTypes[149] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8710,7 +8960,7 @@ func (x *ModulePackageSourceAddr_Request) String() string { func (*ModulePackageSourceAddr_Request) ProtoMessage() {} func (x *ModulePackageSourceAddr_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[146] + mi := &file_terraform1_proto_msgTypes[149] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8723,7 +8973,7 @@ func (x *ModulePackageSourceAddr_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageSourceAddr_Request.ProtoReflect.Descriptor instead. func (*ModulePackageSourceAddr_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{46, 0} + return file_terraform1_proto_rawDescGZIP(), []int{47, 0} } func (x *ModulePackageSourceAddr_Request) GetSourceAddr() string { @@ -8752,7 +9002,7 @@ type ModulePackageSourceAddr_Response struct { func (x *ModulePackageSourceAddr_Response) Reset() { *x = ModulePackageSourceAddr_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[147] + mi := &file_terraform1_proto_msgTypes[150] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8765,7 +9015,7 @@ func (x *ModulePackageSourceAddr_Response) String() string { func (*ModulePackageSourceAddr_Response) ProtoMessage() {} func (x *ModulePackageSourceAddr_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[147] + mi := &file_terraform1_proto_msgTypes[150] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8778,7 +9028,7 @@ func (x *ModulePackageSourceAddr_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use ModulePackageSourceAddr_Response.ProtoReflect.Descriptor instead. func (*ModulePackageSourceAddr_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{46, 1} + return file_terraform1_proto_rawDescGZIP(), []int{47, 1} } func (x *ModulePackageSourceAddr_Response) GetUrl() string { @@ -8807,7 +9057,7 @@ type FetchModulePackage_Request struct { func (x *FetchModulePackage_Request) Reset() { *x = FetchModulePackage_Request{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[148] + mi := &file_terraform1_proto_msgTypes[151] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8820,7 +9070,7 @@ func (x *FetchModulePackage_Request) String() string { func (*FetchModulePackage_Request) ProtoMessage() {} func (x *FetchModulePackage_Request) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[148] + mi := &file_terraform1_proto_msgTypes[151] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8833,7 +9083,7 @@ func (x *FetchModulePackage_Request) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchModulePackage_Request.ProtoReflect.Descriptor instead. func (*FetchModulePackage_Request) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{47, 0} + return file_terraform1_proto_rawDescGZIP(), []int{48, 0} } func (x *FetchModulePackage_Request) GetCacheDir() string { @@ -8861,7 +9111,7 @@ type FetchModulePackage_Response struct { func (x *FetchModulePackage_Response) Reset() { *x = FetchModulePackage_Response{} if protoimpl.UnsafeEnabled { - mi := &file_terraform1_proto_msgTypes[149] + mi := &file_terraform1_proto_msgTypes[152] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8874,7 +9124,7 @@ func (x *FetchModulePackage_Response) String() string { func (*FetchModulePackage_Response) ProtoMessage() {} func (x *FetchModulePackage_Response) ProtoReflect() protoreflect.Message { - mi := &file_terraform1_proto_msgTypes[149] + mi := &file_terraform1_proto_msgTypes[152] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8887,7 +9137,7 @@ func (x *FetchModulePackage_Response) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchModulePackage_Response.ProtoReflect.Descriptor instead. func (*FetchModulePackage_Response) Descriptor() ([]byte, []int) { - return file_terraform1_proto_rawDescGZIP(), []int{47, 1} + return file_terraform1_proto_rawDescGZIP(), []int{48, 1} } func (x *FetchModulePackage_Response) GetDiagnostics() []*Diagnostic { @@ -9540,7 +9790,7 @@ var file_terraform1_proto_rawDesc = []byte{ 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe1, 0x0c, 0x0a, 0x0d, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xfd, 0x0e, 0x0a, 0x0d, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x03, 0x72, 0x61, 0x77, 0x12, @@ -9549,7 +9799,7 @@ var file_terraform1_proto_rawDesc = []byte{ 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x1a, 0xfd, 0x02, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x1a, 0xf1, 0x03, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6b, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x72, @@ -9572,703 +9822,756 @@ var file_terraform1_proto_rawDesc = []byte{ 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0e, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x61, 0x62, 0x6c, - 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x1a, 0xa8, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, - 0x61, 0x64, 0x64, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x70, - 0x6c, 0x61, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x1a, 0x97, 0x06, 0x0a, 0x10, + 0x65, 0x12, 0x72, 0x0a, 0x1a, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x48, 0x00, 0x52, 0x18, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x66, + 0x65, 0x72, 0x72, 0x65, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xa8, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x04, 0x61, 0x64, + 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, + 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6c, + 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x70, 0x6c, 0x61, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x1a, + 0x97, 0x06, 0x0a, 0x10, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, - 0x64, 0x64, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x46, 0x0a, - 0x05, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, - 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x52, 0x05, - 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x4f, 0x0a, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x08, 0x69, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, + 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x12, 0x46, 0x0a, 0x05, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x30, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, + 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x6f, 0x76, + 0x65, 0x64, 0x52, 0x05, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x4f, 0x0a, 0x08, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x52, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, + 0x64, 0x64, 0x72, 0x12, 0x46, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, + 0x72, 0x75, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x6f, 0x75, 0x73, 0x52, 0x75, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x6e, + 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, + 0x74, 0x73, 0x69, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6e, 0x6f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x75, 0x74, 0x73, 0x69, 0x64, + 0x65, 0x12, 0x3e, 0x0a, 0x0d, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, + 0x61, 0x74, 0x68, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, + 0x73, 0x1a, 0x4d, 0x0a, 0x05, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x09, 0x70, 0x72, + 0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x08, 0x70, 0x72, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, + 0x1a, 0x27, 0x0a, 0x08, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x64, 0x1a, 0x8b, 0x01, 0x0a, 0x0b, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, + 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x36, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, + 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, + 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0xa5, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x65, 0x64, 0x12, 0x57, 0x0a, 0x11, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, + 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x10, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x30, 0x0a, + 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x65, 0x66, + 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x4a, + 0x04, 0x08, 0x03, 0x10, 0x07, 0x22, 0xd5, 0x01, 0x0a, 0x08, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x65, 0x64, 0x12, 0x33, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, + 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x06, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, + 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, + 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x52, + 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x50, 0x52, 0x4f, 0x56, + 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x42, 0x53, 0x45, 0x4e, 0x54, 0x5f, + 0x50, 0x52, 0x45, 0x52, 0x45, 0x51, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x45, 0x46, 0x45, + 0x52, 0x52, 0x45, 0x44, 0x5f, 0x50, 0x52, 0x45, 0x52, 0x45, 0x51, 0x10, 0x05, 0x22, 0xb2, 0x0a, + 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, + 0x35, 0x0a, 0x03, 0x72, 0x61, 0x77, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x03, 0x72, 0x61, 0x77, 0x12, 0x4f, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x49, 0x0a, 0x09, 0x52, 0x61, 0x77, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x1a, 0x82, 0x03, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x07, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x48, 0x00, + 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x59, 0x0a, 0x11, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x48, 0x00, 0x52, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x48, 0x00, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x5c, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x11, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x0d, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x08, 0x08, + 0xa0, 0x9c, 0x01, 0x10, 0xa1, 0x9c, 0x01, 0x1a, 0xaf, 0x02, 0x0a, 0x10, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x04, + 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, + 0x35, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6e, 0x65, + 0x77, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, - 0x46, 0x0a, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x72, 0x75, 0x6e, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x52, - 0x75, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x6e, 0x6f, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x73, 0x69, 0x64, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6e, 0x6f, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 0x12, 0x3e, 0x0a, - 0x0d, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x0b, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, - 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x73, 0x1a, 0x4d, 0x0a, - 0x05, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, - 0x64, 0x72, 0x52, 0x08, 0x70, 0x72, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x27, 0x0a, 0x08, - 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x49, 0x64, 0x1a, 0x8b, 0x01, 0x0a, 0x0b, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x0a, 0x06, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x07, 0x22, 0xb2, 0x0a, 0x0a, 0x0d, 0x41, 0x70, - 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x03, 0x72, - 0x61, 0x77, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x03, 0x72, - 0x61, 0x77, 0x12, 0x4f, 0x0a, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x49, 0x0a, 0x09, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x82, - 0x03, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3d, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x2e, 0x4e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x59, 0x0a, 0x11, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, - 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x10, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x12, 0x4a, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, - 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x5c, 0x0a, 0x12, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x11, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x08, 0x08, 0xa0, 0x9c, 0x01, 0x10, - 0xa1, 0x9c, 0x01, 0x1a, 0xaf, 0x02, 0x0a, 0x10, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x6e, - 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, - 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, - 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, - 0x6f, 0x64, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, - 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x69, 0x6d, 0x1a, 0xb1, 0x02, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x41, 0x64, - 0x64, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x62, 0x0a, 0x0d, 0x6f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x3d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, - 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x59, - 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x0b, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x09, - 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, - 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x1a, 0x09, 0x0a, 0x07, 0x4e, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x22, 0xdd, - 0x14, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x75, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x48, 0x00, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x72, 0x0a, - 0x18, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x36, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x16, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x88, 0x01, 0x0a, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, - 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x1d, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, - 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x62, 0x0a, 0x12, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x11, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x69, 0x6d, 0x1a, 0xb1, 0x02, 0x0a, 0x11, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, + 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x62, + 0x0a, 0x0d, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x1a, 0x59, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, + 0x0b, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x35, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, + 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x6e, + 0x65, 0x77, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x09, 0x0a, 0x07, 0x4e, 0x6f, 0x74, 0x68, 0x69, + 0x6e, 0x67, 0x22, 0xb4, 0x17, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x75, 0x0a, 0x19, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x72, 0x0a, 0x18, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, + 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x16, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, + 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x3d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x48, + 0x00, 0x52, 0x1d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x62, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x5f, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x48, - 0x00, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x12, 0x78, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, + 0x00, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x62, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x65, 0x72, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x48, 0x00, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x78, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x65, - 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x48, - 0x00, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x1a, 0x96, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, - 0x56, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x3e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, + 0x65, 0x73, 0x12, 0x65, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x32, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x65, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x50, - 0x4c, 0x41, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x4c, 0x41, - 0x4e, 0x4e, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x50, 0x50, 0x4c, 0x59, 0x49, - 0x4e, 0x47, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, - 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x06, 0x1a, 0xde, - 0x02, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x55, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3d, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x22, 0x84, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, - 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, 0x0a, - 0x0a, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0d, 0x0a, - 0x09, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, - 0x50, 0x4c, 0x41, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x4c, - 0x41, 0x4e, 0x4e, 0x45, 0x44, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x50, 0x50, 0x4c, 0x59, - 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, - 0x10, 0x07, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x08, 0x1a, - 0xf0, 0x03, 0x0a, 0x1d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x63, 0x65, 0x73, 0x48, 0x00, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0xa1, 0x01, 0x0a, 0x29, 0x64, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, + 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x44, + 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x25, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x1a, 0x96, 0x02, + 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x61, 0x64, 0x64, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, + 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x56, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, + 0x65, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, + 0x47, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x4c, 0x41, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, + 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x4c, 0x41, 0x4e, 0x4e, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0c, + 0x0a, 0x08, 0x41, 0x50, 0x50, 0x4c, 0x59, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, + 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x45, 0x44, 0x10, 0x06, 0x1a, 0xde, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, - 0x61, 0x64, 0x64, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x05, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, + 0x61, 0x64, 0x64, 0x72, 0x12, 0x55, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, + 0x22, 0x84, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, + 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x45, 0x4e, 0x44, + 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, + 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, + 0x45, 0x44, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x4c, 0x41, 0x4e, 0x4e, 0x49, 0x4e, 0x47, + 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x4c, 0x41, 0x4e, 0x4e, 0x45, 0x44, 0x10, 0x05, 0x12, + 0x0c, 0x0a, 0x08, 0x41, 0x50, 0x50, 0x4c, 0x59, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0b, 0x0a, + 0x07, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, 0x07, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x08, 0x1a, 0xf0, 0x03, 0x0a, 0x1d, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, + 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x30, 0x0a, 0x07, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x59, + 0x0a, 0x05, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x43, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, + 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x4d, 0x6f, 0x76, + 0x65, 0x64, 0x52, 0x05, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x62, 0x0a, 0x08, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, + 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x52, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, + 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, + 0x64, 0x72, 0x1a, 0x4d, 0x0a, 0x05, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x09, 0x70, + 0x72, 0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x08, 0x70, 0x72, 0x65, 0x76, 0x41, 0x64, 0x64, + 0x72, 0x1a, 0x27, 0x0a, 0x08, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, + 0x09, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x64, 0x1a, 0xb0, 0x01, 0x0a, 0x25, 0x44, + 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x64, 0x52, 0x05, 0x6d, 0x6f, 0x76, 0x65, - 0x64, 0x12, 0x62, 0x0a, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x52, 0x08, 0x69, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x4d, 0x0a, 0x05, 0x4d, 0x6f, - 0x76, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x09, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x61, 0x64, 0x64, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, - 0x08, 0x70, 0x72, 0x65, 0x76, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x27, 0x0a, 0x08, 0x49, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, - 0x49, 0x64, 0x1a, 0xfc, 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x49, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x45, 0x0a, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, - 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, - 0x47, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, - 0x45, 0x44, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, 0x10, - 0x03, 0x1a, 0x82, 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, - 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x1a, 0xc8, 0x01, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, - 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x64, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x64, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x06, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x1a, 0x62, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x25, - 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x41, 0x64, 0x64, 0x72, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x92, - 0x02, 0x0a, 0x0a, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x12, 0x3b, 0x0a, - 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1f, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, - 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, - 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x31, 0x0a, 0x07, - 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, - 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x22, 0x2f, 0x0a, 0x08, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x0b, - 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, - 0x47, 0x10, 0x02, 0x22, 0x84, 0x01, 0x0a, 0x0b, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, - 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x41, 0x64, 0x64, 0x72, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x27, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x12, 0x55, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x1a, 0xfc, 0x01, + 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, + 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x49, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x45, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, + 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0f, + 0x0a, 0x0b, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x02, 0x12, + 0x0b, 0x0a, 0x07, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x45, 0x44, 0x10, 0x03, 0x1a, 0x82, 0x01, 0x0a, + 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x12, 0x41, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, + 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x1a, 0xc8, 0x01, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x3c, + 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x64, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x03, 0x61, 0x64, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x1a, 0x62, 0x0a, 0x12, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x73, + 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x92, 0x02, 0x0a, 0x0a, 0x44, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x12, 0x3b, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, + 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x52, 0x08, 0x73, 0x65, 0x76, + 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x2f, 0x0a, + 0x08, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x22, 0x84, + 0x01, 0x0a, 0x0b, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1f, + 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, + 0x2b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x50, 0x6f, 0x73, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x4b, 0x0a, 0x09, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x79, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x62, 0x79, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, - 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0xb5, 0x09, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x12, 0x2e, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x1a, 0xe6, 0x01, 0x0a, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x3c, 0x0a, 0x0a, - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x0a, - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, - 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, - 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x1a, 0xc1, 0x02, 0x0a, 0x09, - 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x0a, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3e, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, - 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, - 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x1a, - 0xef, 0x01, 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, - 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x05, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, + 0x63, 0x65, 0x50, 0x6f, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x27, 0x0a, 0x03, + 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6f, 0x73, + 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x4b, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, + 0x6f, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x79, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x04, 0x62, 0x79, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, + 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, + 0x6d, 0x6e, 0x22, 0xb5, 0x09, 0x0a, 0x06, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x2e, 0x0a, + 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x1a, 0xe6, 0x01, + 0x0a, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x3c, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x44, 0x0a, 0x07, - 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, + 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, + 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x1a, 0xc1, 0x02, 0x0a, 0x09, 0x41, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3a, 0x0a, 0x0b, + 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x0a, 0x6e, 0x65, + 0x73, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x4e, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x22, 0x4d, 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, - 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, - 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, - 0x53, 0x54, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, - 0x03, 0x4d, 0x41, 0x50, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, - 0x05, 0x1a, 0xcb, 0x01, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3c, 0x0a, 0x0a, - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x0a, - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x07, 0x6e, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x74, 0x65, + 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, + 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, + 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, + 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x1a, 0xef, 0x01, 0x0a, 0x0b, 0x4e, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, + 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x44, 0x0a, 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4e, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x4d, 0x0a, + 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, + 0x47, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, 0x12, + 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x50, 0x10, + 0x04, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x05, 0x1a, 0xcb, 0x01, 0x0a, + 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, - 0x64, 0x65, 0x52, 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x42, 0x0a, 0x0b, 0x4e, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, - 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, 0x12, 0x07, 0x0a, - 0x03, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x50, 0x10, 0x04, 0x1a, - 0x8d, 0x01, 0x0a, 0x09, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x3b, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x23, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x21, 0x0a, 0x06, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, - 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x41, 0x52, 0x4b, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x22, - 0xa7, 0x01, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x2a, 0x0a, 0x07, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x60, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, - 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xc8, 0x03, 0x0a, 0x14, 0x46, 0x65, - 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x1a, 0x97, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x63, 0x61, 0x63, 0x68, 0x65, 0x44, 0x69, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, - 0x72, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x74, 0x66, - 0x6f, 0x72, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x1a, 0x8f, 0x01, 0x0a, - 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x50, 0x6c, 0x61, - 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, - 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, - 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x1a, 0x83, - 0x01, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x12, 0x37, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x07, 0x6e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x07, 0x6e, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x42, 0x0a, 0x0b, 0x4e, 0x65, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x08, + 0x0a, 0x04, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, + 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x50, 0x10, 0x04, 0x1a, 0x8d, 0x01, 0x0a, 0x09, 0x44, + 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x06, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, + 0x6f, 0x63, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, + 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x21, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, + 0x4d, 0x41, 0x52, 0x4b, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x22, 0xa7, 0x01, 0x0a, 0x17, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x2a, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x1a, 0x60, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, - 0x74, 0x69, 0x63, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x15, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x2a, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x60, 0x0a, 0x08, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, - 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, - 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xb7, 0x01, 0x0a, - 0x17, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x44, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, - 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x56, - 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x38, 0x0a, 0x0b, - 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, - 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, - 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x94, 0x01, 0x0a, 0x12, 0x46, 0x65, 0x74, 0x63, 0x68, - 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x1a, 0x38, 0x0a, - 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, - 0x65, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x63, - 0x68, 0x65, 0x44, 0x69, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x1a, 0x44, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, - 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, - 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x2a, 0x32, 0x0a, - 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, - 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x41, - 0x4e, 0x41, 0x47, 0x45, 0x44, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x41, 0x54, 0x41, 0x10, - 0x02, 0x2a, 0x35, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, 0x0a, - 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x45, 0x46, - 0x52, 0x45, 0x53, 0x48, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, - 0x45, 0x53, 0x54, 0x52, 0x4f, 0x59, 0x10, 0x02, 0x2a, 0x44, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, - 0x12, 0x08, 0x0a, 0x04, 0x52, 0x45, 0x41, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, - 0x45, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, - 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x04, 0x32, 0x90, - 0x01, 0x0a, 0x05, 0x53, 0x65, 0x74, 0x75, 0x70, 0x12, 0x4a, 0x0a, 0x09, 0x48, 0x61, 0x6e, 0x64, - 0x73, 0x68, 0x61, 0x6b, 0x65, 0x12, 0x1d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x18, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x32, 0xc8, 0x0a, 0x0a, 0x0c, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, - 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x10, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x24, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, - 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, - 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x44, - 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x44, - 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x15, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, - 0x63, 0x6b, 0x73, 0x12, 0x29, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, - 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, + 0x74, 0x69, 0x63, 0x73, 0x22, 0xc8, 0x03, 0x0a, 0x14, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x1a, 0x97, 0x01, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x44, 0x69, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x06, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x1a, 0x8f, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, + 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x1a, 0x83, 0x01, 0x0a, 0x0e, 0x50, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x37, 0x0a, 0x08, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x08, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, + 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, + 0xa5, 0x01, 0x0a, 0x15, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x2a, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x41, 0x64, 0x64, 0x72, 0x1a, 0x60, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, + 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, + 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, + 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0xb7, 0x01, 0x0a, 0x17, 0x4d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, + 0x64, 0x64, 0x72, 0x1a, 0x44, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x56, 0x0a, 0x08, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x38, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, + 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, + 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, + 0x73, 0x22, 0x94, 0x01, 0x0a, 0x12, 0x46, 0x65, 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x1a, 0x38, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x64, 0x69, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x63, 0x68, 0x65, 0x44, 0x69, 0x72, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x72, 0x6c, 0x1a, 0x44, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, + 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, + 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x52, 0x0b, 0x64, 0x69, 0x61, + 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x2a, 0x32, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, + 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x41, 0x54, 0x41, 0x10, 0x02, 0x2a, 0x35, 0x0a, 0x08, + 0x50, 0x6c, 0x61, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, + 0x41, 0x4c, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, 0x5f, + 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x53, 0x54, 0x52, 0x4f, + 0x59, 0x10, 0x02, 0x2a, 0x44, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, + 0x45, 0x41, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, + 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, + 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x04, 0x32, 0x90, 0x01, 0x0a, 0x05, 0x53, 0x65, + 0x74, 0x75, 0x70, 0x12, 0x4a, 0x0a, 0x09, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, + 0x12, 0x1d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x48, 0x61, + 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x48, 0x61, 0x6e, + 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3b, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x18, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x53, + 0x74, 0x6f, 0x70, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xc8, 0x0a, 0x0a, + 0x0c, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x5f, 0x0a, + 0x10, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, + 0x65, 0x12, 0x24, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, + 0x0a, 0x11, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, + 0x64, 0x6c, 0x65, 0x12, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, + 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, + 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x65, 0x72, + 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x71, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, + 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x2a, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x44, 0x65, + 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, + 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, + 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x2e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x29, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, - 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x14, 0x43, 0x6c, - 0x6f, 0x73, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, - 0x6b, 0x73, 0x12, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, - 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x44, - 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x86, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4c, - 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x65, 0x70, - 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, + 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x70, + 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x14, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x44, 0x65, + 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x28, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, + 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, + 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x86, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, - 0x63, 0x69, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, - 0x6b, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x65, 0x70, 0x65, 0x6e, - 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x76, 0x0a, 0x18, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x2c, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x74, 0x0a, 0x17, 0x4f, 0x70, 0x65, 0x6e, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, - 0x0a, 0x18, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x2c, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, - 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, - 0x0a, 0x13, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, - 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x25, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xa2, 0x07, 0x0a, - 0x06, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x73, 0x12, 0x71, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x17, 0x43, 0x6c, - 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x7d, 0x0a, 0x1a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, - 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x8f, 0x01, 0x0a, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x34, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, - 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x5e, 0x0a, 0x10, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, - 0x01, 0x12, 0x61, 0x0a, 0x11, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x30, 0x01, 0x12, 0x65, 0x0a, 0x12, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x26, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, - 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x17, 0x49, - 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, - 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x32, 0xba, 0x04, 0x0a, 0x08, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x12, 0x74, - 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x14, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x28, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, - 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x6e, 0x0a, 0x15, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x74, 0x65, 0x72, - 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, + 0x63, 0x69, 0x65, 0x73, 0x12, 0x31, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, + 0x65, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x18, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x30, 0x01, 0x12, 0x74, 0x0a, 0x17, 0x4f, 0x70, 0x65, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x2b, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, + 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x18, 0x43, 0x6c, 0x6f, + 0x73, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, + 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x65, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x13, 0x47, 0x65, 0x74, + 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, + 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xa2, 0x07, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x73, 0x12, 0x71, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x74, + 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x17, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, + 0x6f, 0x73, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x1a, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x74, 0x65, 0x72, 0x72, + 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x20, 0x46, + 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x34, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x10, + 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x12, 0x24, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, + 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, + 0x72, 0x6d, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x61, 0x0a, 0x11, + 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x12, 0x25, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, + 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, + 0x65, 0x0a, 0x12, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, + 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, + 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x49, + 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, + 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x49, 0x6e, 0x73, 0x70, + 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xba, 0x04, 0x0a, + 0x08, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x12, 0x74, 0x0a, 0x17, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x6b, 0x0a, 0x14, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x28, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, + 0x65, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x15, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x74, 0x0a, 0x17, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x2b, 0x2e, 0x74, - 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, - 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, - 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x2e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x12, 0x46, 0x65, 0x74, 0x63, 0x68, - 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x26, 0x2e, - 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, - 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2a, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x17, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x65, 0x0a, 0x12, 0x46, 0x65, 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x26, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, + 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x27, 0x2e, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x31, 0x2e, 0x46, 0x65, + 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -10283,375 +10586,386 @@ func file_terraform1_proto_rawDescGZIP() []byte { return file_terraform1_proto_rawDescData } -var file_terraform1_proto_enumTypes = make([]protoimpl.EnumInfo, 12) -var file_terraform1_proto_msgTypes = make([]protoimpl.MessageInfo, 150) +var file_terraform1_proto_enumTypes = make([]protoimpl.EnumInfo, 13) +var file_terraform1_proto_msgTypes = make([]protoimpl.MessageInfo, 153) var file_terraform1_proto_goTypes = []interface{}{ (ResourceMode)(0), // 0: terraform1.ResourceMode (PlanMode)(0), // 1: terraform1.PlanMode (ChangeType)(0), // 2: terraform1.ChangeType (BuildProviderPluginCache_Event_FetchComplete_AuthResult)(0), // 3: terraform1.BuildProviderPluginCache.Event.FetchComplete.AuthResult (FindStackConfigurationComponents_Instances)(0), // 4: terraform1.FindStackConfigurationComponents.Instances - (StackChangeProgress_ComponentInstanceStatus_Status)(0), // 5: terraform1.StackChangeProgress.ComponentInstanceStatus.Status - (StackChangeProgress_ResourceInstanceStatus_Status)(0), // 6: terraform1.StackChangeProgress.ResourceInstanceStatus.Status - (StackChangeProgress_ProvisionerStatus_Status)(0), // 7: terraform1.StackChangeProgress.ProvisionerStatus.Status - (Diagnostic_Severity)(0), // 8: terraform1.Diagnostic.Severity - (Schema_NestedBlock_NestingMode)(0), // 9: terraform1.Schema.NestedBlock.NestingMode - (Schema_Object_NestingMode)(0), // 10: terraform1.Schema.Object.NestingMode - (Schema_DocString_Format)(0), // 11: terraform1.Schema.DocString.Format - (*Handshake)(nil), // 12: terraform1.Handshake - (*Stop)(nil), // 13: terraform1.Stop - (*ClientCapabilities)(nil), // 14: terraform1.ClientCapabilities - (*ServerCapabilities)(nil), // 15: terraform1.ServerCapabilities - (*Config)(nil), // 16: terraform1.Config - (*HostCredential)(nil), // 17: terraform1.HostCredential - (*OpenSourceBundle)(nil), // 18: terraform1.OpenSourceBundle - (*CloseSourceBundle)(nil), // 19: terraform1.CloseSourceBundle - (*OpenDependencyLockFile)(nil), // 20: terraform1.OpenDependencyLockFile - (*CreateDependencyLocks)(nil), // 21: terraform1.CreateDependencyLocks - (*CloseDependencyLocks)(nil), // 22: terraform1.CloseDependencyLocks - (*GetLockedProviderDependencies)(nil), // 23: terraform1.GetLockedProviderDependencies - (*BuildProviderPluginCache)(nil), // 24: terraform1.BuildProviderPluginCache - (*OpenProviderPluginCache)(nil), // 25: terraform1.OpenProviderPluginCache - (*CloseProviderPluginCache)(nil), // 26: terraform1.CloseProviderPluginCache - (*GetCachedProviders)(nil), // 27: terraform1.GetCachedProviders - (*GetBuiltInProviders)(nil), // 28: terraform1.GetBuiltInProviders - (*GetProviderSchema)(nil), // 29: terraform1.GetProviderSchema - (*ProviderPackage)(nil), // 30: terraform1.ProviderPackage - (*ProviderSchema)(nil), // 31: terraform1.ProviderSchema - (*OpenStackConfiguration)(nil), // 32: terraform1.OpenStackConfiguration - (*CloseStackConfiguration)(nil), // 33: terraform1.CloseStackConfiguration - (*ValidateStackConfiguration)(nil), // 34: terraform1.ValidateStackConfiguration - (*FindStackConfigurationComponents)(nil), // 35: terraform1.FindStackConfigurationComponents - (*PlanStackChanges)(nil), // 36: terraform1.PlanStackChanges - (*ApplyStackChanges)(nil), // 37: terraform1.ApplyStackChanges - (*OpenStackInspector)(nil), // 38: terraform1.OpenStackInspector - (*InspectExpressionResult)(nil), // 39: terraform1.InspectExpressionResult - (*DynamicValue)(nil), // 40: terraform1.DynamicValue - (*DynamicValueChange)(nil), // 41: terraform1.DynamicValueChange - (*DynamicValueWithSource)(nil), // 42: terraform1.DynamicValueWithSource - (*AttributePath)(nil), // 43: terraform1.AttributePath - (*ComponentInstanceInStackAddr)(nil), // 44: terraform1.ComponentInstanceInStackAddr - (*ResourceInstanceInStackAddr)(nil), // 45: terraform1.ResourceInstanceInStackAddr - (*ResourceInstanceObjectInStackAddr)(nil), // 46: terraform1.ResourceInstanceObjectInStackAddr - (*SourceAddress)(nil), // 47: terraform1.SourceAddress - (*PlannedChange)(nil), // 48: terraform1.PlannedChange - (*AppliedChange)(nil), // 49: terraform1.AppliedChange - (*StackChangeProgress)(nil), // 50: terraform1.StackChangeProgress - (*Diagnostic)(nil), // 51: terraform1.Diagnostic - (*SourceRange)(nil), // 52: terraform1.SourceRange - (*SourcePos)(nil), // 53: terraform1.SourcePos - (*Schema)(nil), // 54: terraform1.Schema - (*ProviderPackageVersions)(nil), // 55: terraform1.ProviderPackageVersions - (*FetchProviderPackage)(nil), // 56: terraform1.FetchProviderPackage - (*ModulePackageVersions)(nil), // 57: terraform1.ModulePackageVersions - (*ModulePackageSourceAddr)(nil), // 58: terraform1.ModulePackageSourceAddr - (*FetchModulePackage)(nil), // 59: terraform1.FetchModulePackage - (*Handshake_Request)(nil), // 60: terraform1.Handshake.Request - (*Handshake_Response)(nil), // 61: terraform1.Handshake.Response - (*Stop_Request)(nil), // 62: terraform1.Stop.Request - (*Stop_Response)(nil), // 63: terraform1.Stop.Response - nil, // 64: terraform1.Config.CredentialsEntry - (*OpenSourceBundle_Request)(nil), // 65: terraform1.OpenSourceBundle.Request - (*OpenSourceBundle_Response)(nil), // 66: terraform1.OpenSourceBundle.Response - (*CloseSourceBundle_Request)(nil), // 67: terraform1.CloseSourceBundle.Request - (*CloseSourceBundle_Response)(nil), // 68: terraform1.CloseSourceBundle.Response - (*OpenDependencyLockFile_Request)(nil), // 69: terraform1.OpenDependencyLockFile.Request - (*OpenDependencyLockFile_Response)(nil), // 70: terraform1.OpenDependencyLockFile.Response - (*CreateDependencyLocks_Request)(nil), // 71: terraform1.CreateDependencyLocks.Request - (*CreateDependencyLocks_Response)(nil), // 72: terraform1.CreateDependencyLocks.Response - (*CloseDependencyLocks_Request)(nil), // 73: terraform1.CloseDependencyLocks.Request - (*CloseDependencyLocks_Response)(nil), // 74: terraform1.CloseDependencyLocks.Response - (*GetLockedProviderDependencies_Request)(nil), // 75: terraform1.GetLockedProviderDependencies.Request - (*GetLockedProviderDependencies_Response)(nil), // 76: terraform1.GetLockedProviderDependencies.Response - (*BuildProviderPluginCache_Request)(nil), // 77: terraform1.BuildProviderPluginCache.Request - (*BuildProviderPluginCache_Event)(nil), // 78: terraform1.BuildProviderPluginCache.Event - (*BuildProviderPluginCache_Request_InstallMethod)(nil), // 79: terraform1.BuildProviderPluginCache.Request.InstallMethod - (*BuildProviderPluginCache_Event_Pending)(nil), // 80: terraform1.BuildProviderPluginCache.Event.Pending - (*BuildProviderPluginCache_Event_ProviderConstraints)(nil), // 81: terraform1.BuildProviderPluginCache.Event.ProviderConstraints - (*BuildProviderPluginCache_Event_ProviderVersion)(nil), // 82: terraform1.BuildProviderPluginCache.Event.ProviderVersion - (*BuildProviderPluginCache_Event_ProviderWarnings)(nil), // 83: terraform1.BuildProviderPluginCache.Event.ProviderWarnings - (*BuildProviderPluginCache_Event_FetchBegin)(nil), // 84: terraform1.BuildProviderPluginCache.Event.FetchBegin - (*BuildProviderPluginCache_Event_FetchComplete)(nil), // 85: terraform1.BuildProviderPluginCache.Event.FetchComplete - (*OpenProviderPluginCache_Request)(nil), // 86: terraform1.OpenProviderPluginCache.Request - (*OpenProviderPluginCache_Response)(nil), // 87: terraform1.OpenProviderPluginCache.Response - (*CloseProviderPluginCache_Request)(nil), // 88: terraform1.CloseProviderPluginCache.Request - (*CloseProviderPluginCache_Response)(nil), // 89: terraform1.CloseProviderPluginCache.Response - (*GetCachedProviders_Request)(nil), // 90: terraform1.GetCachedProviders.Request - (*GetCachedProviders_Response)(nil), // 91: terraform1.GetCachedProviders.Response - (*GetBuiltInProviders_Request)(nil), // 92: terraform1.GetBuiltInProviders.Request - (*GetBuiltInProviders_Response)(nil), // 93: terraform1.GetBuiltInProviders.Response - (*GetProviderSchema_Request)(nil), // 94: terraform1.GetProviderSchema.Request - (*GetProviderSchema_Response)(nil), // 95: terraform1.GetProviderSchema.Response - nil, // 96: terraform1.ProviderSchema.ManagedResourceTypesEntry - nil, // 97: terraform1.ProviderSchema.DataResourceTypesEntry - (*OpenStackConfiguration_Request)(nil), // 98: terraform1.OpenStackConfiguration.Request - (*OpenStackConfiguration_Response)(nil), // 99: terraform1.OpenStackConfiguration.Response - (*CloseStackConfiguration_Request)(nil), // 100: terraform1.CloseStackConfiguration.Request - (*CloseStackConfiguration_Response)(nil), // 101: terraform1.CloseStackConfiguration.Response - (*ValidateStackConfiguration_Request)(nil), // 102: terraform1.ValidateStackConfiguration.Request - (*ValidateStackConfiguration_Response)(nil), // 103: terraform1.ValidateStackConfiguration.Response - (*FindStackConfigurationComponents_Request)(nil), // 104: terraform1.FindStackConfigurationComponents.Request - (*FindStackConfigurationComponents_Response)(nil), // 105: terraform1.FindStackConfigurationComponents.Response - (*FindStackConfigurationComponents_StackConfig)(nil), // 106: terraform1.FindStackConfigurationComponents.StackConfig - (*FindStackConfigurationComponents_EmbeddedStack)(nil), // 107: terraform1.FindStackConfigurationComponents.EmbeddedStack - (*FindStackConfigurationComponents_Component)(nil), // 108: terraform1.FindStackConfigurationComponents.Component - nil, // 109: terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry - nil, // 110: terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry - (*PlanStackChanges_Request)(nil), // 111: terraform1.PlanStackChanges.Request - (*PlanStackChanges_Event)(nil), // 112: terraform1.PlanStackChanges.Event - nil, // 113: terraform1.PlanStackChanges.Request.PreviousStateEntry - nil, // 114: terraform1.PlanStackChanges.Request.InputValuesEntry - (*ApplyStackChanges_Request)(nil), // 115: terraform1.ApplyStackChanges.Request - (*ApplyStackChanges_Event)(nil), // 116: terraform1.ApplyStackChanges.Event - (*OpenStackInspector_Request)(nil), // 117: terraform1.OpenStackInspector.Request - (*OpenStackInspector_Response)(nil), // 118: terraform1.OpenStackInspector.Response - nil, // 119: terraform1.OpenStackInspector.Request.StateEntry - nil, // 120: terraform1.OpenStackInspector.Request.InputValuesEntry - (*InspectExpressionResult_Request)(nil), // 121: terraform1.InspectExpressionResult.Request - (*InspectExpressionResult_Response)(nil), // 122: terraform1.InspectExpressionResult.Response - (*AttributePath_Step)(nil), // 123: terraform1.AttributePath.Step - (*PlannedChange_ChangeDescription)(nil), // 124: terraform1.PlannedChange.ChangeDescription - (*PlannedChange_ComponentInstance)(nil), // 125: terraform1.PlannedChange.ComponentInstance - (*PlannedChange_ResourceInstance)(nil), // 126: terraform1.PlannedChange.ResourceInstance - (*PlannedChange_OutputValue)(nil), // 127: terraform1.PlannedChange.OutputValue - (*PlannedChange_ResourceInstance_Moved)(nil), // 128: terraform1.PlannedChange.ResourceInstance.Moved - (*PlannedChange_ResourceInstance_Imported)(nil), // 129: terraform1.PlannedChange.ResourceInstance.Imported - (*AppliedChange_RawChange)(nil), // 130: terraform1.AppliedChange.RawChange - (*AppliedChange_ChangeDescription)(nil), // 131: terraform1.AppliedChange.ChangeDescription - (*AppliedChange_ResourceInstance)(nil), // 132: terraform1.AppliedChange.ResourceInstance - (*AppliedChange_ComponentInstance)(nil), // 133: terraform1.AppliedChange.ComponentInstance - (*AppliedChange_OutputValue)(nil), // 134: terraform1.AppliedChange.OutputValue - (*AppliedChange_Nothing)(nil), // 135: terraform1.AppliedChange.Nothing - nil, // 136: terraform1.AppliedChange.ComponentInstance.OutputValuesEntry - (*StackChangeProgress_ComponentInstanceStatus)(nil), // 137: terraform1.StackChangeProgress.ComponentInstanceStatus - (*StackChangeProgress_ResourceInstanceStatus)(nil), // 138: terraform1.StackChangeProgress.ResourceInstanceStatus - (*StackChangeProgress_ResourceInstancePlannedChange)(nil), // 139: terraform1.StackChangeProgress.ResourceInstancePlannedChange - (*StackChangeProgress_ProvisionerStatus)(nil), // 140: terraform1.StackChangeProgress.ProvisionerStatus - (*StackChangeProgress_ProvisionerOutput)(nil), // 141: terraform1.StackChangeProgress.ProvisionerOutput - (*StackChangeProgress_ComponentInstanceChanges)(nil), // 142: terraform1.StackChangeProgress.ComponentInstanceChanges - (*StackChangeProgress_ComponentInstances)(nil), // 143: terraform1.StackChangeProgress.ComponentInstances - (*StackChangeProgress_ResourceInstancePlannedChange_Moved)(nil), // 144: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved - (*StackChangeProgress_ResourceInstancePlannedChange_Imported)(nil), // 145: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Imported - (*Schema_Block)(nil), // 146: terraform1.Schema.Block - (*Schema_Attribute)(nil), // 147: terraform1.Schema.Attribute - (*Schema_NestedBlock)(nil), // 148: terraform1.Schema.NestedBlock - (*Schema_Object)(nil), // 149: terraform1.Schema.Object - (*Schema_DocString)(nil), // 150: terraform1.Schema.DocString - (*ProviderPackageVersions_Request)(nil), // 151: terraform1.ProviderPackageVersions.Request - (*ProviderPackageVersions_Response)(nil), // 152: terraform1.ProviderPackageVersions.Response - (*FetchProviderPackage_Request)(nil), // 153: terraform1.FetchProviderPackage.Request - (*FetchProviderPackage_Response)(nil), // 154: terraform1.FetchProviderPackage.Response - (*FetchProviderPackage_PlatformResult)(nil), // 155: terraform1.FetchProviderPackage.PlatformResult - (*ModulePackageVersions_Request)(nil), // 156: terraform1.ModulePackageVersions.Request - (*ModulePackageVersions_Response)(nil), // 157: terraform1.ModulePackageVersions.Response - (*ModulePackageSourceAddr_Request)(nil), // 158: terraform1.ModulePackageSourceAddr.Request - (*ModulePackageSourceAddr_Response)(nil), // 159: terraform1.ModulePackageSourceAddr.Response - (*FetchModulePackage_Request)(nil), // 160: terraform1.FetchModulePackage.Request - (*FetchModulePackage_Response)(nil), // 161: terraform1.FetchModulePackage.Response - (*anypb.Any)(nil), // 162: google.protobuf.Any + (Deferred_Reason)(0), // 5: terraform1.Deferred.Reason + (StackChangeProgress_ComponentInstanceStatus_Status)(0), // 6: terraform1.StackChangeProgress.ComponentInstanceStatus.Status + (StackChangeProgress_ResourceInstanceStatus_Status)(0), // 7: terraform1.StackChangeProgress.ResourceInstanceStatus.Status + (StackChangeProgress_ProvisionerStatus_Status)(0), // 8: terraform1.StackChangeProgress.ProvisionerStatus.Status + (Diagnostic_Severity)(0), // 9: terraform1.Diagnostic.Severity + (Schema_NestedBlock_NestingMode)(0), // 10: terraform1.Schema.NestedBlock.NestingMode + (Schema_Object_NestingMode)(0), // 11: terraform1.Schema.Object.NestingMode + (Schema_DocString_Format)(0), // 12: terraform1.Schema.DocString.Format + (*Handshake)(nil), // 13: terraform1.Handshake + (*Stop)(nil), // 14: terraform1.Stop + (*ClientCapabilities)(nil), // 15: terraform1.ClientCapabilities + (*ServerCapabilities)(nil), // 16: terraform1.ServerCapabilities + (*Config)(nil), // 17: terraform1.Config + (*HostCredential)(nil), // 18: terraform1.HostCredential + (*OpenSourceBundle)(nil), // 19: terraform1.OpenSourceBundle + (*CloseSourceBundle)(nil), // 20: terraform1.CloseSourceBundle + (*OpenDependencyLockFile)(nil), // 21: terraform1.OpenDependencyLockFile + (*CreateDependencyLocks)(nil), // 22: terraform1.CreateDependencyLocks + (*CloseDependencyLocks)(nil), // 23: terraform1.CloseDependencyLocks + (*GetLockedProviderDependencies)(nil), // 24: terraform1.GetLockedProviderDependencies + (*BuildProviderPluginCache)(nil), // 25: terraform1.BuildProviderPluginCache + (*OpenProviderPluginCache)(nil), // 26: terraform1.OpenProviderPluginCache + (*CloseProviderPluginCache)(nil), // 27: terraform1.CloseProviderPluginCache + (*GetCachedProviders)(nil), // 28: terraform1.GetCachedProviders + (*GetBuiltInProviders)(nil), // 29: terraform1.GetBuiltInProviders + (*GetProviderSchema)(nil), // 30: terraform1.GetProviderSchema + (*ProviderPackage)(nil), // 31: terraform1.ProviderPackage + (*ProviderSchema)(nil), // 32: terraform1.ProviderSchema + (*OpenStackConfiguration)(nil), // 33: terraform1.OpenStackConfiguration + (*CloseStackConfiguration)(nil), // 34: terraform1.CloseStackConfiguration + (*ValidateStackConfiguration)(nil), // 35: terraform1.ValidateStackConfiguration + (*FindStackConfigurationComponents)(nil), // 36: terraform1.FindStackConfigurationComponents + (*PlanStackChanges)(nil), // 37: terraform1.PlanStackChanges + (*ApplyStackChanges)(nil), // 38: terraform1.ApplyStackChanges + (*OpenStackInspector)(nil), // 39: terraform1.OpenStackInspector + (*InspectExpressionResult)(nil), // 40: terraform1.InspectExpressionResult + (*DynamicValue)(nil), // 41: terraform1.DynamicValue + (*DynamicValueChange)(nil), // 42: terraform1.DynamicValueChange + (*DynamicValueWithSource)(nil), // 43: terraform1.DynamicValueWithSource + (*AttributePath)(nil), // 44: terraform1.AttributePath + (*ComponentInstanceInStackAddr)(nil), // 45: terraform1.ComponentInstanceInStackAddr + (*ResourceInstanceInStackAddr)(nil), // 46: terraform1.ResourceInstanceInStackAddr + (*ResourceInstanceObjectInStackAddr)(nil), // 47: terraform1.ResourceInstanceObjectInStackAddr + (*SourceAddress)(nil), // 48: terraform1.SourceAddress + (*PlannedChange)(nil), // 49: terraform1.PlannedChange + (*Deferred)(nil), // 50: terraform1.Deferred + (*AppliedChange)(nil), // 51: terraform1.AppliedChange + (*StackChangeProgress)(nil), // 52: terraform1.StackChangeProgress + (*Diagnostic)(nil), // 53: terraform1.Diagnostic + (*SourceRange)(nil), // 54: terraform1.SourceRange + (*SourcePos)(nil), // 55: terraform1.SourcePos + (*Schema)(nil), // 56: terraform1.Schema + (*ProviderPackageVersions)(nil), // 57: terraform1.ProviderPackageVersions + (*FetchProviderPackage)(nil), // 58: terraform1.FetchProviderPackage + (*ModulePackageVersions)(nil), // 59: terraform1.ModulePackageVersions + (*ModulePackageSourceAddr)(nil), // 60: terraform1.ModulePackageSourceAddr + (*FetchModulePackage)(nil), // 61: terraform1.FetchModulePackage + (*Handshake_Request)(nil), // 62: terraform1.Handshake.Request + (*Handshake_Response)(nil), // 63: terraform1.Handshake.Response + (*Stop_Request)(nil), // 64: terraform1.Stop.Request + (*Stop_Response)(nil), // 65: terraform1.Stop.Response + nil, // 66: terraform1.Config.CredentialsEntry + (*OpenSourceBundle_Request)(nil), // 67: terraform1.OpenSourceBundle.Request + (*OpenSourceBundle_Response)(nil), // 68: terraform1.OpenSourceBundle.Response + (*CloseSourceBundle_Request)(nil), // 69: terraform1.CloseSourceBundle.Request + (*CloseSourceBundle_Response)(nil), // 70: terraform1.CloseSourceBundle.Response + (*OpenDependencyLockFile_Request)(nil), // 71: terraform1.OpenDependencyLockFile.Request + (*OpenDependencyLockFile_Response)(nil), // 72: terraform1.OpenDependencyLockFile.Response + (*CreateDependencyLocks_Request)(nil), // 73: terraform1.CreateDependencyLocks.Request + (*CreateDependencyLocks_Response)(nil), // 74: terraform1.CreateDependencyLocks.Response + (*CloseDependencyLocks_Request)(nil), // 75: terraform1.CloseDependencyLocks.Request + (*CloseDependencyLocks_Response)(nil), // 76: terraform1.CloseDependencyLocks.Response + (*GetLockedProviderDependencies_Request)(nil), // 77: terraform1.GetLockedProviderDependencies.Request + (*GetLockedProviderDependencies_Response)(nil), // 78: terraform1.GetLockedProviderDependencies.Response + (*BuildProviderPluginCache_Request)(nil), // 79: terraform1.BuildProviderPluginCache.Request + (*BuildProviderPluginCache_Event)(nil), // 80: terraform1.BuildProviderPluginCache.Event + (*BuildProviderPluginCache_Request_InstallMethod)(nil), // 81: terraform1.BuildProviderPluginCache.Request.InstallMethod + (*BuildProviderPluginCache_Event_Pending)(nil), // 82: terraform1.BuildProviderPluginCache.Event.Pending + (*BuildProviderPluginCache_Event_ProviderConstraints)(nil), // 83: terraform1.BuildProviderPluginCache.Event.ProviderConstraints + (*BuildProviderPluginCache_Event_ProviderVersion)(nil), // 84: terraform1.BuildProviderPluginCache.Event.ProviderVersion + (*BuildProviderPluginCache_Event_ProviderWarnings)(nil), // 85: terraform1.BuildProviderPluginCache.Event.ProviderWarnings + (*BuildProviderPluginCache_Event_FetchBegin)(nil), // 86: terraform1.BuildProviderPluginCache.Event.FetchBegin + (*BuildProviderPluginCache_Event_FetchComplete)(nil), // 87: terraform1.BuildProviderPluginCache.Event.FetchComplete + (*OpenProviderPluginCache_Request)(nil), // 88: terraform1.OpenProviderPluginCache.Request + (*OpenProviderPluginCache_Response)(nil), // 89: terraform1.OpenProviderPluginCache.Response + (*CloseProviderPluginCache_Request)(nil), // 90: terraform1.CloseProviderPluginCache.Request + (*CloseProviderPluginCache_Response)(nil), // 91: terraform1.CloseProviderPluginCache.Response + (*GetCachedProviders_Request)(nil), // 92: terraform1.GetCachedProviders.Request + (*GetCachedProviders_Response)(nil), // 93: terraform1.GetCachedProviders.Response + (*GetBuiltInProviders_Request)(nil), // 94: terraform1.GetBuiltInProviders.Request + (*GetBuiltInProviders_Response)(nil), // 95: terraform1.GetBuiltInProviders.Response + (*GetProviderSchema_Request)(nil), // 96: terraform1.GetProviderSchema.Request + (*GetProviderSchema_Response)(nil), // 97: terraform1.GetProviderSchema.Response + nil, // 98: terraform1.ProviderSchema.ManagedResourceTypesEntry + nil, // 99: terraform1.ProviderSchema.DataResourceTypesEntry + (*OpenStackConfiguration_Request)(nil), // 100: terraform1.OpenStackConfiguration.Request + (*OpenStackConfiguration_Response)(nil), // 101: terraform1.OpenStackConfiguration.Response + (*CloseStackConfiguration_Request)(nil), // 102: terraform1.CloseStackConfiguration.Request + (*CloseStackConfiguration_Response)(nil), // 103: terraform1.CloseStackConfiguration.Response + (*ValidateStackConfiguration_Request)(nil), // 104: terraform1.ValidateStackConfiguration.Request + (*ValidateStackConfiguration_Response)(nil), // 105: terraform1.ValidateStackConfiguration.Response + (*FindStackConfigurationComponents_Request)(nil), // 106: terraform1.FindStackConfigurationComponents.Request + (*FindStackConfigurationComponents_Response)(nil), // 107: terraform1.FindStackConfigurationComponents.Response + (*FindStackConfigurationComponents_StackConfig)(nil), // 108: terraform1.FindStackConfigurationComponents.StackConfig + (*FindStackConfigurationComponents_EmbeddedStack)(nil), // 109: terraform1.FindStackConfigurationComponents.EmbeddedStack + (*FindStackConfigurationComponents_Component)(nil), // 110: terraform1.FindStackConfigurationComponents.Component + nil, // 111: terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry + nil, // 112: terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry + (*PlanStackChanges_Request)(nil), // 113: terraform1.PlanStackChanges.Request + (*PlanStackChanges_Event)(nil), // 114: terraform1.PlanStackChanges.Event + nil, // 115: terraform1.PlanStackChanges.Request.PreviousStateEntry + nil, // 116: terraform1.PlanStackChanges.Request.InputValuesEntry + (*ApplyStackChanges_Request)(nil), // 117: terraform1.ApplyStackChanges.Request + (*ApplyStackChanges_Event)(nil), // 118: terraform1.ApplyStackChanges.Event + (*OpenStackInspector_Request)(nil), // 119: terraform1.OpenStackInspector.Request + (*OpenStackInspector_Response)(nil), // 120: terraform1.OpenStackInspector.Response + nil, // 121: terraform1.OpenStackInspector.Request.StateEntry + nil, // 122: terraform1.OpenStackInspector.Request.InputValuesEntry + (*InspectExpressionResult_Request)(nil), // 123: terraform1.InspectExpressionResult.Request + (*InspectExpressionResult_Response)(nil), // 124: terraform1.InspectExpressionResult.Response + (*AttributePath_Step)(nil), // 125: terraform1.AttributePath.Step + (*PlannedChange_ChangeDescription)(nil), // 126: terraform1.PlannedChange.ChangeDescription + (*PlannedChange_ComponentInstance)(nil), // 127: terraform1.PlannedChange.ComponentInstance + (*PlannedChange_ResourceInstance)(nil), // 128: terraform1.PlannedChange.ResourceInstance + (*PlannedChange_OutputValue)(nil), // 129: terraform1.PlannedChange.OutputValue + (*PlannedChange_ResourceInstanceDeferred)(nil), // 130: terraform1.PlannedChange.ResourceInstanceDeferred + (*PlannedChange_ResourceInstance_Moved)(nil), // 131: terraform1.PlannedChange.ResourceInstance.Moved + (*PlannedChange_ResourceInstance_Imported)(nil), // 132: terraform1.PlannedChange.ResourceInstance.Imported + (*AppliedChange_RawChange)(nil), // 133: terraform1.AppliedChange.RawChange + (*AppliedChange_ChangeDescription)(nil), // 134: terraform1.AppliedChange.ChangeDescription + (*AppliedChange_ResourceInstance)(nil), // 135: terraform1.AppliedChange.ResourceInstance + (*AppliedChange_ComponentInstance)(nil), // 136: terraform1.AppliedChange.ComponentInstance + (*AppliedChange_OutputValue)(nil), // 137: terraform1.AppliedChange.OutputValue + (*AppliedChange_Nothing)(nil), // 138: terraform1.AppliedChange.Nothing + nil, // 139: terraform1.AppliedChange.ComponentInstance.OutputValuesEntry + (*StackChangeProgress_ComponentInstanceStatus)(nil), // 140: terraform1.StackChangeProgress.ComponentInstanceStatus + (*StackChangeProgress_ResourceInstanceStatus)(nil), // 141: terraform1.StackChangeProgress.ResourceInstanceStatus + (*StackChangeProgress_ResourceInstancePlannedChange)(nil), // 142: terraform1.StackChangeProgress.ResourceInstancePlannedChange + (*StackChangeProgress_DeferredResourceInstancePlannedChange)(nil), // 143: terraform1.StackChangeProgress.DeferredResourceInstancePlannedChange + (*StackChangeProgress_ProvisionerStatus)(nil), // 144: terraform1.StackChangeProgress.ProvisionerStatus + (*StackChangeProgress_ProvisionerOutput)(nil), // 145: terraform1.StackChangeProgress.ProvisionerOutput + (*StackChangeProgress_ComponentInstanceChanges)(nil), // 146: terraform1.StackChangeProgress.ComponentInstanceChanges + (*StackChangeProgress_ComponentInstances)(nil), // 147: terraform1.StackChangeProgress.ComponentInstances + (*StackChangeProgress_ResourceInstancePlannedChange_Moved)(nil), // 148: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved + (*StackChangeProgress_ResourceInstancePlannedChange_Imported)(nil), // 149: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Imported + (*Schema_Block)(nil), // 150: terraform1.Schema.Block + (*Schema_Attribute)(nil), // 151: terraform1.Schema.Attribute + (*Schema_NestedBlock)(nil), // 152: terraform1.Schema.NestedBlock + (*Schema_Object)(nil), // 153: terraform1.Schema.Object + (*Schema_DocString)(nil), // 154: terraform1.Schema.DocString + (*ProviderPackageVersions_Request)(nil), // 155: terraform1.ProviderPackageVersions.Request + (*ProviderPackageVersions_Response)(nil), // 156: terraform1.ProviderPackageVersions.Response + (*FetchProviderPackage_Request)(nil), // 157: terraform1.FetchProviderPackage.Request + (*FetchProviderPackage_Response)(nil), // 158: terraform1.FetchProviderPackage.Response + (*FetchProviderPackage_PlatformResult)(nil), // 159: terraform1.FetchProviderPackage.PlatformResult + (*ModulePackageVersions_Request)(nil), // 160: terraform1.ModulePackageVersions.Request + (*ModulePackageVersions_Response)(nil), // 161: terraform1.ModulePackageVersions.Response + (*ModulePackageSourceAddr_Request)(nil), // 162: terraform1.ModulePackageSourceAddr.Request + (*ModulePackageSourceAddr_Response)(nil), // 163: terraform1.ModulePackageSourceAddr.Response + (*FetchModulePackage_Request)(nil), // 164: terraform1.FetchModulePackage.Request + (*FetchModulePackage_Response)(nil), // 165: terraform1.FetchModulePackage.Response + (*anypb.Any)(nil), // 166: google.protobuf.Any } var file_terraform1_proto_depIdxs = []int32{ - 64, // 0: terraform1.Config.credentials:type_name -> terraform1.Config.CredentialsEntry - 54, // 1: terraform1.ProviderSchema.provider_config:type_name -> terraform1.Schema - 96, // 2: terraform1.ProviderSchema.managed_resource_types:type_name -> terraform1.ProviderSchema.ManagedResourceTypesEntry - 97, // 3: terraform1.ProviderSchema.data_resource_types:type_name -> terraform1.ProviderSchema.DataResourceTypesEntry - 43, // 4: terraform1.DynamicValue.sensitive:type_name -> terraform1.AttributePath - 40, // 5: terraform1.DynamicValueChange.old:type_name -> terraform1.DynamicValue - 40, // 6: terraform1.DynamicValueChange.new:type_name -> terraform1.DynamicValue - 40, // 7: terraform1.DynamicValueWithSource.value:type_name -> terraform1.DynamicValue - 52, // 8: terraform1.DynamicValueWithSource.source_range:type_name -> terraform1.SourceRange - 123, // 9: terraform1.AttributePath.steps:type_name -> terraform1.AttributePath.Step - 162, // 10: terraform1.PlannedChange.raw:type_name -> google.protobuf.Any - 124, // 11: terraform1.PlannedChange.descriptions:type_name -> terraform1.PlannedChange.ChangeDescription - 130, // 12: terraform1.AppliedChange.raw:type_name -> terraform1.AppliedChange.RawChange - 131, // 13: terraform1.AppliedChange.descriptions:type_name -> terraform1.AppliedChange.ChangeDescription - 137, // 14: terraform1.StackChangeProgress.component_instance_status:type_name -> terraform1.StackChangeProgress.ComponentInstanceStatus - 138, // 15: terraform1.StackChangeProgress.resource_instance_status:type_name -> terraform1.StackChangeProgress.ResourceInstanceStatus - 139, // 16: terraform1.StackChangeProgress.resource_instance_planned_change:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange - 140, // 17: terraform1.StackChangeProgress.provisioner_status:type_name -> terraform1.StackChangeProgress.ProvisionerStatus - 141, // 18: terraform1.StackChangeProgress.provisioner_output:type_name -> terraform1.StackChangeProgress.ProvisionerOutput - 142, // 19: terraform1.StackChangeProgress.component_instance_changes:type_name -> terraform1.StackChangeProgress.ComponentInstanceChanges - 143, // 20: terraform1.StackChangeProgress.component_instances:type_name -> terraform1.StackChangeProgress.ComponentInstances - 8, // 21: terraform1.Diagnostic.severity:type_name -> terraform1.Diagnostic.Severity - 52, // 22: terraform1.Diagnostic.subject:type_name -> terraform1.SourceRange - 52, // 23: terraform1.Diagnostic.context:type_name -> terraform1.SourceRange - 53, // 24: terraform1.SourceRange.start:type_name -> terraform1.SourcePos - 53, // 25: terraform1.SourceRange.end:type_name -> terraform1.SourcePos - 146, // 26: terraform1.Schema.block:type_name -> terraform1.Schema.Block - 14, // 27: terraform1.Handshake.Request.capabilities:type_name -> terraform1.ClientCapabilities - 16, // 28: terraform1.Handshake.Request.config:type_name -> terraform1.Config - 15, // 29: terraform1.Handshake.Response.capabilities:type_name -> terraform1.ServerCapabilities - 17, // 30: terraform1.Config.CredentialsEntry.value:type_name -> terraform1.HostCredential - 47, // 31: terraform1.OpenDependencyLockFile.Request.source_address:type_name -> terraform1.SourceAddress - 51, // 32: terraform1.OpenDependencyLockFile.Response.diagnostics:type_name -> terraform1.Diagnostic - 30, // 33: terraform1.CreateDependencyLocks.Request.provider_selections:type_name -> terraform1.ProviderPackage - 30, // 34: terraform1.GetLockedProviderDependencies.Response.selected_providers:type_name -> terraform1.ProviderPackage - 79, // 35: terraform1.BuildProviderPluginCache.Request.installation_methods:type_name -> terraform1.BuildProviderPluginCache.Request.InstallMethod - 80, // 36: terraform1.BuildProviderPluginCache.Event.pending:type_name -> terraform1.BuildProviderPluginCache.Event.Pending - 82, // 37: terraform1.BuildProviderPluginCache.Event.already_installed:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion - 82, // 38: terraform1.BuildProviderPluginCache.Event.built_in:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion - 81, // 39: terraform1.BuildProviderPluginCache.Event.query_begin:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderConstraints - 82, // 40: terraform1.BuildProviderPluginCache.Event.query_success:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion - 83, // 41: terraform1.BuildProviderPluginCache.Event.query_warnings:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderWarnings - 84, // 42: terraform1.BuildProviderPluginCache.Event.fetch_begin:type_name -> terraform1.BuildProviderPluginCache.Event.FetchBegin - 85, // 43: terraform1.BuildProviderPluginCache.Event.fetch_complete:type_name -> terraform1.BuildProviderPluginCache.Event.FetchComplete - 51, // 44: terraform1.BuildProviderPluginCache.Event.diagnostic:type_name -> terraform1.Diagnostic - 81, // 45: terraform1.BuildProviderPluginCache.Event.Pending.expected:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderConstraints - 82, // 46: terraform1.BuildProviderPluginCache.Event.FetchBegin.provider_version:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion - 82, // 47: terraform1.BuildProviderPluginCache.Event.FetchComplete.provider_version:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion - 3, // 48: terraform1.BuildProviderPluginCache.Event.FetchComplete.auth_result:type_name -> terraform1.BuildProviderPluginCache.Event.FetchComplete.AuthResult - 30, // 49: terraform1.GetCachedProviders.Response.available_providers:type_name -> terraform1.ProviderPackage - 30, // 50: terraform1.GetBuiltInProviders.Response.available_providers:type_name -> terraform1.ProviderPackage - 31, // 51: terraform1.GetProviderSchema.Response.schema:type_name -> terraform1.ProviderSchema - 54, // 52: terraform1.ProviderSchema.ManagedResourceTypesEntry.value:type_name -> terraform1.Schema - 54, // 53: terraform1.ProviderSchema.DataResourceTypesEntry.value:type_name -> terraform1.Schema - 47, // 54: terraform1.OpenStackConfiguration.Request.source_address:type_name -> terraform1.SourceAddress - 51, // 55: terraform1.OpenStackConfiguration.Response.diagnostics:type_name -> terraform1.Diagnostic - 51, // 56: terraform1.ValidateStackConfiguration.Response.diagnostics:type_name -> terraform1.Diagnostic - 106, // 57: terraform1.FindStackConfigurationComponents.Response.config:type_name -> terraform1.FindStackConfigurationComponents.StackConfig - 109, // 58: terraform1.FindStackConfigurationComponents.StackConfig.components:type_name -> terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry - 110, // 59: terraform1.FindStackConfigurationComponents.StackConfig.embedded_stacks:type_name -> terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry - 4, // 60: terraform1.FindStackConfigurationComponents.EmbeddedStack.instances:type_name -> terraform1.FindStackConfigurationComponents.Instances - 106, // 61: terraform1.FindStackConfigurationComponents.EmbeddedStack.config:type_name -> terraform1.FindStackConfigurationComponents.StackConfig - 4, // 62: terraform1.FindStackConfigurationComponents.Component.instances:type_name -> terraform1.FindStackConfigurationComponents.Instances - 108, // 63: terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry.value:type_name -> terraform1.FindStackConfigurationComponents.Component - 107, // 64: terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry.value:type_name -> terraform1.FindStackConfigurationComponents.EmbeddedStack - 1, // 65: terraform1.PlanStackChanges.Request.plan_mode:type_name -> terraform1.PlanMode - 113, // 66: terraform1.PlanStackChanges.Request.previous_state:type_name -> terraform1.PlanStackChanges.Request.PreviousStateEntry - 114, // 67: terraform1.PlanStackChanges.Request.input_values:type_name -> terraform1.PlanStackChanges.Request.InputValuesEntry - 48, // 68: terraform1.PlanStackChanges.Event.planned_change:type_name -> terraform1.PlannedChange - 51, // 69: terraform1.PlanStackChanges.Event.diagnostic:type_name -> terraform1.Diagnostic - 50, // 70: terraform1.PlanStackChanges.Event.progress:type_name -> terraform1.StackChangeProgress - 162, // 71: terraform1.PlanStackChanges.Request.PreviousStateEntry.value:type_name -> google.protobuf.Any - 42, // 72: terraform1.PlanStackChanges.Request.InputValuesEntry.value:type_name -> terraform1.DynamicValueWithSource - 162, // 73: terraform1.ApplyStackChanges.Request.planned_changes:type_name -> google.protobuf.Any - 49, // 74: terraform1.ApplyStackChanges.Event.applied_change:type_name -> terraform1.AppliedChange - 51, // 75: terraform1.ApplyStackChanges.Event.diagnostic:type_name -> terraform1.Diagnostic - 50, // 76: terraform1.ApplyStackChanges.Event.progress:type_name -> terraform1.StackChangeProgress - 119, // 77: terraform1.OpenStackInspector.Request.state:type_name -> terraform1.OpenStackInspector.Request.StateEntry - 120, // 78: terraform1.OpenStackInspector.Request.input_values:type_name -> terraform1.OpenStackInspector.Request.InputValuesEntry - 51, // 79: terraform1.OpenStackInspector.Response.diagnostics:type_name -> terraform1.Diagnostic - 162, // 80: terraform1.OpenStackInspector.Request.StateEntry.value:type_name -> google.protobuf.Any - 42, // 81: terraform1.OpenStackInspector.Request.InputValuesEntry.value:type_name -> terraform1.DynamicValueWithSource - 40, // 82: terraform1.InspectExpressionResult.Response.result:type_name -> terraform1.DynamicValue - 51, // 83: terraform1.InspectExpressionResult.Response.diagnostics:type_name -> terraform1.Diagnostic - 125, // 84: terraform1.PlannedChange.ChangeDescription.component_instance_planned:type_name -> terraform1.PlannedChange.ComponentInstance - 126, // 85: terraform1.PlannedChange.ChangeDescription.resource_instance_planned:type_name -> terraform1.PlannedChange.ResourceInstance - 127, // 86: terraform1.PlannedChange.ChangeDescription.output_value_planned:type_name -> terraform1.PlannedChange.OutputValue - 44, // 87: terraform1.PlannedChange.ComponentInstance.addr:type_name -> terraform1.ComponentInstanceInStackAddr - 2, // 88: terraform1.PlannedChange.ComponentInstance.actions:type_name -> terraform1.ChangeType - 46, // 89: terraform1.PlannedChange.ResourceInstance.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr - 2, // 90: terraform1.PlannedChange.ResourceInstance.actions:type_name -> terraform1.ChangeType - 41, // 91: terraform1.PlannedChange.ResourceInstance.values:type_name -> terraform1.DynamicValueChange - 128, // 92: terraform1.PlannedChange.ResourceInstance.moved:type_name -> terraform1.PlannedChange.ResourceInstance.Moved - 129, // 93: terraform1.PlannedChange.ResourceInstance.imported:type_name -> terraform1.PlannedChange.ResourceInstance.Imported - 0, // 94: terraform1.PlannedChange.ResourceInstance.resource_mode:type_name -> terraform1.ResourceMode - 40, // 95: terraform1.PlannedChange.ResourceInstance.previous_run_value:type_name -> terraform1.DynamicValue - 43, // 96: terraform1.PlannedChange.ResourceInstance.replace_paths:type_name -> terraform1.AttributePath - 2, // 97: terraform1.PlannedChange.OutputValue.actions:type_name -> terraform1.ChangeType - 41, // 98: terraform1.PlannedChange.OutputValue.values:type_name -> terraform1.DynamicValueChange - 45, // 99: terraform1.PlannedChange.ResourceInstance.Moved.prev_addr:type_name -> terraform1.ResourceInstanceInStackAddr - 162, // 100: terraform1.AppliedChange.RawChange.value:type_name -> google.protobuf.Any - 135, // 101: terraform1.AppliedChange.ChangeDescription.deleted:type_name -> terraform1.AppliedChange.Nothing - 132, // 102: terraform1.AppliedChange.ChangeDescription.resource_instance:type_name -> terraform1.AppliedChange.ResourceInstance - 134, // 103: terraform1.AppliedChange.ChangeDescription.output_value:type_name -> terraform1.AppliedChange.OutputValue - 133, // 104: terraform1.AppliedChange.ChangeDescription.component_instance:type_name -> terraform1.AppliedChange.ComponentInstance - 46, // 105: terraform1.AppliedChange.ResourceInstance.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr - 40, // 106: terraform1.AppliedChange.ResourceInstance.new_value:type_name -> terraform1.DynamicValue - 0, // 107: terraform1.AppliedChange.ResourceInstance.resource_mode:type_name -> terraform1.ResourceMode - 136, // 108: terraform1.AppliedChange.ComponentInstance.output_values:type_name -> terraform1.AppliedChange.ComponentInstance.OutputValuesEntry - 40, // 109: terraform1.AppliedChange.OutputValue.new_value:type_name -> terraform1.DynamicValue - 40, // 110: terraform1.AppliedChange.ComponentInstance.OutputValuesEntry.value:type_name -> terraform1.DynamicValue - 44, // 111: terraform1.StackChangeProgress.ComponentInstanceStatus.addr:type_name -> terraform1.ComponentInstanceInStackAddr - 5, // 112: terraform1.StackChangeProgress.ComponentInstanceStatus.status:type_name -> terraform1.StackChangeProgress.ComponentInstanceStatus.Status - 46, // 113: terraform1.StackChangeProgress.ResourceInstanceStatus.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr - 6, // 114: terraform1.StackChangeProgress.ResourceInstanceStatus.status:type_name -> terraform1.StackChangeProgress.ResourceInstanceStatus.Status - 46, // 115: terraform1.StackChangeProgress.ResourceInstancePlannedChange.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr - 2, // 116: terraform1.StackChangeProgress.ResourceInstancePlannedChange.actions:type_name -> terraform1.ChangeType - 144, // 117: terraform1.StackChangeProgress.ResourceInstancePlannedChange.moved:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved - 145, // 118: terraform1.StackChangeProgress.ResourceInstancePlannedChange.imported:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange.Imported - 46, // 119: terraform1.StackChangeProgress.ProvisionerStatus.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr - 140, // 120: terraform1.StackChangeProgress.ProvisionerStatus.status:type_name -> terraform1.StackChangeProgress.ProvisionerStatus - 46, // 121: terraform1.StackChangeProgress.ProvisionerOutput.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr - 44, // 122: terraform1.StackChangeProgress.ComponentInstanceChanges.addr:type_name -> terraform1.ComponentInstanceInStackAddr - 45, // 123: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved.prev_addr:type_name -> terraform1.ResourceInstanceInStackAddr - 147, // 124: terraform1.Schema.Block.attributes:type_name -> terraform1.Schema.Attribute - 148, // 125: terraform1.Schema.Block.block_types:type_name -> terraform1.Schema.NestedBlock - 150, // 126: terraform1.Schema.Block.description:type_name -> terraform1.Schema.DocString - 149, // 127: terraform1.Schema.Attribute.nested_type:type_name -> terraform1.Schema.Object - 150, // 128: terraform1.Schema.Attribute.description:type_name -> terraform1.Schema.DocString - 146, // 129: terraform1.Schema.NestedBlock.block:type_name -> terraform1.Schema.Block - 9, // 130: terraform1.Schema.NestedBlock.nesting:type_name -> terraform1.Schema.NestedBlock.NestingMode - 147, // 131: terraform1.Schema.Object.attributes:type_name -> terraform1.Schema.Attribute - 10, // 132: terraform1.Schema.Object.nesting:type_name -> terraform1.Schema.Object.NestingMode - 11, // 133: terraform1.Schema.DocString.format:type_name -> terraform1.Schema.DocString.Format - 51, // 134: terraform1.ProviderPackageVersions.Response.diagnostics:type_name -> terraform1.Diagnostic - 155, // 135: terraform1.FetchProviderPackage.Response.results:type_name -> terraform1.FetchProviderPackage.PlatformResult - 51, // 136: terraform1.FetchProviderPackage.Response.diagnostics:type_name -> terraform1.Diagnostic - 30, // 137: terraform1.FetchProviderPackage.PlatformResult.provider:type_name -> terraform1.ProviderPackage - 51, // 138: terraform1.FetchProviderPackage.PlatformResult.diagnostics:type_name -> terraform1.Diagnostic - 51, // 139: terraform1.ModulePackageVersions.Response.diagnostics:type_name -> terraform1.Diagnostic - 51, // 140: terraform1.ModulePackageSourceAddr.Response.diagnostics:type_name -> terraform1.Diagnostic - 51, // 141: terraform1.FetchModulePackage.Response.diagnostics:type_name -> terraform1.Diagnostic - 60, // 142: terraform1.Setup.Handshake:input_type -> terraform1.Handshake.Request - 62, // 143: terraform1.Setup.Stop:input_type -> terraform1.Stop.Request - 65, // 144: terraform1.Dependencies.OpenSourceBundle:input_type -> terraform1.OpenSourceBundle.Request - 67, // 145: terraform1.Dependencies.CloseSourceBundle:input_type -> terraform1.CloseSourceBundle.Request - 69, // 146: terraform1.Dependencies.OpenDependencyLockFile:input_type -> terraform1.OpenDependencyLockFile.Request - 71, // 147: terraform1.Dependencies.CreateDependencyLocks:input_type -> terraform1.CreateDependencyLocks.Request - 73, // 148: terraform1.Dependencies.CloseDependencyLocks:input_type -> terraform1.CloseDependencyLocks.Request - 75, // 149: terraform1.Dependencies.GetLockedProviderDependencies:input_type -> terraform1.GetLockedProviderDependencies.Request - 77, // 150: terraform1.Dependencies.BuildProviderPluginCache:input_type -> terraform1.BuildProviderPluginCache.Request - 86, // 151: terraform1.Dependencies.OpenProviderPluginCache:input_type -> terraform1.OpenProviderPluginCache.Request - 88, // 152: terraform1.Dependencies.CloseProviderPluginCache:input_type -> terraform1.CloseProviderPluginCache.Request - 90, // 153: terraform1.Dependencies.GetCachedProviders:input_type -> terraform1.GetCachedProviders.Request - 92, // 154: terraform1.Dependencies.GetBuiltInProviders:input_type -> terraform1.GetBuiltInProviders.Request - 94, // 155: terraform1.Dependencies.GetProviderSchema:input_type -> terraform1.GetProviderSchema.Request - 98, // 156: terraform1.Stacks.OpenStackConfiguration:input_type -> terraform1.OpenStackConfiguration.Request - 100, // 157: terraform1.Stacks.CloseStackConfiguration:input_type -> terraform1.CloseStackConfiguration.Request - 102, // 158: terraform1.Stacks.ValidateStackConfiguration:input_type -> terraform1.ValidateStackConfiguration.Request - 104, // 159: terraform1.Stacks.FindStackConfigurationComponents:input_type -> terraform1.FindStackConfigurationComponents.Request - 111, // 160: terraform1.Stacks.PlanStackChanges:input_type -> terraform1.PlanStackChanges.Request - 115, // 161: terraform1.Stacks.ApplyStackChanges:input_type -> terraform1.ApplyStackChanges.Request - 117, // 162: terraform1.Stacks.OpenStackInspector:input_type -> terraform1.OpenStackInspector.Request - 121, // 163: terraform1.Stacks.InspectExpressionResult:input_type -> terraform1.InspectExpressionResult.Request - 151, // 164: terraform1.Packages.ProviderPackageVersions:input_type -> terraform1.ProviderPackageVersions.Request - 153, // 165: terraform1.Packages.FetchProviderPackage:input_type -> terraform1.FetchProviderPackage.Request - 156, // 166: terraform1.Packages.ModulePackageVersions:input_type -> terraform1.ModulePackageVersions.Request - 158, // 167: terraform1.Packages.ModulePackageSourceAddr:input_type -> terraform1.ModulePackageSourceAddr.Request - 160, // 168: terraform1.Packages.FetchModulePackage:input_type -> terraform1.FetchModulePackage.Request - 61, // 169: terraform1.Setup.Handshake:output_type -> terraform1.Handshake.Response - 63, // 170: terraform1.Setup.Stop:output_type -> terraform1.Stop.Response - 66, // 171: terraform1.Dependencies.OpenSourceBundle:output_type -> terraform1.OpenSourceBundle.Response - 68, // 172: terraform1.Dependencies.CloseSourceBundle:output_type -> terraform1.CloseSourceBundle.Response - 70, // 173: terraform1.Dependencies.OpenDependencyLockFile:output_type -> terraform1.OpenDependencyLockFile.Response - 72, // 174: terraform1.Dependencies.CreateDependencyLocks:output_type -> terraform1.CreateDependencyLocks.Response - 74, // 175: terraform1.Dependencies.CloseDependencyLocks:output_type -> terraform1.CloseDependencyLocks.Response - 76, // 176: terraform1.Dependencies.GetLockedProviderDependencies:output_type -> terraform1.GetLockedProviderDependencies.Response - 78, // 177: terraform1.Dependencies.BuildProviderPluginCache:output_type -> terraform1.BuildProviderPluginCache.Event - 87, // 178: terraform1.Dependencies.OpenProviderPluginCache:output_type -> terraform1.OpenProviderPluginCache.Response - 89, // 179: terraform1.Dependencies.CloseProviderPluginCache:output_type -> terraform1.CloseProviderPluginCache.Response - 91, // 180: terraform1.Dependencies.GetCachedProviders:output_type -> terraform1.GetCachedProviders.Response - 93, // 181: terraform1.Dependencies.GetBuiltInProviders:output_type -> terraform1.GetBuiltInProviders.Response - 95, // 182: terraform1.Dependencies.GetProviderSchema:output_type -> terraform1.GetProviderSchema.Response - 99, // 183: terraform1.Stacks.OpenStackConfiguration:output_type -> terraform1.OpenStackConfiguration.Response - 101, // 184: terraform1.Stacks.CloseStackConfiguration:output_type -> terraform1.CloseStackConfiguration.Response - 103, // 185: terraform1.Stacks.ValidateStackConfiguration:output_type -> terraform1.ValidateStackConfiguration.Response - 105, // 186: terraform1.Stacks.FindStackConfigurationComponents:output_type -> terraform1.FindStackConfigurationComponents.Response - 112, // 187: terraform1.Stacks.PlanStackChanges:output_type -> terraform1.PlanStackChanges.Event - 116, // 188: terraform1.Stacks.ApplyStackChanges:output_type -> terraform1.ApplyStackChanges.Event - 118, // 189: terraform1.Stacks.OpenStackInspector:output_type -> terraform1.OpenStackInspector.Response - 122, // 190: terraform1.Stacks.InspectExpressionResult:output_type -> terraform1.InspectExpressionResult.Response - 152, // 191: terraform1.Packages.ProviderPackageVersions:output_type -> terraform1.ProviderPackageVersions.Response - 154, // 192: terraform1.Packages.FetchProviderPackage:output_type -> terraform1.FetchProviderPackage.Response - 157, // 193: terraform1.Packages.ModulePackageVersions:output_type -> terraform1.ModulePackageVersions.Response - 159, // 194: terraform1.Packages.ModulePackageSourceAddr:output_type -> terraform1.ModulePackageSourceAddr.Response - 161, // 195: terraform1.Packages.FetchModulePackage:output_type -> terraform1.FetchModulePackage.Response - 169, // [169:196] is the sub-list for method output_type - 142, // [142:169] is the sub-list for method input_type - 142, // [142:142] is the sub-list for extension type_name - 142, // [142:142] is the sub-list for extension extendee - 0, // [0:142] is the sub-list for field type_name + 66, // 0: terraform1.Config.credentials:type_name -> terraform1.Config.CredentialsEntry + 56, // 1: terraform1.ProviderSchema.provider_config:type_name -> terraform1.Schema + 98, // 2: terraform1.ProviderSchema.managed_resource_types:type_name -> terraform1.ProviderSchema.ManagedResourceTypesEntry + 99, // 3: terraform1.ProviderSchema.data_resource_types:type_name -> terraform1.ProviderSchema.DataResourceTypesEntry + 44, // 4: terraform1.DynamicValue.sensitive:type_name -> terraform1.AttributePath + 41, // 5: terraform1.DynamicValueChange.old:type_name -> terraform1.DynamicValue + 41, // 6: terraform1.DynamicValueChange.new:type_name -> terraform1.DynamicValue + 41, // 7: terraform1.DynamicValueWithSource.value:type_name -> terraform1.DynamicValue + 54, // 8: terraform1.DynamicValueWithSource.source_range:type_name -> terraform1.SourceRange + 125, // 9: terraform1.AttributePath.steps:type_name -> terraform1.AttributePath.Step + 166, // 10: terraform1.PlannedChange.raw:type_name -> google.protobuf.Any + 126, // 11: terraform1.PlannedChange.descriptions:type_name -> terraform1.PlannedChange.ChangeDescription + 5, // 12: terraform1.Deferred.reason:type_name -> terraform1.Deferred.Reason + 133, // 13: terraform1.AppliedChange.raw:type_name -> terraform1.AppliedChange.RawChange + 134, // 14: terraform1.AppliedChange.descriptions:type_name -> terraform1.AppliedChange.ChangeDescription + 140, // 15: terraform1.StackChangeProgress.component_instance_status:type_name -> terraform1.StackChangeProgress.ComponentInstanceStatus + 141, // 16: terraform1.StackChangeProgress.resource_instance_status:type_name -> terraform1.StackChangeProgress.ResourceInstanceStatus + 142, // 17: terraform1.StackChangeProgress.resource_instance_planned_change:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange + 144, // 18: terraform1.StackChangeProgress.provisioner_status:type_name -> terraform1.StackChangeProgress.ProvisionerStatus + 145, // 19: terraform1.StackChangeProgress.provisioner_output:type_name -> terraform1.StackChangeProgress.ProvisionerOutput + 146, // 20: terraform1.StackChangeProgress.component_instance_changes:type_name -> terraform1.StackChangeProgress.ComponentInstanceChanges + 147, // 21: terraform1.StackChangeProgress.component_instances:type_name -> terraform1.StackChangeProgress.ComponentInstances + 143, // 22: terraform1.StackChangeProgress.deferred_resource_instance_planned_change:type_name -> terraform1.StackChangeProgress.DeferredResourceInstancePlannedChange + 9, // 23: terraform1.Diagnostic.severity:type_name -> terraform1.Diagnostic.Severity + 54, // 24: terraform1.Diagnostic.subject:type_name -> terraform1.SourceRange + 54, // 25: terraform1.Diagnostic.context:type_name -> terraform1.SourceRange + 55, // 26: terraform1.SourceRange.start:type_name -> terraform1.SourcePos + 55, // 27: terraform1.SourceRange.end:type_name -> terraform1.SourcePos + 150, // 28: terraform1.Schema.block:type_name -> terraform1.Schema.Block + 15, // 29: terraform1.Handshake.Request.capabilities:type_name -> terraform1.ClientCapabilities + 17, // 30: terraform1.Handshake.Request.config:type_name -> terraform1.Config + 16, // 31: terraform1.Handshake.Response.capabilities:type_name -> terraform1.ServerCapabilities + 18, // 32: terraform1.Config.CredentialsEntry.value:type_name -> terraform1.HostCredential + 48, // 33: terraform1.OpenDependencyLockFile.Request.source_address:type_name -> terraform1.SourceAddress + 53, // 34: terraform1.OpenDependencyLockFile.Response.diagnostics:type_name -> terraform1.Diagnostic + 31, // 35: terraform1.CreateDependencyLocks.Request.provider_selections:type_name -> terraform1.ProviderPackage + 31, // 36: terraform1.GetLockedProviderDependencies.Response.selected_providers:type_name -> terraform1.ProviderPackage + 81, // 37: terraform1.BuildProviderPluginCache.Request.installation_methods:type_name -> terraform1.BuildProviderPluginCache.Request.InstallMethod + 82, // 38: terraform1.BuildProviderPluginCache.Event.pending:type_name -> terraform1.BuildProviderPluginCache.Event.Pending + 84, // 39: terraform1.BuildProviderPluginCache.Event.already_installed:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion + 84, // 40: terraform1.BuildProviderPluginCache.Event.built_in:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion + 83, // 41: terraform1.BuildProviderPluginCache.Event.query_begin:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderConstraints + 84, // 42: terraform1.BuildProviderPluginCache.Event.query_success:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion + 85, // 43: terraform1.BuildProviderPluginCache.Event.query_warnings:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderWarnings + 86, // 44: terraform1.BuildProviderPluginCache.Event.fetch_begin:type_name -> terraform1.BuildProviderPluginCache.Event.FetchBegin + 87, // 45: terraform1.BuildProviderPluginCache.Event.fetch_complete:type_name -> terraform1.BuildProviderPluginCache.Event.FetchComplete + 53, // 46: terraform1.BuildProviderPluginCache.Event.diagnostic:type_name -> terraform1.Diagnostic + 83, // 47: terraform1.BuildProviderPluginCache.Event.Pending.expected:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderConstraints + 84, // 48: terraform1.BuildProviderPluginCache.Event.FetchBegin.provider_version:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion + 84, // 49: terraform1.BuildProviderPluginCache.Event.FetchComplete.provider_version:type_name -> terraform1.BuildProviderPluginCache.Event.ProviderVersion + 3, // 50: terraform1.BuildProviderPluginCache.Event.FetchComplete.auth_result:type_name -> terraform1.BuildProviderPluginCache.Event.FetchComplete.AuthResult + 31, // 51: terraform1.GetCachedProviders.Response.available_providers:type_name -> terraform1.ProviderPackage + 31, // 52: terraform1.GetBuiltInProviders.Response.available_providers:type_name -> terraform1.ProviderPackage + 32, // 53: terraform1.GetProviderSchema.Response.schema:type_name -> terraform1.ProviderSchema + 56, // 54: terraform1.ProviderSchema.ManagedResourceTypesEntry.value:type_name -> terraform1.Schema + 56, // 55: terraform1.ProviderSchema.DataResourceTypesEntry.value:type_name -> terraform1.Schema + 48, // 56: terraform1.OpenStackConfiguration.Request.source_address:type_name -> terraform1.SourceAddress + 53, // 57: terraform1.OpenStackConfiguration.Response.diagnostics:type_name -> terraform1.Diagnostic + 53, // 58: terraform1.ValidateStackConfiguration.Response.diagnostics:type_name -> terraform1.Diagnostic + 108, // 59: terraform1.FindStackConfigurationComponents.Response.config:type_name -> terraform1.FindStackConfigurationComponents.StackConfig + 111, // 60: terraform1.FindStackConfigurationComponents.StackConfig.components:type_name -> terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry + 112, // 61: terraform1.FindStackConfigurationComponents.StackConfig.embedded_stacks:type_name -> terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry + 4, // 62: terraform1.FindStackConfigurationComponents.EmbeddedStack.instances:type_name -> terraform1.FindStackConfigurationComponents.Instances + 108, // 63: terraform1.FindStackConfigurationComponents.EmbeddedStack.config:type_name -> terraform1.FindStackConfigurationComponents.StackConfig + 4, // 64: terraform1.FindStackConfigurationComponents.Component.instances:type_name -> terraform1.FindStackConfigurationComponents.Instances + 110, // 65: terraform1.FindStackConfigurationComponents.StackConfig.ComponentsEntry.value:type_name -> terraform1.FindStackConfigurationComponents.Component + 109, // 66: terraform1.FindStackConfigurationComponents.StackConfig.EmbeddedStacksEntry.value:type_name -> terraform1.FindStackConfigurationComponents.EmbeddedStack + 1, // 67: terraform1.PlanStackChanges.Request.plan_mode:type_name -> terraform1.PlanMode + 115, // 68: terraform1.PlanStackChanges.Request.previous_state:type_name -> terraform1.PlanStackChanges.Request.PreviousStateEntry + 116, // 69: terraform1.PlanStackChanges.Request.input_values:type_name -> terraform1.PlanStackChanges.Request.InputValuesEntry + 49, // 70: terraform1.PlanStackChanges.Event.planned_change:type_name -> terraform1.PlannedChange + 53, // 71: terraform1.PlanStackChanges.Event.diagnostic:type_name -> terraform1.Diagnostic + 52, // 72: terraform1.PlanStackChanges.Event.progress:type_name -> terraform1.StackChangeProgress + 166, // 73: terraform1.PlanStackChanges.Request.PreviousStateEntry.value:type_name -> google.protobuf.Any + 43, // 74: terraform1.PlanStackChanges.Request.InputValuesEntry.value:type_name -> terraform1.DynamicValueWithSource + 166, // 75: terraform1.ApplyStackChanges.Request.planned_changes:type_name -> google.protobuf.Any + 51, // 76: terraform1.ApplyStackChanges.Event.applied_change:type_name -> terraform1.AppliedChange + 53, // 77: terraform1.ApplyStackChanges.Event.diagnostic:type_name -> terraform1.Diagnostic + 52, // 78: terraform1.ApplyStackChanges.Event.progress:type_name -> terraform1.StackChangeProgress + 121, // 79: terraform1.OpenStackInspector.Request.state:type_name -> terraform1.OpenStackInspector.Request.StateEntry + 122, // 80: terraform1.OpenStackInspector.Request.input_values:type_name -> terraform1.OpenStackInspector.Request.InputValuesEntry + 53, // 81: terraform1.OpenStackInspector.Response.diagnostics:type_name -> terraform1.Diagnostic + 166, // 82: terraform1.OpenStackInspector.Request.StateEntry.value:type_name -> google.protobuf.Any + 43, // 83: terraform1.OpenStackInspector.Request.InputValuesEntry.value:type_name -> terraform1.DynamicValueWithSource + 41, // 84: terraform1.InspectExpressionResult.Response.result:type_name -> terraform1.DynamicValue + 53, // 85: terraform1.InspectExpressionResult.Response.diagnostics:type_name -> terraform1.Diagnostic + 127, // 86: terraform1.PlannedChange.ChangeDescription.component_instance_planned:type_name -> terraform1.PlannedChange.ComponentInstance + 128, // 87: terraform1.PlannedChange.ChangeDescription.resource_instance_planned:type_name -> terraform1.PlannedChange.ResourceInstance + 129, // 88: terraform1.PlannedChange.ChangeDescription.output_value_planned:type_name -> terraform1.PlannedChange.OutputValue + 130, // 89: terraform1.PlannedChange.ChangeDescription.resource_instance_deferred:type_name -> terraform1.PlannedChange.ResourceInstanceDeferred + 45, // 90: terraform1.PlannedChange.ComponentInstance.addr:type_name -> terraform1.ComponentInstanceInStackAddr + 2, // 91: terraform1.PlannedChange.ComponentInstance.actions:type_name -> terraform1.ChangeType + 47, // 92: terraform1.PlannedChange.ResourceInstance.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 2, // 93: terraform1.PlannedChange.ResourceInstance.actions:type_name -> terraform1.ChangeType + 42, // 94: terraform1.PlannedChange.ResourceInstance.values:type_name -> terraform1.DynamicValueChange + 131, // 95: terraform1.PlannedChange.ResourceInstance.moved:type_name -> terraform1.PlannedChange.ResourceInstance.Moved + 132, // 96: terraform1.PlannedChange.ResourceInstance.imported:type_name -> terraform1.PlannedChange.ResourceInstance.Imported + 0, // 97: terraform1.PlannedChange.ResourceInstance.resource_mode:type_name -> terraform1.ResourceMode + 41, // 98: terraform1.PlannedChange.ResourceInstance.previous_run_value:type_name -> terraform1.DynamicValue + 44, // 99: terraform1.PlannedChange.ResourceInstance.replace_paths:type_name -> terraform1.AttributePath + 2, // 100: terraform1.PlannedChange.OutputValue.actions:type_name -> terraform1.ChangeType + 42, // 101: terraform1.PlannedChange.OutputValue.values:type_name -> terraform1.DynamicValueChange + 128, // 102: terraform1.PlannedChange.ResourceInstanceDeferred.resource_instance:type_name -> terraform1.PlannedChange.ResourceInstance + 50, // 103: terraform1.PlannedChange.ResourceInstanceDeferred.deferred:type_name -> terraform1.Deferred + 46, // 104: terraform1.PlannedChange.ResourceInstance.Moved.prev_addr:type_name -> terraform1.ResourceInstanceInStackAddr + 166, // 105: terraform1.AppliedChange.RawChange.value:type_name -> google.protobuf.Any + 138, // 106: terraform1.AppliedChange.ChangeDescription.deleted:type_name -> terraform1.AppliedChange.Nothing + 135, // 107: terraform1.AppliedChange.ChangeDescription.resource_instance:type_name -> terraform1.AppliedChange.ResourceInstance + 137, // 108: terraform1.AppliedChange.ChangeDescription.output_value:type_name -> terraform1.AppliedChange.OutputValue + 136, // 109: terraform1.AppliedChange.ChangeDescription.component_instance:type_name -> terraform1.AppliedChange.ComponentInstance + 47, // 110: terraform1.AppliedChange.ResourceInstance.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 41, // 111: terraform1.AppliedChange.ResourceInstance.new_value:type_name -> terraform1.DynamicValue + 0, // 112: terraform1.AppliedChange.ResourceInstance.resource_mode:type_name -> terraform1.ResourceMode + 139, // 113: terraform1.AppliedChange.ComponentInstance.output_values:type_name -> terraform1.AppliedChange.ComponentInstance.OutputValuesEntry + 41, // 114: terraform1.AppliedChange.OutputValue.new_value:type_name -> terraform1.DynamicValue + 41, // 115: terraform1.AppliedChange.ComponentInstance.OutputValuesEntry.value:type_name -> terraform1.DynamicValue + 45, // 116: terraform1.StackChangeProgress.ComponentInstanceStatus.addr:type_name -> terraform1.ComponentInstanceInStackAddr + 6, // 117: terraform1.StackChangeProgress.ComponentInstanceStatus.status:type_name -> terraform1.StackChangeProgress.ComponentInstanceStatus.Status + 47, // 118: terraform1.StackChangeProgress.ResourceInstanceStatus.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 7, // 119: terraform1.StackChangeProgress.ResourceInstanceStatus.status:type_name -> terraform1.StackChangeProgress.ResourceInstanceStatus.Status + 47, // 120: terraform1.StackChangeProgress.ResourceInstancePlannedChange.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 2, // 121: terraform1.StackChangeProgress.ResourceInstancePlannedChange.actions:type_name -> terraform1.ChangeType + 148, // 122: terraform1.StackChangeProgress.ResourceInstancePlannedChange.moved:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved + 149, // 123: terraform1.StackChangeProgress.ResourceInstancePlannedChange.imported:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange.Imported + 50, // 124: terraform1.StackChangeProgress.DeferredResourceInstancePlannedChange.deferred:type_name -> terraform1.Deferred + 142, // 125: terraform1.StackChangeProgress.DeferredResourceInstancePlannedChange.change:type_name -> terraform1.StackChangeProgress.ResourceInstancePlannedChange + 47, // 126: terraform1.StackChangeProgress.ProvisionerStatus.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 144, // 127: terraform1.StackChangeProgress.ProvisionerStatus.status:type_name -> terraform1.StackChangeProgress.ProvisionerStatus + 47, // 128: terraform1.StackChangeProgress.ProvisionerOutput.addr:type_name -> terraform1.ResourceInstanceObjectInStackAddr + 45, // 129: terraform1.StackChangeProgress.ComponentInstanceChanges.addr:type_name -> terraform1.ComponentInstanceInStackAddr + 46, // 130: terraform1.StackChangeProgress.ResourceInstancePlannedChange.Moved.prev_addr:type_name -> terraform1.ResourceInstanceInStackAddr + 151, // 131: terraform1.Schema.Block.attributes:type_name -> terraform1.Schema.Attribute + 152, // 132: terraform1.Schema.Block.block_types:type_name -> terraform1.Schema.NestedBlock + 154, // 133: terraform1.Schema.Block.description:type_name -> terraform1.Schema.DocString + 153, // 134: terraform1.Schema.Attribute.nested_type:type_name -> terraform1.Schema.Object + 154, // 135: terraform1.Schema.Attribute.description:type_name -> terraform1.Schema.DocString + 150, // 136: terraform1.Schema.NestedBlock.block:type_name -> terraform1.Schema.Block + 10, // 137: terraform1.Schema.NestedBlock.nesting:type_name -> terraform1.Schema.NestedBlock.NestingMode + 151, // 138: terraform1.Schema.Object.attributes:type_name -> terraform1.Schema.Attribute + 11, // 139: terraform1.Schema.Object.nesting:type_name -> terraform1.Schema.Object.NestingMode + 12, // 140: terraform1.Schema.DocString.format:type_name -> terraform1.Schema.DocString.Format + 53, // 141: terraform1.ProviderPackageVersions.Response.diagnostics:type_name -> terraform1.Diagnostic + 159, // 142: terraform1.FetchProviderPackage.Response.results:type_name -> terraform1.FetchProviderPackage.PlatformResult + 53, // 143: terraform1.FetchProviderPackage.Response.diagnostics:type_name -> terraform1.Diagnostic + 31, // 144: terraform1.FetchProviderPackage.PlatformResult.provider:type_name -> terraform1.ProviderPackage + 53, // 145: terraform1.FetchProviderPackage.PlatformResult.diagnostics:type_name -> terraform1.Diagnostic + 53, // 146: terraform1.ModulePackageVersions.Response.diagnostics:type_name -> terraform1.Diagnostic + 53, // 147: terraform1.ModulePackageSourceAddr.Response.diagnostics:type_name -> terraform1.Diagnostic + 53, // 148: terraform1.FetchModulePackage.Response.diagnostics:type_name -> terraform1.Diagnostic + 62, // 149: terraform1.Setup.Handshake:input_type -> terraform1.Handshake.Request + 64, // 150: terraform1.Setup.Stop:input_type -> terraform1.Stop.Request + 67, // 151: terraform1.Dependencies.OpenSourceBundle:input_type -> terraform1.OpenSourceBundle.Request + 69, // 152: terraform1.Dependencies.CloseSourceBundle:input_type -> terraform1.CloseSourceBundle.Request + 71, // 153: terraform1.Dependencies.OpenDependencyLockFile:input_type -> terraform1.OpenDependencyLockFile.Request + 73, // 154: terraform1.Dependencies.CreateDependencyLocks:input_type -> terraform1.CreateDependencyLocks.Request + 75, // 155: terraform1.Dependencies.CloseDependencyLocks:input_type -> terraform1.CloseDependencyLocks.Request + 77, // 156: terraform1.Dependencies.GetLockedProviderDependencies:input_type -> terraform1.GetLockedProviderDependencies.Request + 79, // 157: terraform1.Dependencies.BuildProviderPluginCache:input_type -> terraform1.BuildProviderPluginCache.Request + 88, // 158: terraform1.Dependencies.OpenProviderPluginCache:input_type -> terraform1.OpenProviderPluginCache.Request + 90, // 159: terraform1.Dependencies.CloseProviderPluginCache:input_type -> terraform1.CloseProviderPluginCache.Request + 92, // 160: terraform1.Dependencies.GetCachedProviders:input_type -> terraform1.GetCachedProviders.Request + 94, // 161: terraform1.Dependencies.GetBuiltInProviders:input_type -> terraform1.GetBuiltInProviders.Request + 96, // 162: terraform1.Dependencies.GetProviderSchema:input_type -> terraform1.GetProviderSchema.Request + 100, // 163: terraform1.Stacks.OpenStackConfiguration:input_type -> terraform1.OpenStackConfiguration.Request + 102, // 164: terraform1.Stacks.CloseStackConfiguration:input_type -> terraform1.CloseStackConfiguration.Request + 104, // 165: terraform1.Stacks.ValidateStackConfiguration:input_type -> terraform1.ValidateStackConfiguration.Request + 106, // 166: terraform1.Stacks.FindStackConfigurationComponents:input_type -> terraform1.FindStackConfigurationComponents.Request + 113, // 167: terraform1.Stacks.PlanStackChanges:input_type -> terraform1.PlanStackChanges.Request + 117, // 168: terraform1.Stacks.ApplyStackChanges:input_type -> terraform1.ApplyStackChanges.Request + 119, // 169: terraform1.Stacks.OpenStackInspector:input_type -> terraform1.OpenStackInspector.Request + 123, // 170: terraform1.Stacks.InspectExpressionResult:input_type -> terraform1.InspectExpressionResult.Request + 155, // 171: terraform1.Packages.ProviderPackageVersions:input_type -> terraform1.ProviderPackageVersions.Request + 157, // 172: terraform1.Packages.FetchProviderPackage:input_type -> terraform1.FetchProviderPackage.Request + 160, // 173: terraform1.Packages.ModulePackageVersions:input_type -> terraform1.ModulePackageVersions.Request + 162, // 174: terraform1.Packages.ModulePackageSourceAddr:input_type -> terraform1.ModulePackageSourceAddr.Request + 164, // 175: terraform1.Packages.FetchModulePackage:input_type -> terraform1.FetchModulePackage.Request + 63, // 176: terraform1.Setup.Handshake:output_type -> terraform1.Handshake.Response + 65, // 177: terraform1.Setup.Stop:output_type -> terraform1.Stop.Response + 68, // 178: terraform1.Dependencies.OpenSourceBundle:output_type -> terraform1.OpenSourceBundle.Response + 70, // 179: terraform1.Dependencies.CloseSourceBundle:output_type -> terraform1.CloseSourceBundle.Response + 72, // 180: terraform1.Dependencies.OpenDependencyLockFile:output_type -> terraform1.OpenDependencyLockFile.Response + 74, // 181: terraform1.Dependencies.CreateDependencyLocks:output_type -> terraform1.CreateDependencyLocks.Response + 76, // 182: terraform1.Dependencies.CloseDependencyLocks:output_type -> terraform1.CloseDependencyLocks.Response + 78, // 183: terraform1.Dependencies.GetLockedProviderDependencies:output_type -> terraform1.GetLockedProviderDependencies.Response + 80, // 184: terraform1.Dependencies.BuildProviderPluginCache:output_type -> terraform1.BuildProviderPluginCache.Event + 89, // 185: terraform1.Dependencies.OpenProviderPluginCache:output_type -> terraform1.OpenProviderPluginCache.Response + 91, // 186: terraform1.Dependencies.CloseProviderPluginCache:output_type -> terraform1.CloseProviderPluginCache.Response + 93, // 187: terraform1.Dependencies.GetCachedProviders:output_type -> terraform1.GetCachedProviders.Response + 95, // 188: terraform1.Dependencies.GetBuiltInProviders:output_type -> terraform1.GetBuiltInProviders.Response + 97, // 189: terraform1.Dependencies.GetProviderSchema:output_type -> terraform1.GetProviderSchema.Response + 101, // 190: terraform1.Stacks.OpenStackConfiguration:output_type -> terraform1.OpenStackConfiguration.Response + 103, // 191: terraform1.Stacks.CloseStackConfiguration:output_type -> terraform1.CloseStackConfiguration.Response + 105, // 192: terraform1.Stacks.ValidateStackConfiguration:output_type -> terraform1.ValidateStackConfiguration.Response + 107, // 193: terraform1.Stacks.FindStackConfigurationComponents:output_type -> terraform1.FindStackConfigurationComponents.Response + 114, // 194: terraform1.Stacks.PlanStackChanges:output_type -> terraform1.PlanStackChanges.Event + 118, // 195: terraform1.Stacks.ApplyStackChanges:output_type -> terraform1.ApplyStackChanges.Event + 120, // 196: terraform1.Stacks.OpenStackInspector:output_type -> terraform1.OpenStackInspector.Response + 124, // 197: terraform1.Stacks.InspectExpressionResult:output_type -> terraform1.InspectExpressionResult.Response + 156, // 198: terraform1.Packages.ProviderPackageVersions:output_type -> terraform1.ProviderPackageVersions.Response + 158, // 199: terraform1.Packages.FetchProviderPackage:output_type -> terraform1.FetchProviderPackage.Response + 161, // 200: terraform1.Packages.ModulePackageVersions:output_type -> terraform1.ModulePackageVersions.Response + 163, // 201: terraform1.Packages.ModulePackageSourceAddr:output_type -> terraform1.ModulePackageSourceAddr.Response + 165, // 202: terraform1.Packages.FetchModulePackage:output_type -> terraform1.FetchModulePackage.Response + 176, // [176:203] is the sub-list for method output_type + 149, // [149:176] is the sub-list for method input_type + 149, // [149:149] is the sub-list for extension type_name + 149, // [149:149] is the sub-list for extension extendee + 0, // [0:149] is the sub-list for field type_name } func init() { file_terraform1_proto_init() } @@ -11105,7 +11419,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppliedChange); i { + switch v := v.(*Deferred); i { case 0: return &v.state case 1: @@ -11117,7 +11431,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StackChangeProgress); i { + switch v := v.(*AppliedChange); i { case 0: return &v.state case 1: @@ -11129,7 +11443,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Diagnostic); i { + switch v := v.(*StackChangeProgress); i { case 0: return &v.state case 1: @@ -11141,7 +11455,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SourceRange); i { + switch v := v.(*Diagnostic); i { case 0: return &v.state case 1: @@ -11153,7 +11467,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SourcePos); i { + switch v := v.(*SourceRange); i { case 0: return &v.state case 1: @@ -11165,7 +11479,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Schema); i { + switch v := v.(*SourcePos); i { case 0: return &v.state case 1: @@ -11177,7 +11491,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProviderPackageVersions); i { + switch v := v.(*Schema); i { case 0: return &v.state case 1: @@ -11189,7 +11503,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FetchProviderPackage); i { + switch v := v.(*ProviderPackageVersions); i { case 0: return &v.state case 1: @@ -11201,7 +11515,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ModulePackageVersions); i { + switch v := v.(*FetchProviderPackage); i { case 0: return &v.state case 1: @@ -11213,7 +11527,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ModulePackageSourceAddr); i { + switch v := v.(*ModulePackageVersions); i { case 0: return &v.state case 1: @@ -11225,7 +11539,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FetchModulePackage); i { + switch v := v.(*ModulePackageSourceAddr); i { case 0: return &v.state case 1: @@ -11237,7 +11551,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Handshake_Request); i { + switch v := v.(*FetchModulePackage); i { case 0: return &v.state case 1: @@ -11249,7 +11563,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Handshake_Response); i { + switch v := v.(*Handshake_Request); i { case 0: return &v.state case 1: @@ -11261,7 +11575,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Stop_Request); i { + switch v := v.(*Handshake_Response); i { case 0: return &v.state case 1: @@ -11273,6 +11587,18 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Stop_Request); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Stop_Response); i { case 0: return &v.state @@ -11284,7 +11610,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenSourceBundle_Request); i { case 0: return &v.state @@ -11296,7 +11622,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenSourceBundle_Response); i { case 0: return &v.state @@ -11308,7 +11634,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CloseSourceBundle_Request); i { case 0: return &v.state @@ -11320,7 +11646,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CloseSourceBundle_Response); i { case 0: return &v.state @@ -11332,7 +11658,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenDependencyLockFile_Request); i { case 0: return &v.state @@ -11344,7 +11670,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenDependencyLockFile_Response); i { case 0: return &v.state @@ -11356,7 +11682,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateDependencyLocks_Request); i { case 0: return &v.state @@ -11368,7 +11694,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateDependencyLocks_Response); i { case 0: return &v.state @@ -11380,7 +11706,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CloseDependencyLocks_Request); i { case 0: return &v.state @@ -11392,7 +11718,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CloseDependencyLocks_Response); i { case 0: return &v.state @@ -11404,7 +11730,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetLockedProviderDependencies_Request); i { case 0: return &v.state @@ -11416,7 +11742,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetLockedProviderDependencies_Response); i { case 0: return &v.state @@ -11428,7 +11754,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BuildProviderPluginCache_Request); i { case 0: return &v.state @@ -11440,7 +11766,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BuildProviderPluginCache_Event); i { case 0: return &v.state @@ -11452,7 +11778,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BuildProviderPluginCache_Request_InstallMethod); i { case 0: return &v.state @@ -11464,7 +11790,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BuildProviderPluginCache_Event_Pending); i { case 0: return &v.state @@ -11476,7 +11802,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BuildProviderPluginCache_Event_ProviderConstraints); i { case 0: return &v.state @@ -11488,7 +11814,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BuildProviderPluginCache_Event_ProviderVersion); i { case 0: return &v.state @@ -11500,7 +11826,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BuildProviderPluginCache_Event_ProviderWarnings); i { case 0: return &v.state @@ -11512,7 +11838,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BuildProviderPluginCache_Event_FetchBegin); i { case 0: return &v.state @@ -11524,7 +11850,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BuildProviderPluginCache_Event_FetchComplete); i { case 0: return &v.state @@ -11536,7 +11862,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenProviderPluginCache_Request); i { case 0: return &v.state @@ -11548,7 +11874,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenProviderPluginCache_Response); i { case 0: return &v.state @@ -11560,7 +11886,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CloseProviderPluginCache_Request); i { case 0: return &v.state @@ -11572,7 +11898,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CloseProviderPluginCache_Response); i { case 0: return &v.state @@ -11584,7 +11910,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetCachedProviders_Request); i { case 0: return &v.state @@ -11596,7 +11922,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetCachedProviders_Response); i { case 0: return &v.state @@ -11608,7 +11934,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBuiltInProviders_Request); i { case 0: return &v.state @@ -11620,7 +11946,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBuiltInProviders_Response); i { case 0: return &v.state @@ -11632,7 +11958,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetProviderSchema_Request); i { case 0: return &v.state @@ -11644,7 +11970,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetProviderSchema_Response); i { case 0: return &v.state @@ -11656,7 +11982,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenStackConfiguration_Request); i { case 0: return &v.state @@ -11668,7 +11994,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenStackConfiguration_Response); i { case 0: return &v.state @@ -11680,7 +12006,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CloseStackConfiguration_Request); i { case 0: return &v.state @@ -11692,7 +12018,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CloseStackConfiguration_Response); i { case 0: return &v.state @@ -11704,7 +12030,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidateStackConfiguration_Request); i { case 0: return &v.state @@ -11716,7 +12042,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ValidateStackConfiguration_Response); i { case 0: return &v.state @@ -11728,7 +12054,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FindStackConfigurationComponents_Request); i { case 0: return &v.state @@ -11740,7 +12066,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FindStackConfigurationComponents_Response); i { case 0: return &v.state @@ -11752,7 +12078,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FindStackConfigurationComponents_StackConfig); i { case 0: return &v.state @@ -11764,7 +12090,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FindStackConfigurationComponents_EmbeddedStack); i { case 0: return &v.state @@ -11776,7 +12102,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FindStackConfigurationComponents_Component); i { case 0: return &v.state @@ -11788,7 +12114,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlanStackChanges_Request); i { case 0: return &v.state @@ -11800,7 +12126,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlanStackChanges_Event); i { case 0: return &v.state @@ -11812,7 +12138,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ApplyStackChanges_Request); i { case 0: return &v.state @@ -11824,7 +12150,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ApplyStackChanges_Event); i { case 0: return &v.state @@ -11836,7 +12162,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenStackInspector_Request); i { case 0: return &v.state @@ -11848,7 +12174,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenStackInspector_Response); i { case 0: return &v.state @@ -11860,7 +12186,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InspectExpressionResult_Request); i { case 0: return &v.state @@ -11872,7 +12198,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InspectExpressionResult_Response); i { case 0: return &v.state @@ -11884,7 +12210,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AttributePath_Step); i { case 0: return &v.state @@ -11896,7 +12222,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlannedChange_ChangeDescription); i { case 0: return &v.state @@ -11908,7 +12234,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlannedChange_ComponentInstance); i { case 0: return &v.state @@ -11920,7 +12246,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlannedChange_ResourceInstance); i { case 0: return &v.state @@ -11932,7 +12258,7 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { + file_terraform1_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlannedChange_OutputValue); i { case 0: return &v.state @@ -11944,20 +12270,8 @@ func file_terraform1_proto_init() { return nil } } - file_terraform1_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PlannedChange_ResourceInstance_Moved); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } file_terraform1_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PlannedChange_ResourceInstance_Imported); i { + switch v := v.(*PlannedChange_ResourceInstanceDeferred); i { case 0: return &v.state case 1: @@ -11969,7 +12283,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppliedChange_RawChange); i { + switch v := v.(*PlannedChange_ResourceInstance_Moved); i { case 0: return &v.state case 1: @@ -11981,7 +12295,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppliedChange_ChangeDescription); i { + switch v := v.(*PlannedChange_ResourceInstance_Imported); i { case 0: return &v.state case 1: @@ -11993,7 +12307,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppliedChange_ResourceInstance); i { + switch v := v.(*AppliedChange_RawChange); i { case 0: return &v.state case 1: @@ -12005,7 +12319,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppliedChange_ComponentInstance); i { + switch v := v.(*AppliedChange_ChangeDescription); i { case 0: return &v.state case 1: @@ -12017,7 +12331,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppliedChange_OutputValue); i { + switch v := v.(*AppliedChange_ResourceInstance); i { case 0: return &v.state case 1: @@ -12029,7 +12343,19 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppliedChange_Nothing); i { + switch v := v.(*AppliedChange_ComponentInstance); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AppliedChange_OutputValue); i { case 0: return &v.state case 1: @@ -12041,19 +12367,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StackChangeProgress_ComponentInstanceStatus); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_terraform1_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StackChangeProgress_ResourceInstanceStatus); i { + switch v := v.(*AppliedChange_Nothing); i { case 0: return &v.state case 1: @@ -12065,7 +12379,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StackChangeProgress_ResourceInstancePlannedChange); i { + switch v := v.(*StackChangeProgress_ComponentInstanceStatus); i { case 0: return &v.state case 1: @@ -12077,7 +12391,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StackChangeProgress_ProvisionerStatus); i { + switch v := v.(*StackChangeProgress_ResourceInstanceStatus); i { case 0: return &v.state case 1: @@ -12089,7 +12403,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StackChangeProgress_ProvisionerOutput); i { + switch v := v.(*StackChangeProgress_ResourceInstancePlannedChange); i { case 0: return &v.state case 1: @@ -12101,7 +12415,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StackChangeProgress_ComponentInstanceChanges); i { + switch v := v.(*StackChangeProgress_DeferredResourceInstancePlannedChange); i { case 0: return &v.state case 1: @@ -12113,7 +12427,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StackChangeProgress_ComponentInstances); i { + switch v := v.(*StackChangeProgress_ProvisionerStatus); i { case 0: return &v.state case 1: @@ -12125,7 +12439,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StackChangeProgress_ResourceInstancePlannedChange_Moved); i { + switch v := v.(*StackChangeProgress_ProvisionerOutput); i { case 0: return &v.state case 1: @@ -12137,7 +12451,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StackChangeProgress_ResourceInstancePlannedChange_Imported); i { + switch v := v.(*StackChangeProgress_ComponentInstanceChanges); i { case 0: return &v.state case 1: @@ -12149,7 +12463,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Schema_Block); i { + switch v := v.(*StackChangeProgress_ComponentInstances); i { case 0: return &v.state case 1: @@ -12161,7 +12475,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Schema_Attribute); i { + switch v := v.(*StackChangeProgress_ResourceInstancePlannedChange_Moved); i { case 0: return &v.state case 1: @@ -12173,7 +12487,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Schema_NestedBlock); i { + switch v := v.(*StackChangeProgress_ResourceInstancePlannedChange_Imported); i { case 0: return &v.state case 1: @@ -12185,7 +12499,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Schema_Object); i { + switch v := v.(*Schema_Block); i { case 0: return &v.state case 1: @@ -12197,7 +12511,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Schema_DocString); i { + switch v := v.(*Schema_Attribute); i { case 0: return &v.state case 1: @@ -12209,7 +12523,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProviderPackageVersions_Request); i { + switch v := v.(*Schema_NestedBlock); i { case 0: return &v.state case 1: @@ -12221,7 +12535,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProviderPackageVersions_Response); i { + switch v := v.(*Schema_Object); i { case 0: return &v.state case 1: @@ -12233,7 +12547,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FetchProviderPackage_Request); i { + switch v := v.(*Schema_DocString); i { case 0: return &v.state case 1: @@ -12245,7 +12559,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FetchProviderPackage_Response); i { + switch v := v.(*ProviderPackageVersions_Request); i { case 0: return &v.state case 1: @@ -12257,7 +12571,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FetchProviderPackage_PlatformResult); i { + switch v := v.(*ProviderPackageVersions_Response); i { case 0: return &v.state case 1: @@ -12269,7 +12583,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ModulePackageVersions_Request); i { + switch v := v.(*FetchProviderPackage_Request); i { case 0: return &v.state case 1: @@ -12281,7 +12595,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ModulePackageVersions_Response); i { + switch v := v.(*FetchProviderPackage_Response); i { case 0: return &v.state case 1: @@ -12293,7 +12607,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ModulePackageSourceAddr_Request); i { + switch v := v.(*FetchProviderPackage_PlatformResult); i { case 0: return &v.state case 1: @@ -12305,7 +12619,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[147].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ModulePackageSourceAddr_Response); i { + switch v := v.(*ModulePackageVersions_Request); i { case 0: return &v.state case 1: @@ -12317,7 +12631,7 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[148].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FetchModulePackage_Request); i { + switch v := v.(*ModulePackageVersions_Response); i { case 0: return &v.state case 1: @@ -12329,6 +12643,42 @@ func file_terraform1_proto_init() { } } file_terraform1_proto_msgTypes[149].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ModulePackageSourceAddr_Request); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[150].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ModulePackageSourceAddr_Response); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[151].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FetchModulePackage_Request); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_terraform1_proto_msgTypes[152].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FetchModulePackage_Response); i { case 0: return &v.state @@ -12341,7 +12691,7 @@ func file_terraform1_proto_init() { } } } - file_terraform1_proto_msgTypes[38].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[39].OneofWrappers = []interface{}{ (*StackChangeProgress_ComponentInstanceStatus_)(nil), (*StackChangeProgress_ResourceInstanceStatus_)(nil), (*StackChangeProgress_ResourceInstancePlannedChange_)(nil), @@ -12349,8 +12699,9 @@ func file_terraform1_proto_init() { (*StackChangeProgress_ProvisionerOutput_)(nil), (*StackChangeProgress_ComponentInstanceChanges_)(nil), (*StackChangeProgress_ComponentInstances_)(nil), + (*StackChangeProgress_DeferredResourceInstancePlannedChange_)(nil), } - file_terraform1_proto_msgTypes[66].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[67].OneofWrappers = []interface{}{ (*BuildProviderPluginCache_Event_Pending_)(nil), (*BuildProviderPluginCache_Event_AlreadyInstalled)(nil), (*BuildProviderPluginCache_Event_BuiltIn)(nil), @@ -12361,33 +12712,34 @@ func file_terraform1_proto_init() { (*BuildProviderPluginCache_Event_FetchComplete_)(nil), (*BuildProviderPluginCache_Event_Diagnostic)(nil), } - file_terraform1_proto_msgTypes[67].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[68].OneofWrappers = []interface{}{ (*BuildProviderPluginCache_Request_InstallMethod_Direct)(nil), (*BuildProviderPluginCache_Request_InstallMethod_LocalMirrorDir)(nil), (*BuildProviderPluginCache_Request_InstallMethod_NetworkMirrorUrl)(nil), } - file_terraform1_proto_msgTypes[100].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[101].OneofWrappers = []interface{}{ (*PlanStackChanges_Event_PlannedChange)(nil), (*PlanStackChanges_Event_Diagnostic)(nil), (*PlanStackChanges_Event_Progress)(nil), } - file_terraform1_proto_msgTypes[104].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[105].OneofWrappers = []interface{}{ (*ApplyStackChanges_Event_AppliedChange)(nil), (*ApplyStackChanges_Event_Diagnostic)(nil), (*ApplyStackChanges_Event_Progress)(nil), } - file_terraform1_proto_msgTypes[111].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[112].OneofWrappers = []interface{}{ (*AttributePath_Step_AttributeName)(nil), (*AttributePath_Step_ElementKeyString)(nil), (*AttributePath_Step_ElementKeyInt)(nil), } - file_terraform1_proto_msgTypes[112].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[113].OneofWrappers = []interface{}{ (*PlannedChange_ChangeDescription_ComponentInstancePlanned)(nil), (*PlannedChange_ChangeDescription_ResourceInstancePlanned)(nil), (*PlannedChange_ChangeDescription_OutputValuePlanned)(nil), (*PlannedChange_ChangeDescription_PlanApplyable)(nil), + (*PlannedChange_ChangeDescription_ResourceInstanceDeferred)(nil), } - file_terraform1_proto_msgTypes[119].OneofWrappers = []interface{}{ + file_terraform1_proto_msgTypes[121].OneofWrappers = []interface{}{ (*AppliedChange_ChangeDescription_Deleted)(nil), (*AppliedChange_ChangeDescription_ResourceInstance)(nil), (*AppliedChange_ChangeDescription_OutputValue)(nil), @@ -12398,8 +12750,8 @@ func file_terraform1_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_terraform1_proto_rawDesc, - NumEnums: 12, - NumMessages: 150, + NumEnums: 13, + NumMessages: 153, NumExtensions: 0, NumServices: 4, }, diff --git a/internal/rpcapi/terraform1/terraform1.proto b/internal/rpcapi/terraform1/terraform1.proto index 1798f13af3..f81fee4d72 100644 --- a/internal/rpcapi/terraform1/terraform1.proto +++ b/internal/rpcapi/terraform1/terraform1.proto @@ -748,6 +748,7 @@ message PlannedChange { ResourceInstance resource_instance_planned = 2; OutputValue output_value_planned = 3; bool plan_applyable = 4; + ResourceInstanceDeferred resource_instance_deferred = 5; } } @@ -826,6 +827,27 @@ message PlannedChange { repeated ChangeType actions = 2; DynamicValueChange values = 3; } + + message ResourceInstanceDeferred { + ResourceInstance resource_instance = 1; + Deferred deferred = 2; + } +} + +// Deferred contains all the metadata about a the deferral of a resource +// instance change. +message Deferred { + // Reason describes the reason why a resource instance change was + // deferred. + enum Reason { + INVALID = 0; + INSTANCE_COUNT_UNKNOWN = 1; + RESOURCE_CONFIG_UNKNOWN = 2; + PROVIDER_CONFIG_UNKNOWN = 3; + ABSENT_PREREQ = 4; + DEFERRED_PREREQ = 5; + } + Reason reason = 1; } // Describes a change made during a Stacks.ApplyStackChanges call. @@ -969,6 +991,7 @@ message StackChangeProgress { ProvisionerOutput provisioner_output = 5; ComponentInstanceChanges component_instance_changes = 6; ComponentInstances component_instances = 7; + DeferredResourceInstancePlannedChange deferred_resource_instance_planned_change = 8; } // ComponentInstanceStatus describes the current status of a component instance @@ -1028,6 +1051,13 @@ message StackChangeProgress { } } + // DeferredResourceInstancePlannedChange represents a planned change for a + // resource instance that is deferred due to the reason provided. + message DeferredResourceInstancePlannedChange { + Deferred deferred = 1; + ResourceInstancePlannedChange change = 2; + } + // ProvisionerStatus represents the progress of a given provisioner during its // resource instance's apply operation. message ProvisionerStatus { diff --git a/internal/stacks/stackplan/component.go b/internal/stacks/stackplan/component.go index 9d413fd521..aa5003e713 100644 --- a/internal/stacks/stackplan/component.go +++ b/internal/stacks/stackplan/component.go @@ -46,8 +46,9 @@ type Component struct { // will handle any apply-time actions for that object. ResourceInstanceProviderConfig addrs.Map[addrs.AbsResourceInstanceObject, addrs.AbsProviderConfig] - // TODO: Something for deferred resource instance changes, once we have - // such a concept. + // DeferredResourceInstanceChanges is a set of resource instance objects + // that have changes that are deferred to a later plan and apply cycle. + DeferredResourceInstanceChanges addrs.Map[addrs.AbsResourceInstanceObject, *plans.DeferredResourceInstanceChangeSrc] // PlanTimestamp is the time Terraform Core recorded as the single "plan // timestamp", which is used only for the result of the "plantimestamp" diff --git a/internal/stacks/stackplan/from_proto.go b/internal/stacks/stackplan/from_proto.go index fbdb789b35..f6e2bf4dd8 100644 --- a/internal/stacks/stackplan/from_proto.go +++ b/internal/stacks/stackplan/from_proto.go @@ -15,6 +15,7 @@ import ( "github.com/hashicorp/terraform/internal/plans" "github.com/hashicorp/terraform/internal/plans/planfile" "github.com/hashicorp/terraform/internal/plans/planproto" + "github.com/hashicorp/terraform/internal/providers" "github.com/hashicorp/terraform/internal/stacks/stackaddrs" "github.com/hashicorp/terraform/internal/stacks/stackstate" "github.com/hashicorp/terraform/internal/stacks/tfstackdata1" @@ -122,9 +123,10 @@ func LoadFromProto(msgs []*anypb.Any) (*Plan, error) { PlannedOutputValues: outputVals, PlannedChecks: checkResults, - ResourceInstancePlanned: addrs.MakeMap[addrs.AbsResourceInstanceObject, *plans.ResourceInstanceChangeSrc](), - ResourceInstancePriorState: addrs.MakeMap[addrs.AbsResourceInstanceObject, *states.ResourceInstanceObjectSrc](), - ResourceInstanceProviderConfig: addrs.MakeMap[addrs.AbsResourceInstanceObject, addrs.AbsProviderConfig](), + ResourceInstancePlanned: addrs.MakeMap[addrs.AbsResourceInstanceObject, *plans.ResourceInstanceChangeSrc](), + ResourceInstancePriorState: addrs.MakeMap[addrs.AbsResourceInstanceObject, *states.ResourceInstanceObjectSrc](), + ResourceInstanceProviderConfig: addrs.MakeMap[addrs.AbsResourceInstanceObject, addrs.AbsProviderConfig](), + DeferredResourceInstanceChanges: addrs.MakeMap[addrs.AbsResourceInstanceObject, *plans.DeferredResourceInstanceChangeSrc](), }) } c := ret.Components.Get(addr) @@ -134,60 +136,22 @@ func LoadFromProto(msgs []*anypb.Any) (*Plan, error) { } case *tfstackdata1.PlanResourceInstanceChangePlanned: - cAddr, diags := stackaddrs.ParseAbsComponentInstanceStr(msg.ComponentInstanceAddr) - if diags.HasErrors() { - return nil, fmt.Errorf("invalid component instance address syntax in %q", msg.ComponentInstanceAddr) + c, fullAddr, providerConfigAddr, err := LoadComponentForResourceInstance(ret, msg) + if err != nil { + return nil, err } - riAddr, diags := addrs.ParseAbsResourceInstanceStr(msg.ResourceInstanceAddr) - if diags.HasErrors() { - return nil, fmt.Errorf("invalid resource instance address syntax in %q", msg.ResourceInstanceAddr) - } - var deposedKey addrs.DeposedKey - if msg.DeposedKey != "" { - deposedKey, err = addrs.ParseDeposedKey(msg.DeposedKey) - if err != nil { - return nil, fmt.Errorf("invalid deposed key syntax in %q", msg.DeposedKey) - } - } - providerConfigAddr, diags := addrs.ParseAbsProviderConfigStr(msg.ProviderConfigAddr) - if diags.HasErrors() { - return nil, fmt.Errorf("invalid provider configuration address syntax in %q", msg.ProviderConfigAddr) - } - fullAddr := addrs.AbsResourceInstanceObject{ - ResourceInstance: riAddr, - DeposedKey: deposedKey, - } - c, ok := ret.Components.GetOk(cAddr) - if !ok { - return nil, fmt.Errorf("resource instance change for unannounced component instance %s", cAddr) - } - c.ResourceInstanceProviderConfig.Put(fullAddr, providerConfigAddr) - var riPlan *plans.ResourceInstanceChangeSrc // Not all "planned changes" for resource instances are actually // changes in the plans.Change sense, confusingly: sometimes the // "change" we're recording is just to overwrite the state entry // with a refreshed copy, in which case riPlan is nil and // msg.PriorState is the main content of this change, handled below. if msg.Change != nil { - riPlan, err = planfile.ResourceChangeFromProto(msg.Change) + riPlan, err := ValidateResourceInstanceChange(msg, fullAddr, providerConfigAddr) if err != nil { - return nil, fmt.Errorf("invalid resource instance change: %w", err) + return nil, err } - // We currently have some redundant information in the nested - // "change" object due to having reused some protobuf message - // types from the traditional Terraform CLI planproto format. - // We'll make sure the redundant information is consistent - // here because otherwise they're likely to cause - // difficult-to-debug problems downstream. - if !riPlan.Addr.Equal(fullAddr.ResourceInstance) && riPlan.DeposedKey == fullAddr.DeposedKey { - return nil, fmt.Errorf("planned change has inconsistent address to its containing object") - } - if !riPlan.ProviderAddr.Equal(providerConfigAddr) { - return nil, fmt.Errorf("planned change has inconsistent provider configuration address to its containing object") - } - c.ResourceInstancePlanned.Put(fullAddr, riPlan) } @@ -204,6 +168,42 @@ func LoadFromProto(msgs []*anypb.Any) (*Plan, error) { c.ResourceInstancePriorState.Put(fullAddr, nil) } + case *tfstackdata1.PlanDeferredResourceInstanceChange: + if msg.Deferred == nil { + return nil, fmt.Errorf("missing deferred from PlanDeferredResourceInstanceChange") + } + + c, fullAddr, providerConfigAddr, err := LoadComponentForResourceInstance(ret, msg.Change) + if err != nil { + return nil, err + } + + riPlan, err := ValidateResourceInstanceChange(msg.Change, fullAddr, providerConfigAddr) + if err != nil { + return nil, err + } + + var deferredReason providers.DeferredReason + switch msg.Deferred.Reason { + case tfstackdata1.PlanDeferredResourceInstanceChange_Deferred_INSTANCE_COUNT_UNKNOWN: + deferredReason = providers.DeferredReasonInstanceCountUnknown + case tfstackdata1.PlanDeferredResourceInstanceChange_Deferred_RESOURCE_CONFIG_UNKNOWN: + deferredReason = providers.DeferredReasonResourceConfigUnknown + case tfstackdata1.PlanDeferredResourceInstanceChange_Deferred_PROVIDER_CONFIG_UNKNOWN: + deferredReason = providers.DeferredReasonProviderConfigUnknown + case tfstackdata1.PlanDeferredResourceInstanceChange_Deferred_ABSENT_PREREQ: + deferredReason = providers.DeferredReasonAbsentPrereq + case tfstackdata1.PlanDeferredResourceInstanceChange_Deferred_DEFERRED_PREREQ: + deferredReason = providers.DeferredReasonDeferredPrereq + default: + deferredReason = providers.DeferredReasonInvalid + } + + c.DeferredResourceInstanceChanges.Put(fullAddr, &plans.DeferredResourceInstanceChangeSrc{ + ChangeSrc: riPlan, + DeferredReason: deferredReason, + }) + default: // Should not get here, because a stack plan can only be loaded by // the same version of Terraform that created it, and the above @@ -250,3 +250,60 @@ func LoadFromProto(msgs []*anypb.Any) (*Plan, error) { return ret, nil } + +func ValidateResourceInstanceChange(change *tfstackdata1.PlanResourceInstanceChangePlanned, fullAddr addrs.AbsResourceInstanceObject, providerConfigAddr addrs.AbsProviderConfig) (*plans.ResourceInstanceChangeSrc, error) { + riPlan, err := planfile.ResourceChangeFromProto(change.Change) + if err != nil { + return nil, fmt.Errorf("invalid resource instance change: %w", err) + } + // We currently have some redundant information in the nested + // "change" object due to having reused some protobuf message + // types from the traditional Terraform CLI planproto format. + // We'll make sure the redundant information is consistent + // here because otherwise they're likely to cause + // difficult-to-debug problems downstream. + if !riPlan.Addr.Equal(fullAddr.ResourceInstance) && riPlan.DeposedKey == fullAddr.DeposedKey { + return nil, fmt.Errorf("planned change has inconsistent address to its containing object") + } + if !riPlan.ProviderAddr.Equal(providerConfigAddr) { + return nil, fmt.Errorf("planned change has inconsistent provider configuration address to its containing object") + } + return riPlan, nil +} + +func LoadComponentForResourceInstance(plan *Plan, change *tfstackdata1.PlanResourceInstanceChangePlanned) (*Component, addrs.AbsResourceInstanceObject, addrs.AbsProviderConfig, error) { + cAddr, diags := stackaddrs.ParseAbsComponentInstanceStr(change.ComponentInstanceAddr) + if diags.HasErrors() { + return nil, addrs.AbsResourceInstanceObject{}, addrs.AbsProviderConfig{}, fmt.Errorf("invalid component instance address syntax in %q", change.ComponentInstanceAddr) + } + + providerConfigAddr, diags := addrs.ParseAbsProviderConfigStr(change.ProviderConfigAddr) + if diags.HasErrors() { + return nil, addrs.AbsResourceInstanceObject{}, addrs.AbsProviderConfig{}, fmt.Errorf("invalid provider configuration address syntax in %q", change.ProviderConfigAddr) + } + + riAddr, diags := addrs.ParseAbsResourceInstanceStr(change.ResourceInstanceAddr) + if diags.HasErrors() { + return nil, addrs.AbsResourceInstanceObject{}, addrs.AbsProviderConfig{}, fmt.Errorf("invalid resource instance address syntax in %q", change.ResourceInstanceAddr) + } + + var deposedKey addrs.DeposedKey + if change.DeposedKey != "" { + var err error + deposedKey, err = addrs.ParseDeposedKey(change.DeposedKey) + if err != nil { + return nil, addrs.AbsResourceInstanceObject{}, addrs.AbsProviderConfig{}, fmt.Errorf("invalid deposed key syntax in %q", change.DeposedKey) + } + } + fullAddr := addrs.AbsResourceInstanceObject{ + ResourceInstance: riAddr, + DeposedKey: deposedKey, + } + + c, ok := plan.Components.GetOk(cAddr) + if !ok { + return nil, addrs.AbsResourceInstanceObject{}, addrs.AbsProviderConfig{}, fmt.Errorf("resource instance change for unannounced component instance %s", cAddr) + } + + return c, fullAddr, providerConfigAddr, nil +} diff --git a/internal/stacks/stackplan/planned_change.go b/internal/stacks/stackplan/planned_change.go index db48a25a3b..0f7ad558d7 100644 --- a/internal/stacks/stackplan/planned_change.go +++ b/internal/stacks/stackplan/planned_change.go @@ -18,6 +18,7 @@ import ( "github.com/hashicorp/terraform/internal/plans" "github.com/hashicorp/terraform/internal/plans/planfile" "github.com/hashicorp/terraform/internal/plans/planproto" + "github.com/hashicorp/terraform/internal/providers" "github.com/hashicorp/terraform/internal/rpcapi/terraform1" "github.com/hashicorp/terraform/internal/stacks/stackaddrs" "github.com/hashicorp/terraform/internal/stacks/stackutils" @@ -267,28 +268,19 @@ type PlannedChangeResourceInstancePlanned struct { var _ PlannedChange = (*PlannedChangeResourceInstancePlanned)(nil) -// PlannedChangeProto implements PlannedChange. -func (pc *PlannedChangeResourceInstancePlanned) PlannedChangeProto() (*terraform1.PlannedChange, error) { +func (pc *PlannedChangeResourceInstancePlanned) PlanResourceInstanceChangePlannedProto() (*tfstackdata1.PlanResourceInstanceChangePlanned, error) { rioAddr := pc.ResourceInstanceObjectAddr if pc.ChangeSrc == nil && pc.PriorStateSrc == nil { // This is just a stubby placeholder to remind us to drop the // apparently-deleted-outside-of-Terraform object from the state // if this plan later gets applied. - // We only emit a "raw" in this case, because this is a relatively - // uninteresting edge-case. - var raw anypb.Any - err := anypb.MarshalFrom(&raw, &tfstackdata1.PlanResourceInstanceChangePlanned{ + + return &tfstackdata1.PlanResourceInstanceChangePlanned{ ComponentInstanceAddr: rioAddr.Component.String(), ResourceInstanceAddr: rioAddr.Item.ResourceInstance.String(), DeposedKey: rioAddr.Item.DeposedKey.String(), ProviderConfigAddr: pc.ProviderConfigAddr.String(), - }, proto.MarshalOptions{}) - if err != nil { - return nil, err - } - return &terraform1.PlannedChange{ - Raw: []*anypb.Any{&raw}, }, nil } @@ -303,59 +295,171 @@ func (pc *PlannedChangeResourceInstancePlanned) PlannedChangeProto() (*terraform if err != nil { return nil, fmt.Errorf("converting resource instance change to proto: %w", err) } - var raw anypb.Any - err = anypb.MarshalFrom(&raw, &tfstackdata1.PlanResourceInstanceChangePlanned{ + return &tfstackdata1.PlanResourceInstanceChangePlanned{ ComponentInstanceAddr: rioAddr.Component.String(), ResourceInstanceAddr: rioAddr.Item.ResourceInstance.String(), DeposedKey: rioAddr.Item.DeposedKey.String(), ProviderConfigAddr: pc.ProviderConfigAddr.String(), Change: changeProto, PriorState: priorStateProto, - }, proto.MarshalOptions{}) + }, nil +} + +func (pc *PlannedChangeResourceInstancePlanned) ChangeDescription() (*terraform1.PlannedChange_ChangeDescription, error) { + rioAddr := pc.ResourceInstanceObjectAddr + // We only emit an external description if there's a change to describe. + // Otherwise, we just emit a raw to remind us to update the state for + // this object during the apply step, to match the prior state. + if pc.ChangeSrc == nil { + return nil, nil + } + + protoChangeTypes, err := terraform1.ChangeTypesForPlanAction(pc.ChangeSrc.Action) + if err != nil { + return nil, err + } + replacePaths, err := encodePathSet(pc.ChangeSrc.RequiredReplace) if err != nil { return nil, err } - var descs []*terraform1.PlannedChange_ChangeDescription - // We only emit an external description if there's a change to describe. - // Otherwise, we just emit a raw to remind us to update the state for - // this object during the apply step, to match the prior state. - if pc.ChangeSrc != nil { - protoChangeTypes, err := terraform1.ChangeTypesForPlanAction(pc.ChangeSrc.Action) - if err != nil { - return nil, err - } - replacePaths, err := encodePathSet(pc.ChangeSrc.RequiredReplace) - if err != nil { - return nil, err - } - descs = []*terraform1.PlannedChange_ChangeDescription{ - { - Description: &terraform1.PlannedChange_ChangeDescription_ResourceInstancePlanned{ - ResourceInstancePlanned: &terraform1.PlannedChange_ResourceInstance{ - Addr: terraform1.NewResourceInstanceObjectInStackAddr(rioAddr), - ResourceMode: stackutils.ResourceModeForProto(pc.ChangeSrc.Addr.Resource.Resource.Mode), - ResourceType: pc.ChangeSrc.Addr.Resource.Resource.Type, - ProviderAddr: pc.ChangeSrc.ProviderAddr.Provider.String(), + return &terraform1.PlannedChange_ChangeDescription{ + Description: &terraform1.PlannedChange_ChangeDescription_ResourceInstancePlanned{ + ResourceInstancePlanned: &terraform1.PlannedChange_ResourceInstance{ + Addr: terraform1.NewResourceInstanceObjectInStackAddr(rioAddr), + ResourceMode: stackutils.ResourceModeForProto(pc.ChangeSrc.Addr.Resource.Resource.Mode), + ResourceType: pc.ChangeSrc.Addr.Resource.Resource.Type, + ProviderAddr: pc.ChangeSrc.ProviderAddr.Provider.String(), - Actions: protoChangeTypes, - Values: &terraform1.DynamicValueChange{ - Old: terraform1.NewDynamicValue( - pc.ChangeSrc.Before, - pc.ChangeSrc.BeforeSensitivePaths, - ), - New: terraform1.NewDynamicValue( - pc.ChangeSrc.After, - pc.ChangeSrc.AfterSensitivePaths, - ), - }, - ReplacePaths: replacePaths, - // TODO: Moved, Imported - }, + Actions: protoChangeTypes, + Values: &terraform1.DynamicValueChange{ + Old: terraform1.NewDynamicValue( + pc.ChangeSrc.Before, + pc.ChangeSrc.BeforeSensitivePaths, + ), + New: terraform1.NewDynamicValue( + pc.ChangeSrc.After, + pc.ChangeSrc.AfterSensitivePaths, + ), }, + ReplacePaths: replacePaths, + // TODO: Moved, Imported }, - } + }, + }, nil + +} + +// PlannedChangeProto implements PlannedChange. +func (pc *PlannedChangeResourceInstancePlanned) PlannedChangeProto() (*terraform1.PlannedChange, error) { + pric, err := pc.PlanResourceInstanceChangePlannedProto() + if err != nil { + return nil, err } + var raw anypb.Any + err = anypb.MarshalFrom(&raw, pric, proto.MarshalOptions{}) + if err != nil { + return nil, err + } + + if pc.ChangeSrc == nil && pc.PriorStateSrc == nil { + // We only emit a "raw" in this case, because this is a relatively + // uninteresting edge-case. The PlanResourceInstanceChangePlannedProto + // function should have returned a placeholder value for this use case. + + return &terraform1.PlannedChange{ + Raw: []*anypb.Any{&raw}, + }, nil + } + + var descs []*terraform1.PlannedChange_ChangeDescription + desc, err := pc.ChangeDescription() + if err != nil { + return nil, err + } + if desc != nil { + descs = append(descs, desc) + } + + return &terraform1.PlannedChange{ + Raw: []*anypb.Any{&raw}, + Descriptions: descs, + }, nil +} + +// PlannedChangeDeferredResourceInstancePlanned announces that an action that Terraform +// is proposing to take if this plan is applied is being deferred. +type PlannedChangeDeferredResourceInstancePlanned struct { + // ResourceInstancePlanned is the planned change that is being deferred. + ResourceInstancePlanned PlannedChangeResourceInstancePlanned + + // DeferredReason is the reason why the change is being deferred. + DeferredReason providers.DeferredReason +} + +var _ PlannedChange = (*PlannedChangeDeferredResourceInstancePlanned)(nil) + +// PlannedChangeProto implements PlannedChange. +func (dpc *PlannedChangeDeferredResourceInstancePlanned) PlannedChangeProto() (*terraform1.PlannedChange, error) { + change, err := dpc.ResourceInstancePlanned.PlanResourceInstanceChangePlannedProto() + if err != nil { + return nil, err + } + + var deferred tfstackdata1.PlanDeferredResourceInstanceChange_Deferred + switch dpc.DeferredReason { + case providers.DeferredReasonInstanceCountUnknown: + deferred.Reason = tfstackdata1.PlanDeferredResourceInstanceChange_Deferred_INSTANCE_COUNT_UNKNOWN + case providers.DeferredReasonResourceConfigUnknown: + deferred.Reason = tfstackdata1.PlanDeferredResourceInstanceChange_Deferred_RESOURCE_CONFIG_UNKNOWN + case providers.DeferredReasonProviderConfigUnknown: + deferred.Reason = tfstackdata1.PlanDeferredResourceInstanceChange_Deferred_PROVIDER_CONFIG_UNKNOWN + case providers.DeferredReasonAbsentPrereq: + deferred.Reason = tfstackdata1.PlanDeferredResourceInstanceChange_Deferred_ABSENT_PREREQ + case providers.DeferredReasonDeferredPrereq: + deferred.Reason = tfstackdata1.PlanDeferredResourceInstanceChange_Deferred_DEFERRED_PREREQ + default: + deferred.Reason = tfstackdata1.PlanDeferredResourceInstanceChange_Deferred_INVALID + } + + var raw anypb.Any + err = anypb.MarshalFrom(&raw, &tfstackdata1.PlanDeferredResourceInstanceChange{ + Change: change, + Deferred: &deferred, + }, proto.MarshalOptions{}) + if err != nil { + return nil, err + } + ricd, err := dpc.ResourceInstancePlanned.ChangeDescription() + if err != nil { + return nil, err + } + + var deferred2 terraform1.Deferred + switch dpc.DeferredReason { + case providers.DeferredReasonInstanceCountUnknown: + deferred2.Reason = terraform1.Deferred_INSTANCE_COUNT_UNKNOWN + case providers.DeferredReasonResourceConfigUnknown: + deferred2.Reason = terraform1.Deferred_RESOURCE_CONFIG_UNKNOWN + case providers.DeferredReasonProviderConfigUnknown: + deferred2.Reason = terraform1.Deferred_PROVIDER_CONFIG_UNKNOWN + case providers.DeferredReasonAbsentPrereq: + deferred2.Reason = terraform1.Deferred_ABSENT_PREREQ + case providers.DeferredReasonDeferredPrereq: + deferred2.Reason = terraform1.Deferred_DEFERRED_PREREQ + default: + deferred2.Reason = terraform1.Deferred_INVALID + } + + var descs []*terraform1.PlannedChange_ChangeDescription + descs = append(descs, &terraform1.PlannedChange_ChangeDescription{ + Description: &terraform1.PlannedChange_ChangeDescription_ResourceInstanceDeferred{ + ResourceInstanceDeferred: &terraform1.PlannedChange_ResourceInstanceDeferred{ + ResourceInstance: ricd.GetResourceInstancePlanned(), + Deferred: &deferred2, + }, + }, + }) return &terraform1.PlannedChange{ Raw: []*anypb.Any{&raw}, diff --git a/internal/stacks/stackplan/planned_change_test.go b/internal/stacks/stackplan/planned_change_test.go index 8a0620cdec..40427f536f 100644 --- a/internal/stacks/stackplan/planned_change_test.go +++ b/internal/stacks/stackplan/planned_change_test.go @@ -17,6 +17,7 @@ import ( "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/plans" "github.com/hashicorp/terraform/internal/plans/planproto" + "github.com/hashicorp/terraform/internal/providers" "github.com/hashicorp/terraform/internal/rpcapi/terraform1" "github.com/hashicorp/terraform/internal/stacks/stackaddrs" "github.com/hashicorp/terraform/internal/stacks/tfstackdata1" @@ -203,6 +204,111 @@ func TestPlannedChangeAsProto(t *testing.T) { }, }, }, + "resource instance deferred": { + Receiver: &PlannedChangeDeferredResourceInstancePlanned{ + ResourceInstancePlanned: PlannedChangeResourceInstancePlanned{ + ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ + Component: stackaddrs.AbsComponentInstance{ + Stack: stackaddrs.RootStackInstance.Child("a", addrs.StringKey("boop")), + Item: stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "foo"}, + Key: addrs.StringKey("beep"), + }, + }, + Item: addrs.AbsResourceInstanceObject{ + ResourceInstance: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "thingy", + Name: "wotsit", + }.Instance(addrs.IntKey(1)).Absolute( + addrs.RootModuleInstance.Child("pizza", addrs.StringKey("chicken")), + ), + DeposedKey: addrs.DeposedKey("aaaaaaaa"), + }, + }, + ProviderConfigAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("example.com/thingers/thingy"), + }, + ChangeSrc: &plans.ResourceInstanceChangeSrc{ + Addr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "thingy", + Name: "wotsit", + }.Instance(addrs.IntKey(1)).Absolute( + addrs.RootModuleInstance.Child("pizza", addrs.StringKey("chicken")), + ), + DeposedKey: addrs.DeposedKey("aaaaaaaa"), + ProviderAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("example.com/thingers/thingy"), + }, + ChangeSrc: plans.ChangeSrc{ + Action: plans.Create, + Before: nullObjectForPlan, + After: emptyObjectForPlan, + }, + }, + }, + DeferredReason: providers.DeferredReasonResourceConfigUnknown, + }, + Want: &terraform1.PlannedChange{ + Raw: []*anypb.Any{ + mustMarshalAnyPb(&tfstackdata1.PlanDeferredResourceInstanceChange{ + Change: &tfstackdata1.PlanResourceInstanceChangePlanned{ + ComponentInstanceAddr: `stack.a["boop"].component.foo["beep"]`, + ResourceInstanceAddr: `module.pizza["chicken"].thingy.wotsit[1]`, + DeposedKey: "aaaaaaaa", + ProviderConfigAddr: `provider["example.com/thingers/thingy"]`, + Change: &planproto.ResourceInstanceChange{ + Addr: `module.pizza["chicken"].thingy.wotsit[1]`, + DeposedKey: "aaaaaaaa", + Change: &planproto.Change{ + Action: planproto.Action_CREATE, + Values: []*planproto.DynamicValue{ + {Msgpack: []byte{'\x80'}}, // zero-length mapping + }, + }, + Provider: `provider["example.com/thingers/thingy"]`, + }, + }, + Deferred: &tfstackdata1.PlanDeferredResourceInstanceChange_Deferred{ + Reason: tfstackdata1.PlanDeferredResourceInstanceChange_Deferred_RESOURCE_CONFIG_UNKNOWN, + }, + }), + }, + Descriptions: []*terraform1.PlannedChange_ChangeDescription{ + { + Description: &terraform1.PlannedChange_ChangeDescription_ResourceInstanceDeferred{ + ResourceInstanceDeferred: &terraform1.PlannedChange_ResourceInstanceDeferred{ + ResourceInstance: &terraform1.PlannedChange_ResourceInstance{ + Addr: &terraform1.ResourceInstanceObjectInStackAddr{ + ComponentInstanceAddr: `stack.a["boop"].component.foo["beep"]`, + ResourceInstanceAddr: `module.pizza["chicken"].thingy.wotsit[1]`, + DeposedKey: "aaaaaaaa", + }, + ResourceMode: terraform1.ResourceMode_MANAGED, + ResourceType: "thingy", + ProviderAddr: "example.com/thingers/thingy", + Actions: []terraform1.ChangeType{terraform1.ChangeType_CREATE}, + Values: &terraform1.DynamicValueChange{ + Old: &terraform1.DynamicValue{ + Msgpack: []byte{'\xc0'}, // null + }, + New: &terraform1.DynamicValue{ + Msgpack: []byte{'\x80'}, // zero-length mapping + }, + }, + }, + Deferred: &terraform1.Deferred{ + Reason: terraform1.Deferred_RESOURCE_CONFIG_UNKNOWN, + }, + }, + }, + }, + }, + }, + }, "resource instance planned create": { Receiver: &PlannedChangeResourceInstancePlanned{ ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ diff --git a/internal/stacks/stackruntime/helper_test.go b/internal/stacks/stackruntime/helper_test.go index 111d5dc284..99a5d55723 100644 --- a/internal/stacks/stackruntime/helper_test.go +++ b/internal/stacks/stackruntime/helper_test.go @@ -141,6 +141,8 @@ func plannedChangeSortKey(change stackplan.PlannedChange) string { return change.Addr.String() case *stackplan.PlannedChangeResourceInstancePlanned: return change.ResourceInstanceObjectAddr.String() + case *stackplan.PlannedChangeDeferredResourceInstancePlanned: + return change.ResourceInstancePlanned.ResourceInstanceObjectAddr.String() case *stackplan.PlannedChangeOutputValue: return change.Addr.String() case *stackplan.PlannedChangeHeader: diff --git a/internal/stacks/stackruntime/internal/stackeval/component_instance.go b/internal/stacks/stackruntime/internal/stackeval/component_instance.go index 70b6846f86..449de3ba4b 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_instance.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_instance.go @@ -1376,6 +1376,52 @@ func (c *ComponentInstance) PlanChanges(ctx context.Context) ([]stackplan.Planne seenObjects.Add(addr) } } + + // We need to keep track of the deferred changes as well + for _, dr := range corePlan.DeferredResources { + rsrcChange := dr.ChangeSrc + objAddr := addrs.AbsResourceInstanceObject{ + ResourceInstance: rsrcChange.Addr, + DeposedKey: rsrcChange.DeposedKey, + } + var priorStateSrc *states.ResourceInstanceObjectSrc + if corePlan.PriorState != nil { + priorStateSrc = corePlan.PriorState.ResourceInstanceObjectSrc(objAddr) + } + + schema, err := c.resourceTypeSchema( + ctx, + rsrcChange.ProviderAddr.Provider, + rsrcChange.Addr.Resource.Resource.Mode, + rsrcChange.Addr.Resource.Resource.Type, + ) + if err != nil { + diags = diags.Append(tfdiags.Sourceless( + tfdiags.Error, + "Can't fetch provider schema to save plan", + fmt.Sprintf( + "Failed to retrieve the schema for %s from provider %s: %s. This is a bug in Terraform.", + rsrcChange.Addr, rsrcChange.ProviderAddr.Provider, err, + ), + )) + continue + } + + plannedChangeResourceInstance := stackplan.PlannedChangeResourceInstancePlanned{ + ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ + Component: c.Addr(), + Item: objAddr, + }, + ChangeSrc: rsrcChange, + Schema: schema, + PriorStateSrc: priorStateSrc, + ProviderConfigAddr: rsrcChange.ProviderAddr, + } + changes = append(changes, &stackplan.PlannedChangeDeferredResourceInstancePlanned{ + DeferredReason: dr.DeferredReason, + ResourceInstancePlanned: plannedChangeResourceInstance, + }) + } } return changes, diags diff --git a/internal/stacks/stackruntime/plan.go b/internal/stacks/stackruntime/plan.go index 701dd5a2e9..95fd858210 100644 --- a/internal/stacks/stackruntime/plan.go +++ b/internal/stacks/stackruntime/plan.go @@ -48,6 +48,7 @@ func Plan(ctx context.Context, req *PlanRequest, resp *PlanResponse) { ProviderFactories: req.ProviderFactories, ForcePlanTimestamp: req.ForcePlanTimestamp, + DeferralAllowed: req.DeferralAllowed, }) main.AllowLanguageExperiments(req.ExperimentsAllowed) main.PlanAll(ctx, stackeval.PlanOutput{ @@ -100,6 +101,7 @@ type PlanRequest struct { ForcePlanTimestamp *time.Time ExperimentsAllowed bool + DeferralAllowed bool } // PlanResponse is used by [Plan] to describe the results of planning. diff --git a/internal/stacks/stackruntime/plan_test.go b/internal/stacks/stackruntime/plan_test.go index c61385a795..57398c37ac 100644 --- a/internal/stacks/stackruntime/plan_test.go +++ b/internal/stacks/stackruntime/plan_test.go @@ -16,10 +16,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/hashicorp/hcl/v2" - "github.com/hashicorp/terraform/internal/checks" "github.com/zclconf/go-cty-debug/ctydebug" "github.com/zclconf/go-cty/cty" + "github.com/hashicorp/terraform/internal/checks" + "github.com/hashicorp/terraform/internal/addrs" terraformProvider "github.com/hashicorp/terraform/internal/builtin/providers/terraform" "github.com/hashicorp/terraform/internal/collections" @@ -1574,6 +1575,156 @@ func TestPlanWithCheckableObjects(t *testing.T) { } } +func TestPlanWithDeferredResource(t *testing.T) { + ctx := context.Background() + cfg := loadMainBundleConfigForTest(t, "deferrable-component") + + fakePlanTimestamp, err := time.Parse(time.RFC3339, "1994-09-05T08:50:00Z") + if err != nil { + t.Fatal(err) + } + + changesCh := make(chan stackplan.PlannedChange) + diagsCh := make(chan tfdiags.Diagnostic) + req := PlanRequest{ + Config: cfg, + ProviderFactories: map[addrs.Provider]providers.Factory{ + addrs.NewDefaultProvider("testing"): func() (providers.Interface, error) { + return stacks_testing_provider.NewProvider(), nil + }, + }, + ForcePlanTimestamp: &fakePlanTimestamp, + InputValues: map[stackaddrs.InputVariable]ExternalInputValue{ + {Name: "id"}: { + Value: cty.StringVal("62594ae3"), + }, + {Name: "defer"}: { + Value: cty.BoolVal(true), + }, + }, + // TEMP: Currently there's no way in normal operation to set this to + // true in the PlanOpts, because it would regress other features. So, + // the test has to set it manually. In the future, deferred actions will + // always be enabled for stacks, and we'll remove this option from the + // stackeval.PlanOpts struct. + DeferralAllowed: true, + } + resp := PlanResponse{ + PlannedChanges: changesCh, + Diagnostics: diagsCh, + } + go Plan(ctx, &req, &resp) + gotChanges, diags := collectPlanOutput(changesCh, diagsCh) + + reportDiagnosticsForTest(t, diags) + if len(diags) != 0 { + t.FailNow() // We reported the diags above + } + + sort.SliceStable(gotChanges, func(i, j int) bool { + return plannedChangeSortKey(gotChanges[i]) < plannedChangeSortKey(gotChanges[j]) + }) + + wantChanges := []stackplan.PlannedChange{ + &stackplan.PlannedChangeApplyable{ + // It's slightly confusing that this is true, but the only component + // is not applyable. This is because this is based on the presence + // of any diagnostics, while the component is not applyable because + // it has no pending changes. This difference seems to be + // deliberate. (TODO(TF-15445): Consider revisiting this.) + Applyable: true, + }, + &stackplan.PlannedChangeComponentInstance{ + Addr: stackaddrs.Absolute( + stackaddrs.RootStackInstance, + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "self"}, + }, + ), + PlanComplete: false, + PlanApplyable: false, // We don't have any resources to apply since they're deferred. + Action: plans.Create, + PlannedInputValues: map[string]plans.DynamicValue{ + "id": mustPlanDynamicValueDynamicType(cty.StringVal("62594ae3")), + "defer": mustPlanDynamicValueDynamicType(cty.BoolVal(true)), + }, + PlannedOutputValues: map[string]cty.Value{}, + PlannedCheckResults: &states.CheckResults{}, + PlanTimestamp: fakePlanTimestamp, + PlannedInputValueMarks: map[string][]cty.PathValueMarks{ + "id": nil, + "defer": nil, + }, + }, + &stackplan.PlannedChangeDeferredResourceInstancePlanned{ + ResourceInstancePlanned: stackplan.PlannedChangeResourceInstancePlanned{ + ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ + Component: stackaddrs.Absolute( + stackaddrs.RootStackInstance, + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "self"}, + }, + ), + Item: addrs.AbsResourceInstanceObject{ + ResourceInstance: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_deferred_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + }, + }, + ProviderConfigAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: &plans.ResourceInstanceChangeSrc{ + Addr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_deferred_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + PrevRunAddr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_deferred_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + ProviderAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: plans.ChangeSrc{ + Action: plans.Create, + Before: mustPlanDynamicValue(cty.NullVal(cty.DynamicPseudoType)), + After: mustPlanDynamicValueSchema(cty.ObjectVal(map[string]cty.Value{ + "id": cty.StringVal("62594ae3"), + "value": cty.NullVal(cty.String), + "deferred": cty.BoolVal(true), + }), stacks_testing_provider.DeferredResourceSchema), + AfterSensitivePaths: nil, + }, + }, + Schema: stacks_testing_provider.DeferredResourceSchema, + }, + DeferredReason: providers.DeferredReasonResourceConfigUnknown, + }, + &stackplan.PlannedChangeHeader{ + TerraformVersion: version.SemVer, + }, + &stackplan.PlannedChangeRootInputValue{ + Addr: stackaddrs.InputVariable{Name: "defer"}, + Value: cty.BoolVal(true), + }, + &stackplan.PlannedChangeRootInputValue{ + Addr: stackaddrs.InputVariable{Name: "id"}, + Value: cty.StringVal("62594ae3"), + }, + } + + if diff := cmp.Diff(wantChanges, gotChanges, ctydebug.CmpOptions, cmpCollectionsSet); diff != "" { + t.Errorf("wrong changes\n%s", diff) + } +} + func TestPlanWithDeferredComponentForEach(t *testing.T) { ctx := context.Background() cfg := loadMainBundleConfigForTest(t, path.Join("with-single-input", "deferred-component-for-each")) diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/deferrable-component/main.tf b/internal/stacks/stackruntime/testdata/mainbundle/test/deferrable-component/main.tf new file mode 100644 index 0000000000..ced7f7834f --- /dev/null +++ b/internal/stacks/stackruntime/testdata/mainbundle/test/deferrable-component/main.tf @@ -0,0 +1,24 @@ + +terraform { + required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } + } +} + +variable "id" { + type = string + default = null + nullable = true # We'll generate an ID if none provided. +} + +variable "defer" { + type = bool +} + +resource "testing_deferred_resource" "data" { + id = var.id + deferred = var.defer +} diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/deferrable-component/main.tfstack.hcl b/internal/stacks/stackruntime/testdata/mainbundle/test/deferrable-component/main.tfstack.hcl new file mode 100644 index 0000000000..3cd97d237a --- /dev/null +++ b/internal/stacks/stackruntime/testdata/mainbundle/test/deferrable-component/main.tfstack.hcl @@ -0,0 +1,31 @@ +required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } +} + +provider "testing" "default" {} + +variable "id" { + type = string +} + +variable "defer" { + type = bool +} + +component "self" { + source = "./" + + + providers = { + testing = provider.testing.default + } + + inputs = { + id = var.id + defer = var.defer + } + +} \ No newline at end of file diff --git a/internal/stacks/stackruntime/testing/provider.go b/internal/stacks/stackruntime/testing/provider.go index 8601e22750..7d11dca069 100644 --- a/internal/stacks/stackruntime/testing/provider.go +++ b/internal/stacks/stackruntime/testing/provider.go @@ -23,6 +23,14 @@ var ( }, } + DeferredResourceSchema = &configschema.Block{ + Attributes: map[string]*configschema.Attribute{ + "id": {Type: cty.String, Optional: true, Computed: true}, + "value": {Type: cty.String, Optional: true}, + "deferred": {Type: cty.Bool, Required: true}, + }, + } + TestingDataSourceSchema = &configschema.Block{ Attributes: map[string]*configschema.Attribute{ "id": {Type: cty.String, Required: true}, @@ -53,6 +61,9 @@ func NewProviderWithData(store *ResourceStore) *MockProvider { "testing_resource": { Block: TestingResourceSchema, }, + "testing_deferred_resource": { + Block: DeferredResourceSchema, + }, }, DataSources: map[string]providers.Schema{ "testing_data_source": { @@ -78,6 +89,17 @@ func NewProviderWithData(store *ResourceStore) *MockProvider { value = cty.ObjectVal(vals) } + if request.TypeName == "testing_deferred_resource" { + if value.GetAttr("deferred").True() { + return providers.PlanResourceChangeResponse{ + PlannedState: value, + Deferred: &providers.Deferred{ + Reason: providers.DeferredReasonResourceConfigUnknown, + }, + } + } + } + return providers.PlanResourceChangeResponse{ PlannedState: value, } diff --git a/internal/stacks/tfstackdata1/tfstackdata1.pb.go b/internal/stacks/tfstackdata1/tfstackdata1.pb.go index 7465c66d86..58ef8c19e6 100644 --- a/internal/stacks/tfstackdata1/tfstackdata1.pb.go +++ b/internal/stacks/tfstackdata1/tfstackdata1.pb.go @@ -25,6 +25,66 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// Reason describes the reason why a resource instance change was +// deferred. +type PlanDeferredResourceInstanceChange_Deferred_Reason int32 + +const ( + PlanDeferredResourceInstanceChange_Deferred_INVALID PlanDeferredResourceInstanceChange_Deferred_Reason = 0 + PlanDeferredResourceInstanceChange_Deferred_INSTANCE_COUNT_UNKNOWN PlanDeferredResourceInstanceChange_Deferred_Reason = 1 + PlanDeferredResourceInstanceChange_Deferred_RESOURCE_CONFIG_UNKNOWN PlanDeferredResourceInstanceChange_Deferred_Reason = 2 + PlanDeferredResourceInstanceChange_Deferred_PROVIDER_CONFIG_UNKNOWN PlanDeferredResourceInstanceChange_Deferred_Reason = 3 + PlanDeferredResourceInstanceChange_Deferred_ABSENT_PREREQ PlanDeferredResourceInstanceChange_Deferred_Reason = 4 + PlanDeferredResourceInstanceChange_Deferred_DEFERRED_PREREQ PlanDeferredResourceInstanceChange_Deferred_Reason = 5 +) + +// Enum value maps for PlanDeferredResourceInstanceChange_Deferred_Reason. +var ( + PlanDeferredResourceInstanceChange_Deferred_Reason_name = map[int32]string{ + 0: "INVALID", + 1: "INSTANCE_COUNT_UNKNOWN", + 2: "RESOURCE_CONFIG_UNKNOWN", + 3: "PROVIDER_CONFIG_UNKNOWN", + 4: "ABSENT_PREREQ", + 5: "DEFERRED_PREREQ", + } + PlanDeferredResourceInstanceChange_Deferred_Reason_value = map[string]int32{ + "INVALID": 0, + "INSTANCE_COUNT_UNKNOWN": 1, + "RESOURCE_CONFIG_UNKNOWN": 2, + "PROVIDER_CONFIG_UNKNOWN": 3, + "ABSENT_PREREQ": 4, + "DEFERRED_PREREQ": 5, + } +) + +func (x PlanDeferredResourceInstanceChange_Deferred_Reason) Enum() *PlanDeferredResourceInstanceChange_Deferred_Reason { + p := new(PlanDeferredResourceInstanceChange_Deferred_Reason) + *p = x + return p +} + +func (x PlanDeferredResourceInstanceChange_Deferred_Reason) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PlanDeferredResourceInstanceChange_Deferred_Reason) Descriptor() protoreflect.EnumDescriptor { + return file_tfstackdata1_proto_enumTypes[0].Descriptor() +} + +func (PlanDeferredResourceInstanceChange_Deferred_Reason) Type() protoreflect.EnumType { + return &file_tfstackdata1_proto_enumTypes[0] +} + +func (x PlanDeferredResourceInstanceChange_Deferred_Reason) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PlanDeferredResourceInstanceChange_Deferred_Reason.Descriptor instead. +func (PlanDeferredResourceInstanceChange_Deferred_Reason) EnumDescriptor() ([]byte, []int) { + return file_tfstackdata1_proto_rawDescGZIP(), []int{5, 0, 0} +} + type StateResourceInstanceObjectV1_Status int32 const ( @@ -58,11 +118,11 @@ func (x StateResourceInstanceObjectV1_Status) String() string { } func (StateResourceInstanceObjectV1_Status) Descriptor() protoreflect.EnumDescriptor { - return file_tfstackdata1_proto_enumTypes[0].Descriptor() + return file_tfstackdata1_proto_enumTypes[1].Descriptor() } func (StateResourceInstanceObjectV1_Status) Type() protoreflect.EnumType { - return &file_tfstackdata1_proto_enumTypes[0] + return &file_tfstackdata1_proto_enumTypes[1] } func (x StateResourceInstanceObjectV1_Status) Number() protoreflect.EnumNumber { @@ -71,7 +131,7 @@ func (x StateResourceInstanceObjectV1_Status) Number() protoreflect.EnumNumber { // Deprecated: Use StateResourceInstanceObjectV1_Status.Descriptor instead. func (StateResourceInstanceObjectV1_Status) EnumDescriptor() ([]byte, []int) { - return file_tfstackdata1_proto_rawDescGZIP(), []int{7, 0} + return file_tfstackdata1_proto_rawDescGZIP(), []int{8, 0} } // Appears early in a raw plan sequence to capture some metadata that we need @@ -549,6 +609,63 @@ func (x *PlanResourceInstanceChangePlanned) GetPriorState() *StateResourceInstan return nil } +// Represents a deferred change to a particular resource instance within a +// particular component instance. +type PlanDeferredResourceInstanceChange struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Deferred *PlanDeferredResourceInstanceChange_Deferred `protobuf:"bytes,1,opt,name=deferred,proto3" json:"deferred,omitempty"` + Change *PlanResourceInstanceChangePlanned `protobuf:"bytes,2,opt,name=change,proto3" json:"change,omitempty"` +} + +func (x *PlanDeferredResourceInstanceChange) Reset() { + *x = PlanDeferredResourceInstanceChange{} + if protoimpl.UnsafeEnabled { + mi := &file_tfstackdata1_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlanDeferredResourceInstanceChange) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlanDeferredResourceInstanceChange) ProtoMessage() {} + +func (x *PlanDeferredResourceInstanceChange) ProtoReflect() protoreflect.Message { + mi := &file_tfstackdata1_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlanDeferredResourceInstanceChange.ProtoReflect.Descriptor instead. +func (*PlanDeferredResourceInstanceChange) Descriptor() ([]byte, []int) { + return file_tfstackdata1_proto_rawDescGZIP(), []int{5} +} + +func (x *PlanDeferredResourceInstanceChange) GetDeferred() *PlanDeferredResourceInstanceChange_Deferred { + if x != nil { + return x.Deferred + } + return nil +} + +func (x *PlanDeferredResourceInstanceChange) GetChange() *PlanResourceInstanceChangePlanned { + if x != nil { + return x.Change + } + return nil +} + // Represents that we need to emit "delete" requests for one or more raw // state and/or state description objects during the apply phase. // @@ -571,7 +688,7 @@ type PlanDiscardStateMapKeys struct { func (x *PlanDiscardStateMapKeys) Reset() { *x = PlanDiscardStateMapKeys{} if protoimpl.UnsafeEnabled { - mi := &file_tfstackdata1_proto_msgTypes[5] + mi := &file_tfstackdata1_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -584,7 +701,7 @@ func (x *PlanDiscardStateMapKeys) String() string { func (*PlanDiscardStateMapKeys) ProtoMessage() {} func (x *PlanDiscardStateMapKeys) ProtoReflect() protoreflect.Message { - mi := &file_tfstackdata1_proto_msgTypes[5] + mi := &file_tfstackdata1_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -597,7 +714,7 @@ func (x *PlanDiscardStateMapKeys) ProtoReflect() protoreflect.Message { // Deprecated: Use PlanDiscardStateMapKeys.ProtoReflect.Descriptor instead. func (*PlanDiscardStateMapKeys) Descriptor() ([]byte, []int) { - return file_tfstackdata1_proto_rawDescGZIP(), []int{5} + return file_tfstackdata1_proto_rawDescGZIP(), []int{6} } func (x *PlanDiscardStateMapKeys) GetRawStateKeys() []string { @@ -644,7 +761,7 @@ type StateComponentInstanceV1 struct { func (x *StateComponentInstanceV1) Reset() { *x = StateComponentInstanceV1{} if protoimpl.UnsafeEnabled { - mi := &file_tfstackdata1_proto_msgTypes[6] + mi := &file_tfstackdata1_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -657,7 +774,7 @@ func (x *StateComponentInstanceV1) String() string { func (*StateComponentInstanceV1) ProtoMessage() {} func (x *StateComponentInstanceV1) ProtoReflect() protoreflect.Message { - mi := &file_tfstackdata1_proto_msgTypes[6] + mi := &file_tfstackdata1_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -670,7 +787,7 @@ func (x *StateComponentInstanceV1) ProtoReflect() protoreflect.Message { // Deprecated: Use StateComponentInstanceV1.ProtoReflect.Descriptor instead. func (*StateComponentInstanceV1) Descriptor() ([]byte, []int) { - return file_tfstackdata1_proto_rawDescGZIP(), []int{6} + return file_tfstackdata1_proto_rawDescGZIP(), []int{7} } func (x *StateComponentInstanceV1) GetOutputValues() map[string]*DynamicValue { @@ -722,7 +839,7 @@ type StateResourceInstanceObjectV1 struct { func (x *StateResourceInstanceObjectV1) Reset() { *x = StateResourceInstanceObjectV1{} if protoimpl.UnsafeEnabled { - mi := &file_tfstackdata1_proto_msgTypes[7] + mi := &file_tfstackdata1_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -735,7 +852,7 @@ func (x *StateResourceInstanceObjectV1) String() string { func (*StateResourceInstanceObjectV1) ProtoMessage() {} func (x *StateResourceInstanceObjectV1) ProtoReflect() protoreflect.Message { - mi := &file_tfstackdata1_proto_msgTypes[7] + mi := &file_tfstackdata1_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -748,7 +865,7 @@ func (x *StateResourceInstanceObjectV1) ProtoReflect() protoreflect.Message { // Deprecated: Use StateResourceInstanceObjectV1.ProtoReflect.Descriptor instead. func (*StateResourceInstanceObjectV1) Descriptor() ([]byte, []int) { - return file_tfstackdata1_proto_rawDescGZIP(), []int{7} + return file_tfstackdata1_proto_rawDescGZIP(), []int{8} } func (x *StateResourceInstanceObjectV1) GetValueJson() []byte { @@ -819,7 +936,7 @@ type DynamicValue struct { func (x *DynamicValue) Reset() { *x = DynamicValue{} if protoimpl.UnsafeEnabled { - mi := &file_tfstackdata1_proto_msgTypes[8] + mi := &file_tfstackdata1_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -832,7 +949,7 @@ func (x *DynamicValue) String() string { func (*DynamicValue) ProtoMessage() {} func (x *DynamicValue) ProtoReflect() protoreflect.Message { - mi := &file_tfstackdata1_proto_msgTypes[8] + mi := &file_tfstackdata1_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -845,7 +962,7 @@ func (x *DynamicValue) ProtoReflect() protoreflect.Message { // Deprecated: Use DynamicValue.ProtoReflect.Descriptor instead. func (*DynamicValue) Descriptor() ([]byte, []int) { - return file_tfstackdata1_proto_rawDescGZIP(), []int{8} + return file_tfstackdata1_proto_rawDescGZIP(), []int{9} } func (x *DynamicValue) GetValue() *planproto.DynamicValue { @@ -862,6 +979,55 @@ func (x *DynamicValue) GetSensitivePaths() []*planproto.Path { return nil } +// Deferred contains all the metadata about a the deferral of a resource +// instance change. +type PlanDeferredResourceInstanceChange_Deferred struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Reason PlanDeferredResourceInstanceChange_Deferred_Reason `protobuf:"varint,1,opt,name=reason,proto3,enum=tfstackdata1.PlanDeferredResourceInstanceChange_Deferred_Reason" json:"reason,omitempty"` +} + +func (x *PlanDeferredResourceInstanceChange_Deferred) Reset() { + *x = PlanDeferredResourceInstanceChange_Deferred{} + if protoimpl.UnsafeEnabled { + mi := &file_tfstackdata1_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlanDeferredResourceInstanceChange_Deferred) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlanDeferredResourceInstanceChange_Deferred) ProtoMessage() {} + +func (x *PlanDeferredResourceInstanceChange_Deferred) ProtoReflect() protoreflect.Message { + mi := &file_tfstackdata1_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PlanDeferredResourceInstanceChange_Deferred.ProtoReflect.Descriptor instead. +func (*PlanDeferredResourceInstanceChange_Deferred) Descriptor() ([]byte, []int) { + return file_tfstackdata1_proto_rawDescGZIP(), []int{5, 0} +} + +func (x *PlanDeferredResourceInstanceChange_Deferred) GetReason() PlanDeferredResourceInstanceChange_Deferred_Reason { + if x != nil { + return x.Reason + } + return PlanDeferredResourceInstanceChange_Deferred_INVALID +} + var File_tfstackdata1_proto protoreflect.FileDescriptor var file_tfstackdata1_proto_rawDesc = []byte{ @@ -966,65 +1132,93 @@ var file_tfstackdata1_proto_rawDesc = []byte{ 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x66, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x64, 0x61, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x31, - 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x6a, 0x0a, 0x17, - 0x50, 0x6c, 0x61, 0x6e, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x4d, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x72, 0x61, 0x77, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0c, 0x72, 0x61, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x29, 0x0a, - 0x10, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x22, 0xd6, 0x01, 0x0a, 0x18, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x56, 0x31, 0x12, 0x5d, 0x0a, 0x0d, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x74, - 0x66, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x64, 0x61, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x56, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x5b, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x66, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x64, 0x61, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, - 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xd7, 0x03, 0x0a, 0x1d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x56, 0x31, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6a, 0x73, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x4a, 0x73, - 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x0f, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, - 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0e, 0x73, 0x65, 0x6e, 0x73, 0x69, - 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x4a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x32, 0x2e, 0x74, 0x66, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x64, 0x61, 0x74, 0x61, 0x31, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x31, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x22, 0x0a, 0x0c, - 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, - 0x12, 0x32, 0x0a, 0x15, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, - 0x65, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x13, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x44, 0x65, 0x73, - 0x74, 0x72, 0x6f, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x41, 0x64, 0x64, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x22, 0x2d, 0x0a, 0x06, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, - 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x0b, - 0x0a, 0x07, 0x44, 0x41, 0x4d, 0x41, 0x47, 0x45, 0x44, 0x10, 0x02, 0x22, 0x71, 0x0a, 0x0c, 0x44, - 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x61, 0x6e, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x0f, 0x73, 0x65, 0x6e, 0x73, 0x69, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0e, - 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x73, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc1, 0x03, 0x0a, + 0x22, 0x50, 0x6c, 0x61, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x12, 0x55, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x74, 0x66, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x64, + 0x61, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, + 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, + 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x12, 0x47, 0x0a, 0x06, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x66, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x64, 0x61, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x52, 0x06, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x1a, 0xfa, 0x01, 0x0a, 0x08, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, + 0x12, 0x58, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x40, 0x2e, 0x74, 0x66, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x64, 0x61, 0x74, 0x61, 0x31, 0x2e, + 0x50, 0x6c, 0x61, 0x6e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x2e, 0x52, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x06, 0x52, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x1b, + 0x0a, 0x17, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, + 0x47, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x50, + 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x42, 0x53, 0x45, + 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x45, 0x52, 0x45, 0x51, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x44, + 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x5f, 0x50, 0x52, 0x45, 0x52, 0x45, 0x51, 0x10, 0x05, + 0x22, 0x6a, 0x0a, 0x17, 0x50, 0x6c, 0x61, 0x6e, 0x44, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x72, + 0x61, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x61, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, + 0x73, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x73, 0x22, 0xd6, 0x01, 0x0a, + 0x18, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x56, 0x31, 0x12, 0x5d, 0x0a, 0x0d, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x74, 0x66, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x64, 0x61, 0x74, 0x61, 0x31, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x56, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x5b, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x74, 0x66, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x64, 0x61, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd7, 0x03, 0x0a, 0x1d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x31, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x4a, 0x73, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x0f, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0e, 0x73, + 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x25, 0x0a, + 0x0e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x74, 0x66, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x64, 0x61, + 0x74, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, + 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, + 0x63, 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x62, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x13, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x65, 0x66, 0x6f, 0x72, + 0x65, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, 0x64, 0x64, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, + 0x22, 0x2d, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x41, 0x4d, 0x41, 0x47, 0x45, 0x44, 0x10, 0x02, 0x22, + 0x71, 0x0a, 0x0c, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x35, 0x0a, 0x0f, 0x73, + 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x50, 0x61, + 0x74, 0x68, 0x52, 0x0e, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, + 0x68, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1039,53 +1233,59 @@ func file_tfstackdata1_proto_rawDescGZIP() []byte { return file_tfstackdata1_proto_rawDescData } -var file_tfstackdata1_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_tfstackdata1_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_tfstackdata1_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_tfstackdata1_proto_msgTypes = make([]protoimpl.MessageInfo, 15) var file_tfstackdata1_proto_goTypes = []interface{}{ - (StateResourceInstanceObjectV1_Status)(0), // 0: tfstackdata1.StateResourceInstanceObjectV1.Status - (*PlanHeader)(nil), // 1: tfstackdata1.PlanHeader - (*PlanApplyable)(nil), // 2: tfstackdata1.PlanApplyable - (*PlanRootInputValue)(nil), // 3: tfstackdata1.PlanRootInputValue - (*PlanComponentInstance)(nil), // 4: tfstackdata1.PlanComponentInstance - (*PlanResourceInstanceChangePlanned)(nil), // 5: tfstackdata1.PlanResourceInstanceChangePlanned - (*PlanDiscardStateMapKeys)(nil), // 6: tfstackdata1.PlanDiscardStateMapKeys - (*StateComponentInstanceV1)(nil), // 7: tfstackdata1.StateComponentInstanceV1 - (*StateResourceInstanceObjectV1)(nil), // 8: tfstackdata1.StateResourceInstanceObjectV1 - (*DynamicValue)(nil), // 9: tfstackdata1.DynamicValue - nil, // 10: tfstackdata1.PlanHeader.PrevRunStateRawEntry - nil, // 11: tfstackdata1.PlanComponentInstance.PlannedInputValuesEntry - nil, // 12: tfstackdata1.PlanComponentInstance.PlannedOutputValuesEntry - nil, // 13: tfstackdata1.StateComponentInstanceV1.OutputValuesEntry - (*planproto.DynamicValue)(nil), // 14: tfplan.DynamicValue - (planproto.Action)(0), // 15: tfplan.Action - (*planproto.CheckResults)(nil), // 16: tfplan.CheckResults - (*planproto.ResourceInstanceChange)(nil), // 17: tfplan.ResourceInstanceChange - (*planproto.Path)(nil), // 18: tfplan.Path - (*anypb.Any)(nil), // 19: google.protobuf.Any + (PlanDeferredResourceInstanceChange_Deferred_Reason)(0), // 0: tfstackdata1.PlanDeferredResourceInstanceChange.Deferred.Reason + (StateResourceInstanceObjectV1_Status)(0), // 1: tfstackdata1.StateResourceInstanceObjectV1.Status + (*PlanHeader)(nil), // 2: tfstackdata1.PlanHeader + (*PlanApplyable)(nil), // 3: tfstackdata1.PlanApplyable + (*PlanRootInputValue)(nil), // 4: tfstackdata1.PlanRootInputValue + (*PlanComponentInstance)(nil), // 5: tfstackdata1.PlanComponentInstance + (*PlanResourceInstanceChangePlanned)(nil), // 6: tfstackdata1.PlanResourceInstanceChangePlanned + (*PlanDeferredResourceInstanceChange)(nil), // 7: tfstackdata1.PlanDeferredResourceInstanceChange + (*PlanDiscardStateMapKeys)(nil), // 8: tfstackdata1.PlanDiscardStateMapKeys + (*StateComponentInstanceV1)(nil), // 9: tfstackdata1.StateComponentInstanceV1 + (*StateResourceInstanceObjectV1)(nil), // 10: tfstackdata1.StateResourceInstanceObjectV1 + (*DynamicValue)(nil), // 11: tfstackdata1.DynamicValue + nil, // 12: tfstackdata1.PlanHeader.PrevRunStateRawEntry + nil, // 13: tfstackdata1.PlanComponentInstance.PlannedInputValuesEntry + nil, // 14: tfstackdata1.PlanComponentInstance.PlannedOutputValuesEntry + (*PlanDeferredResourceInstanceChange_Deferred)(nil), // 15: tfstackdata1.PlanDeferredResourceInstanceChange.Deferred + nil, // 16: tfstackdata1.StateComponentInstanceV1.OutputValuesEntry + (*planproto.DynamicValue)(nil), // 17: tfplan.DynamicValue + (planproto.Action)(0), // 18: tfplan.Action + (*planproto.CheckResults)(nil), // 19: tfplan.CheckResults + (*planproto.ResourceInstanceChange)(nil), // 20: tfplan.ResourceInstanceChange + (*planproto.Path)(nil), // 21: tfplan.Path + (*anypb.Any)(nil), // 22: google.protobuf.Any } var file_tfstackdata1_proto_depIdxs = []int32{ - 10, // 0: tfstackdata1.PlanHeader.prev_run_state_raw:type_name -> tfstackdata1.PlanHeader.PrevRunStateRawEntry - 14, // 1: tfstackdata1.PlanRootInputValue.value:type_name -> tfplan.DynamicValue - 11, // 2: tfstackdata1.PlanComponentInstance.planned_input_values:type_name -> tfstackdata1.PlanComponentInstance.PlannedInputValuesEntry - 15, // 3: tfstackdata1.PlanComponentInstance.planned_action:type_name -> tfplan.Action - 12, // 4: tfstackdata1.PlanComponentInstance.planned_output_values:type_name -> tfstackdata1.PlanComponentInstance.PlannedOutputValuesEntry - 16, // 5: tfstackdata1.PlanComponentInstance.planned_check_results:type_name -> tfplan.CheckResults - 17, // 6: tfstackdata1.PlanResourceInstanceChangePlanned.change:type_name -> tfplan.ResourceInstanceChange - 8, // 7: tfstackdata1.PlanResourceInstanceChangePlanned.prior_state:type_name -> tfstackdata1.StateResourceInstanceObjectV1 - 13, // 8: tfstackdata1.StateComponentInstanceV1.output_values:type_name -> tfstackdata1.StateComponentInstanceV1.OutputValuesEntry - 18, // 9: tfstackdata1.StateResourceInstanceObjectV1.sensitive_paths:type_name -> tfplan.Path - 0, // 10: tfstackdata1.StateResourceInstanceObjectV1.status:type_name -> tfstackdata1.StateResourceInstanceObjectV1.Status - 14, // 11: tfstackdata1.DynamicValue.value:type_name -> tfplan.DynamicValue - 18, // 12: tfstackdata1.DynamicValue.sensitive_paths:type_name -> tfplan.Path - 19, // 13: tfstackdata1.PlanHeader.PrevRunStateRawEntry.value:type_name -> google.protobuf.Any - 9, // 14: tfstackdata1.PlanComponentInstance.PlannedInputValuesEntry.value:type_name -> tfstackdata1.DynamicValue - 9, // 15: tfstackdata1.PlanComponentInstance.PlannedOutputValuesEntry.value:type_name -> tfstackdata1.DynamicValue - 9, // 16: tfstackdata1.StateComponentInstanceV1.OutputValuesEntry.value:type_name -> tfstackdata1.DynamicValue - 17, // [17:17] is the sub-list for method output_type - 17, // [17:17] is the sub-list for method input_type - 17, // [17:17] is the sub-list for extension type_name - 17, // [17:17] is the sub-list for extension extendee - 0, // [0:17] is the sub-list for field type_name + 12, // 0: tfstackdata1.PlanHeader.prev_run_state_raw:type_name -> tfstackdata1.PlanHeader.PrevRunStateRawEntry + 17, // 1: tfstackdata1.PlanRootInputValue.value:type_name -> tfplan.DynamicValue + 13, // 2: tfstackdata1.PlanComponentInstance.planned_input_values:type_name -> tfstackdata1.PlanComponentInstance.PlannedInputValuesEntry + 18, // 3: tfstackdata1.PlanComponentInstance.planned_action:type_name -> tfplan.Action + 14, // 4: tfstackdata1.PlanComponentInstance.planned_output_values:type_name -> tfstackdata1.PlanComponentInstance.PlannedOutputValuesEntry + 19, // 5: tfstackdata1.PlanComponentInstance.planned_check_results:type_name -> tfplan.CheckResults + 20, // 6: tfstackdata1.PlanResourceInstanceChangePlanned.change:type_name -> tfplan.ResourceInstanceChange + 10, // 7: tfstackdata1.PlanResourceInstanceChangePlanned.prior_state:type_name -> tfstackdata1.StateResourceInstanceObjectV1 + 15, // 8: tfstackdata1.PlanDeferredResourceInstanceChange.deferred:type_name -> tfstackdata1.PlanDeferredResourceInstanceChange.Deferred + 6, // 9: tfstackdata1.PlanDeferredResourceInstanceChange.change:type_name -> tfstackdata1.PlanResourceInstanceChangePlanned + 16, // 10: tfstackdata1.StateComponentInstanceV1.output_values:type_name -> tfstackdata1.StateComponentInstanceV1.OutputValuesEntry + 21, // 11: tfstackdata1.StateResourceInstanceObjectV1.sensitive_paths:type_name -> tfplan.Path + 1, // 12: tfstackdata1.StateResourceInstanceObjectV1.status:type_name -> tfstackdata1.StateResourceInstanceObjectV1.Status + 17, // 13: tfstackdata1.DynamicValue.value:type_name -> tfplan.DynamicValue + 21, // 14: tfstackdata1.DynamicValue.sensitive_paths:type_name -> tfplan.Path + 22, // 15: tfstackdata1.PlanHeader.PrevRunStateRawEntry.value:type_name -> google.protobuf.Any + 11, // 16: tfstackdata1.PlanComponentInstance.PlannedInputValuesEntry.value:type_name -> tfstackdata1.DynamicValue + 11, // 17: tfstackdata1.PlanComponentInstance.PlannedOutputValuesEntry.value:type_name -> tfstackdata1.DynamicValue + 0, // 18: tfstackdata1.PlanDeferredResourceInstanceChange.Deferred.reason:type_name -> tfstackdata1.PlanDeferredResourceInstanceChange.Deferred.Reason + 11, // 19: tfstackdata1.StateComponentInstanceV1.OutputValuesEntry.value:type_name -> tfstackdata1.DynamicValue + 20, // [20:20] is the sub-list for method output_type + 20, // [20:20] is the sub-list for method input_type + 20, // [20:20] is the sub-list for extension type_name + 20, // [20:20] is the sub-list for extension extendee + 0, // [0:20] is the sub-list for field type_name } func init() { file_tfstackdata1_proto_init() } @@ -1155,7 +1355,7 @@ func file_tfstackdata1_proto_init() { } } file_tfstackdata1_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PlanDiscardStateMapKeys); i { + switch v := v.(*PlanDeferredResourceInstanceChange); i { case 0: return &v.state case 1: @@ -1167,7 +1367,7 @@ func file_tfstackdata1_proto_init() { } } file_tfstackdata1_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StateComponentInstanceV1); i { + switch v := v.(*PlanDiscardStateMapKeys); i { case 0: return &v.state case 1: @@ -1179,7 +1379,7 @@ func file_tfstackdata1_proto_init() { } } file_tfstackdata1_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StateResourceInstanceObjectV1); i { + switch v := v.(*StateComponentInstanceV1); i { case 0: return &v.state case 1: @@ -1191,6 +1391,18 @@ func file_tfstackdata1_proto_init() { } } file_tfstackdata1_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StateResourceInstanceObjectV1); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_tfstackdata1_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DynamicValue); i { case 0: return &v.state @@ -1202,14 +1414,26 @@ func file_tfstackdata1_proto_init() { return nil } } + file_tfstackdata1_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PlanDeferredResourceInstanceChange_Deferred); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_tfstackdata1_proto_rawDesc, - NumEnums: 1, - NumMessages: 13, + NumEnums: 2, + NumMessages: 15, NumExtensions: 0, NumServices: 0, }, diff --git a/internal/stacks/tfstackdata1/tfstackdata1.proto b/internal/stacks/tfstackdata1/tfstackdata1.proto index c656e527d2..8e60f07027 100644 --- a/internal/stacks/tfstackdata1/tfstackdata1.proto +++ b/internal/stacks/tfstackdata1/tfstackdata1.proto @@ -198,6 +198,29 @@ message PlanResourceInstanceChangePlanned { StateResourceInstanceObjectV1 prior_state = 3; } +// Represents a deferred change to a particular resource instance within a +// particular component instance. +message PlanDeferredResourceInstanceChange { + // Deferred contains all the metadata about a the deferral of a resource + // instance change. + message Deferred { + // Reason describes the reason why a resource instance change was + // deferred. + enum Reason { + INVALID = 0; + INSTANCE_COUNT_UNKNOWN = 1; + RESOURCE_CONFIG_UNKNOWN = 2; + PROVIDER_CONFIG_UNKNOWN = 3; + ABSENT_PREREQ = 4; + DEFERRED_PREREQ = 5; + } + Reason reason = 1; + } + + Deferred deferred = 1; + PlanResourceInstanceChangePlanned change = 2; +} + // Represents that we need to emit "delete" requests for one or more raw // state and/or state description objects during the apply phase. // From 7096ec85cc8d903ae3d968dff9c906fcff230751 Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Tue, 4 Jun 2024 15:24:04 +0200 Subject: [PATCH 139/161] stacks: Enable resource deferrals within stack tests (#35168) --- .../internal/stackeval/applying_test.go | 2 - .../internal/stackeval/component.go | 10 +- .../internal/stackeval/component_instance.go | 10 +- .../internal/stackeval/stack_call.go | 10 +- internal/stacks/stackruntime/plan_test.go | 262 +++++++++--------- internal/terraform/context_plan2_test.go | 13 +- 6 files changed, 174 insertions(+), 133 deletions(-) diff --git a/internal/stacks/stackruntime/internal/stackeval/applying_test.go b/internal/stacks/stackruntime/internal/stackeval/applying_test.go index 8bc51599f0..a55d7092f3 100644 --- a/internal/stacks/stackruntime/internal/stackeval/applying_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/applying_test.go @@ -113,7 +113,6 @@ func TestApply_componentOrdering(t *testing.T) { // First we need to create a plan for this configuration, which will // include the calculated component dependencies. - t.Log("initial plan") planOutput, err := promising.MainTask(ctx, func(ctx context.Context) (*planOutputTester, error) { main := NewForPlanning(cfg, stackstate.NewState(), PlanOpts{ PlanningMode: plans.NormalMode, @@ -190,7 +189,6 @@ func TestApply_componentOrdering(t *testing.T) { // Now we're finally ready for the first apply, during which we expect // the component ordering decided during the plan phase to be respected. - t.Log("initial apply") applyResult, err := promising.MainTask(ctx, func(ctx context.Context) (applyResultData, error) { var visitedMarkers []string var visitedMarkersMu sync.Mutex diff --git a/internal/stacks/stackruntime/internal/stackeval/component.go b/internal/stacks/stackruntime/internal/stackeval/component.go index c24f1face0..916ecb236a 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component.go +++ b/internal/stacks/stackruntime/internal/stackeval/component.go @@ -166,9 +166,17 @@ func (c *Component) CheckInstances(ctx context.Context, phase EvalPhase) (map[ad return nil, diags } + allowUnknowns := true + if c.main.Planning() { + // We'll set this to false during planning if deferrals are not + // allowed. It's fine to always be true during apply, as this + // would have failed during planning if it was not allowed. + allowUnknowns = c.main.PlanningOpts().DeferralAllowed + } + ret := instancesMap(forEachVal, func(ik addrs.InstanceKey, rd instances.RepetitionData) *ComponentInstance { return newComponentInstance(c, ik, rd) - }, true) + }, allowUnknowns) addrs := make([]stackaddrs.AbsComponentInstance, 0, len(ret)) for _, ci := range ret { diff --git a/internal/stacks/stackruntime/internal/stackeval/component_instance.go b/internal/stacks/stackruntime/internal/stackeval/component_instance.go index 449de3ba4b..1cadad6e92 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_instance.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_instance.go @@ -576,9 +576,17 @@ func (c *ComponentInstance) CheckModuleTreePlan(ctx context.Context) (*plans.Pla } } - // The instance is also upstream deferred if the for_each value for this instance is unknown. + // The instance is also upstream deferred if the for_each value for + // this instance or any parent stacks is unknown. if c.key == addrs.WildcardKey { deferred = true + } else { + for _, step := range c.call.addr.Stack { + if step.Key == addrs.WildcardKey { + deferred = true + break + } + } } // When our given context is cancelled, we want to instruct the diff --git a/internal/stacks/stackruntime/internal/stackeval/stack_call.go b/internal/stacks/stackruntime/internal/stackeval/stack_call.go index 3d914741b1..5ae13d74ff 100644 --- a/internal/stacks/stackruntime/internal/stackeval/stack_call.go +++ b/internal/stacks/stackruntime/internal/stackeval/stack_call.go @@ -159,9 +159,17 @@ func (c *StackCall) CheckInstances(ctx context.Context, phase EvalPhase) (map[ad return nil, diags } + allowUnknowns := true + if c.main.Planning() { + // We'll set this to false during planning if deferrals are not + // allowed. It's fine to always be true during apply, as this + // would have failed during planning if it was not allowed. + allowUnknowns = c.main.PlanningOpts().DeferralAllowed + } + return instancesMap(forEachVal, func(ik addrs.InstanceKey, rd instances.RepetitionData) *StackCallInstance { return newStackCallInstance(c, ik, rd) - }, true), diags + }, allowUnknowns), diags }, ) } diff --git a/internal/stacks/stackruntime/plan_test.go b/internal/stacks/stackruntime/plan_test.go index 57398c37ac..df7bdca422 100644 --- a/internal/stacks/stackruntime/plan_test.go +++ b/internal/stacks/stackruntime/plan_test.go @@ -1750,6 +1750,7 @@ func TestPlanWithDeferredComponentForEach(t *testing.T) { DefRange: tfdiags.SourceRange{}, }, }, + DeferralAllowed: true, } resp := PlanResponse{ PlannedChanges: changesCh, @@ -1779,8 +1780,8 @@ func TestPlanWithDeferredComponentForEach(t *testing.T) { Key: addrs.WildcardKey, }, ), - PlanApplyable: true, - PlanComplete: true, + PlanApplyable: false, // Everything is deferred, so nothing to apply. + PlanComplete: false, Action: plans.Create, PlannedInputValues: map[string]plans.DynamicValue{ "id": mustPlanDynamicValueDynamicType(cty.NullVal(cty.String)), @@ -1794,53 +1795,56 @@ func TestPlanWithDeferredComponentForEach(t *testing.T) { "input": nil, }, }, - &stackplan.PlannedChangeResourceInstancePlanned{ - ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ - Component: stackaddrs.Absolute( - stackaddrs.RootStackInstance, - stackaddrs.ComponentInstance{ - Component: stackaddrs.Component{Name: "self"}, - Key: addrs.WildcardKey, + &stackplan.PlannedChangeDeferredResourceInstancePlanned{ + DeferredReason: providers.DeferredReasonDeferredPrereq, + ResourceInstancePlanned: stackplan.PlannedChangeResourceInstancePlanned{ + ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ + Component: stackaddrs.Absolute( + stackaddrs.RootStackInstance, + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "self"}, + Key: addrs.WildcardKey, + }, + ), + Item: addrs.AbsResourceInstanceObject{ + ResourceInstance: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), }, - ), - Item: addrs.AbsResourceInstanceObject{ - ResourceInstance: addrs.Resource{ + }, + ProviderConfigAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: &plans.ResourceInstanceChangeSrc{ + Addr: addrs.Resource{ Mode: addrs.ManagedResourceMode, Type: "testing_resource", Name: "data", }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + PrevRunAddr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + ProviderAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: plans.ChangeSrc{ + Action: plans.Create, + Before: mustPlanDynamicValue(cty.NullVal(cty.DynamicPseudoType)), + After: mustPlanDynamicValueSchema(cty.ObjectVal(map[string]cty.Value{ + "id": cty.UnknownVal(cty.String), + "value": cty.UnknownVal(cty.String), + }), stacks_testing_provider.TestingResourceSchema), + AfterSensitivePaths: nil, + }, }, + Schema: stacks_testing_provider.TestingResourceSchema, }, - ProviderConfigAddr: addrs.AbsProviderConfig{ - Module: addrs.RootModule, - Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), - }, - ChangeSrc: &plans.ResourceInstanceChangeSrc{ - Addr: addrs.Resource{ - Mode: addrs.ManagedResourceMode, - Type: "testing_resource", - Name: "data", - }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), - PrevRunAddr: addrs.Resource{ - Mode: addrs.ManagedResourceMode, - Type: "testing_resource", - Name: "data", - }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), - ProviderAddr: addrs.AbsProviderConfig{ - Module: addrs.RootModule, - Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), - }, - ChangeSrc: plans.ChangeSrc{ - Action: plans.Create, - Before: mustPlanDynamicValue(cty.NullVal(cty.DynamicPseudoType)), - After: mustPlanDynamicValueSchema(cty.ObjectVal(map[string]cty.Value{ - "id": cty.UnknownVal(cty.String), - "value": cty.UnknownVal(cty.String), - }), stacks_testing_provider.TestingResourceSchema), - AfterSensitivePaths: nil, - }, - }, - Schema: stacks_testing_provider.TestingResourceSchema, }, &stackplan.PlannedChangeHeader{ TerraformVersion: version.SemVer, @@ -1884,6 +1888,7 @@ func TestPlanWithDeferredEmbeddedStackForEach(t *testing.T) { DefRange: tfdiags.SourceRange{}, }, }, + DeferralAllowed: true, } resp := PlanResponse{ PlannedChanges: changesCh, @@ -1915,8 +1920,8 @@ func TestPlanWithDeferredEmbeddedStackForEach(t *testing.T) { Component: stackaddrs.Component{Name: "self"}, }, ), - PlanApplyable: true, - PlanComplete: true, + PlanApplyable: false, // Everything is deferred, so nothing to apply. + PlanComplete: false, Action: plans.Create, PlannedInputValues: map[string]plans.DynamicValue{ "id": mustPlanDynamicValueDynamicType(cty.NullVal(cty.String)), @@ -1930,52 +1935,55 @@ func TestPlanWithDeferredEmbeddedStackForEach(t *testing.T) { "input": nil, }, }, - &stackplan.PlannedChangeResourceInstancePlanned{ - ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ - Component: stackaddrs.Absolute( - stackaddrs.RootStackInstance.Child("a", addrs.WildcardKey), - stackaddrs.ComponentInstance{ - Component: stackaddrs.Component{Name: "self"}, + &stackplan.PlannedChangeDeferredResourceInstancePlanned{ + DeferredReason: providers.DeferredReasonDeferredPrereq, + ResourceInstancePlanned: stackplan.PlannedChangeResourceInstancePlanned{ + ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ + Component: stackaddrs.Absolute( + stackaddrs.RootStackInstance.Child("a", addrs.WildcardKey), + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "self"}, + }, + ), + Item: addrs.AbsResourceInstanceObject{ + ResourceInstance: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), }, - ), - Item: addrs.AbsResourceInstanceObject{ - ResourceInstance: addrs.Resource{ + }, + ProviderConfigAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: &plans.ResourceInstanceChangeSrc{ + Addr: addrs.Resource{ Mode: addrs.ManagedResourceMode, Type: "testing_resource", Name: "data", }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + PrevRunAddr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + ProviderAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: plans.ChangeSrc{ + Action: plans.Create, + Before: mustPlanDynamicValue(cty.NullVal(cty.DynamicPseudoType)), + After: mustPlanDynamicValueSchema(cty.ObjectVal(map[string]cty.Value{ + "id": cty.UnknownVal(cty.String), + "value": cty.UnknownVal(cty.String), + }), stacks_testing_provider.TestingResourceSchema), + AfterSensitivePaths: nil, + }, }, + Schema: stacks_testing_provider.TestingResourceSchema, }, - ProviderConfigAddr: addrs.AbsProviderConfig{ - Module: addrs.RootModule, - Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), - }, - ChangeSrc: &plans.ResourceInstanceChangeSrc{ - Addr: addrs.Resource{ - Mode: addrs.ManagedResourceMode, - Type: "testing_resource", - Name: "data", - }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), - PrevRunAddr: addrs.Resource{ - Mode: addrs.ManagedResourceMode, - Type: "testing_resource", - Name: "data", - }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), - ProviderAddr: addrs.AbsProviderConfig{ - Module: addrs.RootModule, - Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), - }, - ChangeSrc: plans.ChangeSrc{ - Action: plans.Create, - Before: mustPlanDynamicValue(cty.NullVal(cty.DynamicPseudoType)), - After: mustPlanDynamicValueSchema(cty.ObjectVal(map[string]cty.Value{ - "id": cty.UnknownVal(cty.String), - "value": cty.UnknownVal(cty.String), - }), stacks_testing_provider.TestingResourceSchema), - AfterSensitivePaths: nil, - }, - }, - Schema: stacks_testing_provider.TestingResourceSchema, }, &stackplan.PlannedChangeRootInputValue{ Addr: stackaddrs.InputVariable{Name: "stacks"}, @@ -2016,6 +2024,7 @@ func TestPlanWithDeferredEmbeddedStackAndComponentForEach(t *testing.T) { DefRange: tfdiags.SourceRange{}, }, }, + DeferralAllowed: true, } resp := PlanResponse{ PlannedChanges: changesCh, @@ -2048,8 +2057,8 @@ func TestPlanWithDeferredEmbeddedStackAndComponentForEach(t *testing.T) { Key: addrs.WildcardKey, }, ), - PlanApplyable: true, - PlanComplete: true, + PlanApplyable: false, // Everything is deferred, so nothing to apply. + PlanComplete: false, Action: plans.Create, PlannedInputValues: map[string]plans.DynamicValue{ "id": mustPlanDynamicValueDynamicType(cty.NullVal(cty.String)), @@ -2063,53 +2072,56 @@ func TestPlanWithDeferredEmbeddedStackAndComponentForEach(t *testing.T) { "input": nil, }, }, - &stackplan.PlannedChangeResourceInstancePlanned{ - ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ - Component: stackaddrs.Absolute( - stackaddrs.RootStackInstance.Child("a", addrs.WildcardKey), - stackaddrs.ComponentInstance{ - Component: stackaddrs.Component{Name: "self"}, - Key: addrs.WildcardKey, + &stackplan.PlannedChangeDeferredResourceInstancePlanned{ + DeferredReason: providers.DeferredReasonDeferredPrereq, + ResourceInstancePlanned: stackplan.PlannedChangeResourceInstancePlanned{ + ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ + Component: stackaddrs.Absolute( + stackaddrs.RootStackInstance.Child("a", addrs.WildcardKey), + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "self"}, + Key: addrs.WildcardKey, + }, + ), + Item: addrs.AbsResourceInstanceObject{ + ResourceInstance: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), }, - ), - Item: addrs.AbsResourceInstanceObject{ - ResourceInstance: addrs.Resource{ + }, + ProviderConfigAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: &plans.ResourceInstanceChangeSrc{ + Addr: addrs.Resource{ Mode: addrs.ManagedResourceMode, Type: "testing_resource", Name: "data", }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + PrevRunAddr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + ProviderAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: plans.ChangeSrc{ + Action: plans.Create, + Before: mustPlanDynamicValue(cty.NullVal(cty.DynamicPseudoType)), + After: mustPlanDynamicValueSchema(cty.ObjectVal(map[string]cty.Value{ + "id": cty.UnknownVal(cty.String), + "value": cty.UnknownVal(cty.String), + }), stacks_testing_provider.TestingResourceSchema), + AfterSensitivePaths: nil, + }, }, + Schema: stacks_testing_provider.TestingResourceSchema, }, - ProviderConfigAddr: addrs.AbsProviderConfig{ - Module: addrs.RootModule, - Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), - }, - ChangeSrc: &plans.ResourceInstanceChangeSrc{ - Addr: addrs.Resource{ - Mode: addrs.ManagedResourceMode, - Type: "testing_resource", - Name: "data", - }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), - PrevRunAddr: addrs.Resource{ - Mode: addrs.ManagedResourceMode, - Type: "testing_resource", - Name: "data", - }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), - ProviderAddr: addrs.AbsProviderConfig{ - Module: addrs.RootModule, - Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), - }, - ChangeSrc: plans.ChangeSrc{ - Action: plans.Create, - Before: mustPlanDynamicValue(cty.NullVal(cty.DynamicPseudoType)), - After: mustPlanDynamicValueSchema(cty.ObjectVal(map[string]cty.Value{ - "id": cty.UnknownVal(cty.String), - "value": cty.UnknownVal(cty.String), - }), stacks_testing_provider.TestingResourceSchema), - AfterSensitivePaths: nil, - }, - }, - Schema: stacks_testing_provider.TestingResourceSchema, }, &stackplan.PlannedChangeRootInputValue{ Addr: stackaddrs.InputVariable{Name: "stacks"}, diff --git a/internal/terraform/context_plan2_test.go b/internal/terraform/context_plan2_test.go index d0970fe1f2..bb099e1987 100644 --- a/internal/terraform/context_plan2_test.go +++ b/internal/terraform/context_plan2_test.go @@ -4838,9 +4838,16 @@ func TestContext2Apply_externalDependencyDeferred(t *testing.T) { if diff := cmp.Diff(wantActions, gotActions, cmpOpts); diff != "" { t.Fatalf("wrong actions in plan\n%s", diff) } - // TODO: Once we are including information about the individual - // deferred actions in the plan, this would be a good place to - // assert that they are correct! + + if len(plan.DeferredResources) != 3 { + t.Fatalf("expected exactly 3 deferred resources, got %d", len(plan.DeferredResources)) + } + + for _, res := range plan.DeferredResources { + if res.DeferredReason != providers.DeferredReasonDeferredPrereq { + t.Fatalf("expected all resources to be deferred due to deferred prerequisites, but %s was not", res.ChangeSrc.Addr) + } + } } func TestContext2Plan_removedResourceForgetBasic(t *testing.T) { From 1e9a186059a7148577516b79af29f1804b632c75 Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Tue, 4 Jun 2024 15:32:50 +0200 Subject: [PATCH 140/161] stacks: return dynamic types when referencing partial components (#35254) --- .../internal/stackeval/component.go | 5 +- .../internal/stackeval/component_test.go | 11 +- internal/stacks/stackruntime/plan_test.go | 342 +++++++++++++++++- .../deferred-component-for-each.tfstack.hcl | 48 +++ .../deferred-component-references.tfstack.hcl | 48 +++ .../single-input-and-output.tf | 27 ++ 6 files changed, 471 insertions(+), 10 deletions(-) create mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input-and-output/deferred-component-for-each/deferred-component-for-each.tfstack.hcl create mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input-and-output/deferred-component-references/deferred-component-references.tfstack.hcl create mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input-and-output/single-input-and-output.tf diff --git a/internal/stacks/stackruntime/internal/stackeval/component.go b/internal/stacks/stackruntime/internal/stackeval/component.go index 916ecb236a..0ff237fb5a 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component.go +++ b/internal/stacks/stackruntime/internal/stackeval/component.go @@ -205,7 +205,7 @@ func (c *Component) ResultValue(ctx context.Context, phase EvalPhase) cty.Value // exact type constraints for its output values and so each instance of // a component can potentially produce a different object type. - if insts == nil { + if _, exists := insts[addrs.WildcardKey]; exists || insts == nil { // If we don't even know what instances we have then we can't // predict anything about our result. return cty.DynamicVal @@ -221,6 +221,9 @@ func (c *Component) ResultValue(ctx context.Context, phase EvalPhase) cty.Value } elems[string(k)] = inst.ResultValue(ctx, phase) } + if len(elems) == 0 { + return cty.EmptyObjectVal + } return cty.ObjectVal(elems) default: diff --git a/internal/stacks/stackruntime/internal/stackeval/component_test.go b/internal/stacks/stackruntime/internal/stackeval/component_test.go index 754dfc5d9d..33d7c6c36b 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_test.go @@ -10,12 +10,13 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/google/go-cmp/cmp" + "github.com/zclconf/go-cty-debug/ctydebug" + "github.com/zclconf/go-cty/cty" + "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/instances" "github.com/hashicorp/terraform/internal/stacks/stackaddrs" "github.com/hashicorp/terraform/internal/tfdiags" - "github.com/zclconf/go-cty-debug/ctydebug" - "github.com/zclconf/go-cty/cty" ) // TestComponentInstances is a test of the [Component.CheckInstances] function. @@ -393,10 +394,8 @@ func TestComponentResultValue(t *testing.T) { component := getComponent(ctx, t, main) got := component.ResultValue(ctx, InspectPhase) // When the for_each expression is unknown, the result value - // is an instance map with the wildcard key and an empty object - want := cty.ObjectVal(map[string]cty.Value{ - "*": cty.EmptyObjectVal, - }) + // is aa dynamic instance. + want := cty.DynamicVal if diff := cmp.Diff(want, got, ctydebug.CmpOptions); diff != "" { t.Fatalf("wrong result\n%s", diff) diff --git a/internal/stacks/stackruntime/plan_test.go b/internal/stacks/stackruntime/plan_test.go index df7bdca422..54ffb8ff43 100644 --- a/internal/stacks/stackruntime/plan_test.go +++ b/internal/stacks/stackruntime/plan_test.go @@ -1727,7 +1727,7 @@ func TestPlanWithDeferredResource(t *testing.T) { func TestPlanWithDeferredComponentForEach(t *testing.T) { ctx := context.Background() - cfg := loadMainBundleConfigForTest(t, path.Join("with-single-input", "deferred-component-for-each")) + cfg := loadMainBundleConfigForTest(t, path.Join("with-single-input-and-output", "deferred-component-for-each")) fakePlanTimestamp, err := time.Parse(time.RFC3339, "1991-08-25T20:57:08Z") if err != nil { @@ -1772,6 +1772,96 @@ func TestPlanWithDeferredComponentForEach(t *testing.T) { &stackplan.PlannedChangeApplyable{ Applyable: true, }, + &stackplan.PlannedChangeComponentInstance{ + Addr: stackaddrs.Absolute( + stackaddrs.RootStackInstance, + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "child"}, + }, + ), + PlanApplyable: true, + PlanComplete: false, + Action: plans.Create, + RequiredComponents: collections.NewSet[stackaddrs.AbsComponent]( + stackaddrs.AbsComponent{ + Stack: stackaddrs.RootStackInstance, + Item: stackaddrs.Component{ + Name: "self", + }, + }, + ), + PlannedInputValues: map[string]plans.DynamicValue{ + "id": mustPlanDynamicValueDynamicType(cty.NullVal(cty.String)), + "input": mustPlanDynamicValueDynamicType(cty.UnknownVal(cty.String)), + }, + PlannedInputValueMarks: map[string][]cty.PathValueMarks{ + "id": nil, + "input": nil, + }, + PlannedOutputValues: map[string]cty.Value{ + "id": cty.UnknownVal(cty.String), + }, + PlannedCheckResults: &states.CheckResults{}, + PlanTimestamp: fakePlanTimestamp, + }, + &stackplan.PlannedChangeDeferredResourceInstancePlanned{ + ResourceInstancePlanned: stackplan.PlannedChangeResourceInstancePlanned{ + ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ + Component: stackaddrs.AbsComponentInstance{ + Stack: stackaddrs.RootStackInstance, + Item: stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{ + Name: "child", + }, + }, + }, + Item: addrs.AbsResourceInstanceObject{ + ResourceInstance: addrs.AbsResourceInstance{ + Module: addrs.RootModuleInstance, + Resource: addrs.ResourceInstance{ + Resource: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }, + Key: addrs.NoKey, + }, + }, + }, + }, + ChangeSrc: &plans.ResourceInstanceChangeSrc{ + Addr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + PrevRunAddr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + ProviderAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: plans.ChangeSrc{ + Action: plans.Create, + Before: mustPlanDynamicValue(cty.NullVal(cty.DynamicPseudoType)), + After: mustPlanDynamicValueSchema(cty.ObjectVal(map[string]cty.Value{ + "id": cty.UnknownVal(cty.String), + "value": cty.UnknownVal(cty.String), + }), stacks_testing_provider.TestingResourceSchema), + AfterSensitivePaths: nil, + }, + }, + ProviderConfigAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + Schema: stacks_testing_provider.TestingResourceSchema, + }, + DeferredReason: providers.DeferredReasonDeferredPrereq, + }, &stackplan.PlannedChangeComponentInstance{ Addr: stackaddrs.Absolute( stackaddrs.RootStackInstance, @@ -1780,14 +1870,16 @@ func TestPlanWithDeferredComponentForEach(t *testing.T) { Key: addrs.WildcardKey, }, ), - PlanApplyable: false, // Everything is deferred, so nothing to apply. + PlanApplyable: true, // TODO: Questionable? We only have outputs. PlanComplete: false, Action: plans.Create, PlannedInputValues: map[string]plans.DynamicValue{ "id": mustPlanDynamicValueDynamicType(cty.NullVal(cty.String)), "input": mustPlanDynamicValueDynamicType(cty.UnknownVal(cty.String)), }, - PlannedOutputValues: map[string]cty.Value{}, + PlannedOutputValues: map[string]cty.Value{ + "id": cty.UnknownVal(cty.String), + }, PlannedCheckResults: &states.CheckResults{}, PlanTimestamp: fakePlanTimestamp, PlannedInputValueMarks: map[string][]cty.PathValueMarks{ @@ -1860,6 +1952,250 @@ func TestPlanWithDeferredComponentForEach(t *testing.T) { } } +func TestPlanWithDeferredComponentReferences(t *testing.T) { + ctx := context.Background() + cfg := loadMainBundleConfigForTest(t, path.Join("with-single-input-and-output", "deferred-component-references")) + + fakePlanTimestamp, err := time.Parse(time.RFC3339, "1991-08-25T20:57:08Z") + if err != nil { + t.Fatal(err) + } + + changesCh := make(chan stackplan.PlannedChange, 8) + diagsCh := make(chan tfdiags.Diagnostic, 2) + req := PlanRequest{ + Config: cfg, + ProviderFactories: map[addrs.Provider]providers.Factory{ + addrs.NewDefaultProvider("testing"): func() (providers.Interface, error) { + return stacks_testing_provider.NewProvider(), nil + }, + }, + ForcePlanTimestamp: &fakePlanTimestamp, + InputValues: map[stackaddrs.InputVariable]ExternalInputValue{ + {Name: "known_components"}: { + Value: cty.ListVal([]cty.Value{cty.StringVal("known")}), + DefRange: tfdiags.SourceRange{}, + }, + {Name: "unknown_components"}: { + Value: cty.UnknownVal(cty.Set(cty.String)), + DefRange: tfdiags.SourceRange{}, + }, + }, + DeferralAllowed: true, + } + resp := PlanResponse{ + PlannedChanges: changesCh, + Diagnostics: diagsCh, + } + go Plan(ctx, &req, &resp) + gotChanges, diags := collectPlanOutput(changesCh, diagsCh) + + reportDiagnosticsForTest(t, diags) + if len(diags) != 0 { + t.FailNow() // We reported the diags above. + } + + sort.SliceStable(gotChanges, func(i, j int) bool { + return plannedChangeSortKey(gotChanges[i]) < plannedChangeSortKey(gotChanges[j]) + }) + + wantChanges := []stackplan.PlannedChange{ + &stackplan.PlannedChangeApplyable{ + Applyable: true, + }, + &stackplan.PlannedChangeComponentInstance{ + Addr: stackaddrs.Absolute( + stackaddrs.RootStackInstance, + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "children"}, + Key: addrs.WildcardKey, + }, + ), + PlanApplyable: true, // TODO: Questionable? We only have outputs. + PlanComplete: false, + Action: plans.Create, + PlannedInputValues: map[string]plans.DynamicValue{ + "id": mustPlanDynamicValueDynamicType(cty.NullVal(cty.String)), + "input": mustPlanDynamicValueDynamicType(cty.UnknownVal(cty.String)), + }, + PlannedInputValueMarks: map[string][]cty.PathValueMarks{ + "id": nil, + "input": nil, + }, + PlannedOutputValues: map[string]cty.Value{ + "id": cty.UnknownVal(cty.String), + }, + PlannedCheckResults: &states.CheckResults{}, + PlanTimestamp: fakePlanTimestamp, + RequiredComponents: collections.NewSet[stackaddrs.AbsComponent]( + stackaddrs.AbsComponent{ + Stack: stackaddrs.RootStackInstance, + Item: stackaddrs.Component{ + Name: "self", + }, + }, + ), + }, + &stackplan.PlannedChangeDeferredResourceInstancePlanned{ + DeferredReason: providers.DeferredReasonDeferredPrereq, + ResourceInstancePlanned: stackplan.PlannedChangeResourceInstancePlanned{ + ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ + Component: stackaddrs.Absolute( + stackaddrs.RootStackInstance, + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "children"}, + Key: addrs.WildcardKey, + }, + ), + Item: addrs.AbsResourceInstanceObject{ + ResourceInstance: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + }, + }, + ProviderConfigAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: &plans.ResourceInstanceChangeSrc{ + Addr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + PrevRunAddr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + ProviderAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: plans.ChangeSrc{ + Action: plans.Create, + Before: mustPlanDynamicValue(cty.NullVal(cty.DynamicPseudoType)), + After: mustPlanDynamicValueSchema(cty.ObjectVal(map[string]cty.Value{ + "id": cty.UnknownVal(cty.String), + "value": cty.UnknownVal(cty.String), + }), stacks_testing_provider.TestingResourceSchema), + AfterSensitivePaths: nil, + }, + }, + Schema: stacks_testing_provider.TestingResourceSchema, + }, + }, + &stackplan.PlannedChangeComponentInstance{ + Addr: stackaddrs.Absolute( + stackaddrs.RootStackInstance, + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "self"}, + Key: addrs.StringKey("known"), + }), + PlanApplyable: true, + PlanComplete: true, + Action: plans.Create, + PlannedInputValues: map[string]plans.DynamicValue{ + "id": mustPlanDynamicValueDynamicType(cty.NullVal(cty.String)), + "input": mustPlanDynamicValueDynamicType(cty.StringVal("known")), + }, + PlannedInputValueMarks: map[string][]cty.PathValueMarks{ + "id": nil, + "input": nil, + }, + PlannedOutputValues: map[string]cty.Value{ + "id": cty.UnknownVal(cty.String), + }, + PlannedCheckResults: &states.CheckResults{}, + PlanTimestamp: fakePlanTimestamp, + }, + &stackplan.PlannedChangeResourceInstancePlanned{ + ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ + Component: stackaddrs.AbsComponentInstance{ + Stack: stackaddrs.RootStackInstance, + Item: stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{ + Name: "self", + }, + Key: addrs.StringKey("known"), + }, + }, + Item: addrs.AbsResourceInstanceObject{ + ResourceInstance: addrs.AbsResourceInstance{ + Module: addrs.RootModuleInstance, + Resource: addrs.ResourceInstance{ + Resource: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }, + Key: addrs.NoKey, + }, + }, + }, + }, + ChangeSrc: &plans.ResourceInstanceChangeSrc{ + Addr: addrs.AbsResourceInstance{ + Module: addrs.RootModuleInstance, + Resource: addrs.ResourceInstance{ + Resource: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }, + Key: addrs.NoKey, + }, + }, + PrevRunAddr: addrs.AbsResourceInstance{ + Module: addrs.RootModuleInstance, + Resource: addrs.ResourceInstance{ + Resource: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }, + Key: addrs.NoKey, + }, + }, + ChangeSrc: plans.ChangeSrc{ + Action: plans.Create, + Before: mustPlanDynamicValue(cty.NullVal(cty.DynamicPseudoType)), + After: mustPlanDynamicValueSchema(cty.ObjectVal(map[string]cty.Value{ + "id": cty.UnknownVal(cty.String), + "value": cty.StringVal("known"), + }), stacks_testing_provider.TestingResourceSchema), + }, + ProviderAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + }, + ProviderConfigAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + Schema: stacks_testing_provider.TestingResourceSchema, + }, + &stackplan.PlannedChangeHeader{ + TerraformVersion: version.SemVer, + }, + &stackplan.PlannedChangeRootInputValue{ + Addr: stackaddrs.InputVariable{Name: "known_components"}, + Value: cty.SetVal([]cty.Value{cty.StringVal("known")}), + }, + &stackplan.PlannedChangeRootInputValue{ + Addr: stackaddrs.InputVariable{Name: "unknown_components"}, + Value: cty.UnknownVal(cty.Set(cty.String)), + }, + } + + if diff := cmp.Diff(wantChanges, gotChanges, ctydebug.CmpOptions, cmpCollectionsSet); diff != "" { + t.Errorf("wrong changes\n%s", diff) + } +} + // This test verifies that if an embedded stack is configured with a for_each value that is unknown / deferred // that the plan will use the wildcard key for the embedded stack and that the components within are planned with // unknown values. diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input-and-output/deferred-component-for-each/deferred-component-for-each.tfstack.hcl b/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input-and-output/deferred-component-for-each/deferred-component-for-each.tfstack.hcl new file mode 100644 index 0000000000..acf459e586 --- /dev/null +++ b/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input-and-output/deferred-component-for-each/deferred-component-for-each.tfstack.hcl @@ -0,0 +1,48 @@ +required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } +} + +variable "components" { + type = set(string) +} + +provider "testing" "default" {} + +component "self" { + // This component validates the behaviour of an unknown for_each value. + + source = "../" + + providers = { + testing = provider.testing.default + } + + inputs = { + input = each.value + } + + for_each = var.components +} + +component "child" { + // This component validates the behaviour of referencing a partial component + // with a known key. Since we don't know the available keys of the component + // yet, this should use the outputs of the partial instance. + + source = "../" + + providers = { + testing = provider.testing.default + } + + inputs = { + // It's really unlikely that `const` is actually going to exist once + // component.self has known keys, but for now we don't know it doesn't + // exist so we should defer this component and make a reasonable attempt + // at planning something. + input = component.self["const"].id + } +} diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input-and-output/deferred-component-references/deferred-component-references.tfstack.hcl b/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input-and-output/deferred-component-references/deferred-component-references.tfstack.hcl new file mode 100644 index 0000000000..4c26bf2eb1 --- /dev/null +++ b/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input-and-output/deferred-component-references/deferred-component-references.tfstack.hcl @@ -0,0 +1,48 @@ +required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } +} + +variable "known_components" { + type = set(string) +} + +variable "unknown_components" { + type = set(string) +} + +provider "testing" "default" {} + +component "self" { + source = "../" + + providers = { + testing = provider.testing.default + } + + inputs = { + input = each.value + } + + for_each = var.known_components +} + +component "children" { + // This component validates the behaviour of referencing a known component + // with an unknown key. + source = "../" + + providers = { + testing = provider.testing.default + } + + inputs = { + // each.key is unknown, but we should still get a typed reference to an + // output here so we can plan using unknown values. + input = component.self[each.key].id + } + + for_each = var.unknown_components +} diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input-and-output/single-input-and-output.tf b/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input-and-output/single-input-and-output.tf new file mode 100644 index 0000000000..c5ddc84f76 --- /dev/null +++ b/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input-and-output/single-input-and-output.tf @@ -0,0 +1,27 @@ +terraform { + required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } + } +} + +variable "id" { + type = string + default = null + nullable = true # We'll generate an ID if none provided. +} + +variable "input" { + type = string +} + +resource "testing_resource" "data" { + id = var.id + value = var.input +} + +output "id" { + value = testing_resource.data.id +} From dc06717f695cab1a540c71e2472043aecabead49 Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Tue, 4 Jun 2024 16:26:23 +0200 Subject: [PATCH 141/161] stacks: add support for unknown for_each expressions in providers (#35267) * stacks: add support for unknown for_each expressions in providers * return more precise values for the unknown provider --- .../internal/stackeval/component_instance.go | 140 +++++------ .../internal/stackeval/provider.go | 38 +-- .../internal/stackeval/provider_instance.go | 237 +----------------- .../internal/stackeval/provider_test.go | 23 +- .../internal/stackeval/stubs/configured.go | 237 ++++++++++++++++++ .../internal/stackeval/stubs/unknown.go | 234 +++++++++++++++++ internal/stacks/stackruntime/plan_test.go | 203 +++++++++++++++ .../deferred-provider-for-each.tfstack.hcl | 46 ++++ 8 files changed, 821 insertions(+), 337 deletions(-) create mode 100644 internal/stacks/stackruntime/internal/stackeval/stubs/configured.go create mode 100644 internal/stacks/stackruntime/internal/stackeval/stubs/unknown.go create mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/deferred-provider-for-each/deferred-provider-for-each.tfstack.hcl diff --git a/internal/stacks/stackruntime/internal/stackeval/component_instance.go b/internal/stacks/stackruntime/internal/stackeval/component_instance.go index 1cadad6e92..3295ada0f7 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_instance.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_instance.go @@ -22,6 +22,7 @@ import ( "github.com/hashicorp/terraform/internal/stacks/stackconfig/stackconfigtypes" "github.com/hashicorp/terraform/internal/stacks/stackplan" "github.com/hashicorp/terraform/internal/stacks/stackruntime/hooks" + "github.com/hashicorp/terraform/internal/stacks/stackruntime/internal/stackeval/stubs" "github.com/hashicorp/terraform/internal/stacks/stackstate" "github.com/hashicorp/terraform/internal/states" "github.com/hashicorp/terraform/internal/terraform" @@ -137,9 +138,9 @@ func (c *ComponentInstance) inputValuesForModulesRuntime(ctx context.Context, ph // then there are some problems with the providers argument and so the // map might be incomplete, and so callers should use it only with a great // deal of care. -func (c *ComponentInstance) Providers(ctx context.Context, phase EvalPhase) (map[addrs.RootProviderConfig]stackaddrs.AbsProviderConfigInstance, bool) { - ret, diags := c.CheckProviders(ctx, phase) - return ret, !diags.HasErrors() +func (c *ComponentInstance) Providers(ctx context.Context, phase EvalPhase) (map[addrs.RootProviderConfig]stackaddrs.AbsProviderConfigInstance, map[addrs.RootProviderConfig]addrs.Provider, bool) { + known, unknown, diags := c.CheckProviders(ctx, phase) + return known, unknown, !diags.HasErrors() } // CheckProviders evaluates the "providers" argument from the component @@ -150,9 +151,10 @@ func (c *ComponentInstance) Providers(ctx context.Context, phase EvalPhase) (map // // If the "providers" argument is invalid then this will return error // diagnostics along with a partial result. -func (c *ComponentInstance) CheckProviders(ctx context.Context, phase EvalPhase) (map[addrs.RootProviderConfig]stackaddrs.AbsProviderConfigInstance, tfdiags.Diagnostics) { +func (c *ComponentInstance) CheckProviders(ctx context.Context, phase EvalPhase) (map[addrs.RootProviderConfig]stackaddrs.AbsProviderConfigInstance, map[addrs.RootProviderConfig]addrs.Provider, tfdiags.Diagnostics) { var diags tfdiags.Diagnostics - ret := make(map[addrs.RootProviderConfig]stackaddrs.AbsProviderConfigInstance) + knownProviders := make(map[addrs.RootProviderConfig]stackaddrs.AbsProviderConfigInstance) + unknownProviders := make(map[addrs.RootProviderConfig]addrs.Provider) declConfigs := c.call.Declaration(ctx).ProviderConfigs configProviders := c.call.Config(ctx).RequiredProviderInstances(ctx) @@ -174,11 +176,18 @@ func (c *ComponentInstance) CheckProviders(ctx context.Context, phase EvalPhase) // know this expression exists and resolves to the correct type. expr := declConfigs[componentAddr] - inst, instDiags, ok := c.checkProvider(ctx, sourceAddr, componentAddr, expr, phase) + inst, unknown, instDiags := c.checkProvider(ctx, sourceAddr, componentAddr, expr, phase) diags = diags.Append(instDiags) - if ok { - ret[sourceAddr] = inst + if instDiags.HasErrors() { + continue } + + if unknown { + unknownProviders[sourceAddr] = sourceAddr.Provider + continue + } + + knownProviders[sourceAddr] = inst } // Second, we want to iterate through the providers that are required by @@ -210,7 +219,7 @@ func (c *ComponentInstance) CheckProviders(ctx context.Context, phase EvalPhase) Alias: localProviderAddr.Alias, } - if _, exists := ret[sourceAddr]; exists || !previousProviders.Has(sourceAddr) { + if _, exists := knownProviders[sourceAddr]; exists || !previousProviders.Has(sourceAddr) { // Then this declConfig either matches a configProvider and we've // already processed it, or it matches a provider that isn't // required by the config or the state. In the first case, this is @@ -224,10 +233,16 @@ func (c *ComponentInstance) CheckProviders(ctx context.Context, phase EvalPhase) // configProviders and is in the previousProviders. So, we should // process it. - inst, instDiags, ok := c.checkProvider(ctx, sourceAddr, localProviderAddr, expr, phase) + inst, unknown, instDiags := c.checkProvider(ctx, sourceAddr, localProviderAddr, expr, phase) diags = diags.Append(instDiags) - if ok { - ret[sourceAddr] = inst + if instDiags.HasErrors() { + continue + } + + if unknown { + unknownProviders[sourceAddr] = provider + } else { + knownProviders[sourceAddr] = inst } if _, ok := stackConfig.ProviderLocalName(ctx, provider); !ok { @@ -242,7 +257,6 @@ func (c *ComponentInstance) CheckProviders(ctx context.Context, phase EvalPhase) ), Subject: c.call.Declaration(ctx).DeclRange.ToHCL().Ptr(), }) - continue } } @@ -250,7 +264,7 @@ func (c *ComponentInstance) CheckProviders(ctx context.Context, phase EvalPhase) // provider needed by the state. for _, previousProvider := range previousProviders { - if _, ok := ret[previousProvider]; ok { + if _, ok := knownProviders[previousProvider]; ok { // Then we have a provider for this, so great! continue } @@ -276,17 +290,17 @@ func (c *ComponentInstance) CheckProviders(ctx context.Context, phase EvalPhase) }) } - return ret, diags + return knownProviders, unknownProviders, diags } -func (c *ComponentInstance) checkProvider(ctx context.Context, sourceAddr addrs.RootProviderConfig, componentAddr addrs.LocalProviderConfig, expr hcl.Expression, phase EvalPhase) (stackaddrs.AbsProviderConfigInstance, tfdiags.Diagnostics, bool) { +func (c *ComponentInstance) checkProvider(ctx context.Context, sourceAddr addrs.RootProviderConfig, componentAddr addrs.LocalProviderConfig, expr hcl.Expression, phase EvalPhase) (stackaddrs.AbsProviderConfigInstance, bool, tfdiags.Diagnostics) { var diags tfdiags.Diagnostics var ret stackaddrs.AbsProviderConfigInstance result, hclDiags := EvalExprAndEvalContext(ctx, expr, phase, c) diags = diags.Append(hclDiags) if hclDiags.HasErrors() { - return ret, diags, false + return ret, false, diags } v := result.Value @@ -312,7 +326,7 @@ func (c *ComponentInstance) checkProvider(ctx context.Context, sourceAddr addrs. ), Subject: result.Expression.Range().Ptr(), }) - return ret, diags, false + return ret, false, diags } } else { // We got something that isn't a provider reference at all. @@ -325,7 +339,7 @@ func (c *ComponentInstance) checkProvider(ctx context.Context, sourceAddr addrs. ), Subject: result.Expression.Range().Ptr(), }) - return ret, diags, false + return ret, false, diags } // Now, we differ from the static analysis in that we should have @@ -341,59 +355,16 @@ func (c *ComponentInstance) checkProvider(ctx context.Context, sourceAddr addrs. ), Subject: result.Expression.Range().Ptr(), }) - return ret, diags, false + return ret, false, diags } if !v.IsKnown() { - // TODO: Once we support deferred changes we should return - // something that lets the caller know the configuration is - // incomplete so it can defer planning the entire component. - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: errSummary, - Detail: fmt.Sprintf( - "This expression depends on values that won't be known until the apply phase, so Terraform cannot determine which provider configuration to use while planning changes for %s.", - c.Addr().String(), - ), - Subject: result.Expression.Range().Ptr(), - }) - return ret, diags, false + return ret, true, diags } // If it's of the correct type, known, and not null then we should // be able to retrieve a specific provider instance address that // this value refers to. - ret = stackconfigtypes.ProviderInstanceForValue(v) - - // The reference must be to a provider instance that's actually - // configured. - providerInstStack := c.main.Stack(ctx, ret.Stack, phase) - if providerInstStack != nil { - provider := providerInstStack.Provider(ctx, ret.Item.ProviderConfig) - if provider != nil { - insts := provider.Instances(ctx, phase) - if insts == nil { - // If we get here then we don't yet know which instances - // this provider has, so we'll be optimistic that it'll - // show up in a later phase. - return ret, diags, true - } - if _, exists := insts[ret.Item.Key]; exists { - return ret, diags, true - } - } - } - // If we fall here then something on the path to the provider instance - // doesn't exist, and so effectively the provider instance doesn't exist. - diags = diags.Append(&hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: errSummary, - Detail: fmt.Sprintf( - "Expression result refers to undefined provider instance %s.", - ret, - ), - Subject: result.Expression.Range().Ptr(), - }) - return ret, diags, true + return stackconfigtypes.ProviderInstanceForValue(v), false, diags } func (c *ComponentInstance) neededProviderSchemas(ctx context.Context) (map[addrs.Provider]providers.ProviderSchema, tfdiags.Diagnostics) { @@ -435,12 +406,13 @@ func (c *ComponentInstance) neededProviderSchemas(ctx context.Context) (map[addr return providerSchemas, diags } -func (c *ComponentInstance) neededProviderClients(ctx context.Context, phase EvalPhase) (clients map[addrs.RootProviderConfig]providers.Interface, valid bool) { - providerInstAddrs, valid := c.Providers(ctx, phase) +func (c *ComponentInstance) neededProviderClients(ctx context.Context, phase EvalPhase) (map[addrs.RootProviderConfig]providers.Interface, func(), bool) { + providerInstAddrs, unknownProviders, valid := c.Providers(ctx, phase) if !valid { - return nil, false + return nil, nil, false } providerInsts := make(map[addrs.RootProviderConfig]providers.Interface) + var closeableInsts []providers.Interface for calleeAddr, callerAddr := range providerInstAddrs { providerInstStack := c.main.Stack(ctx, callerAddr.Stack, phase) if providerInstStack == nil { @@ -452,9 +424,6 @@ func (c *ComponentInstance) neededProviderClients(ctx context.Context, phase Eva } insts := provider.Instances(ctx, phase) if insts == nil { - // If we get here then we don't yet know which instances - // this provider has, so we'll be optimistic that it'll - // show up in a later phase. continue } inst, exists := insts[callerAddr.Item.Key] @@ -463,7 +432,24 @@ func (c *ComponentInstance) neededProviderClients(ctx context.Context, phase Eva } providerInsts[calleeAddr] = inst.Client(ctx, phase) } - return providerInsts, true + for calleeAddr, provider := range unknownProviders { + pTy := c.main.ProviderType(ctx, provider) + client, err := pTy.UnconfiguredClient(ctx) + if err != nil { + continue + } + closeableInsts = append(closeableInsts, client) + providerInsts[calleeAddr] = stubs.UnknownProvider(client) + } + return providerInsts, func() { + // We need to close the unconfigured clients we took for the unknown + // providers. + for _, inst := range closeableInsts { + // Nothing we can really do if the close fails, so just ignore + // the errors. + inst.Close() + } + }, true } func (c *ComponentInstance) ModuleTreePlan(ctx context.Context) *plans.Plan { @@ -544,7 +530,7 @@ func (c *ComponentInstance) CheckModuleTreePlan(ctx context.Context) (*plans.Pla return nil, diags } - providerClients, valid := c.neededProviderClients(ctx, PlanPhase) + providerClients, closer, valid := c.neededProviderClients(ctx, PlanPhase) if !valid { diags = diags.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, @@ -554,6 +540,7 @@ func (c *ComponentInstance) CheckModuleTreePlan(ctx context.Context) (*plans.Pla }) return nil, diags } + defer closer() // If any of our upstream components have incomplete plans then // we need to force treating everything in this component as @@ -812,7 +799,7 @@ func (c *ComponentInstance) ApplyModuleTreePlan(ctx context.Context, plan *plans return noOpResult, diags } - providerClients, valid := c.neededProviderClients(ctx, ApplyPhase) + providerClients, closer, valid := c.neededProviderClients(ctx, ApplyPhase) if !valid { diags = diags.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, @@ -822,6 +809,7 @@ func (c *ComponentInstance) ApplyModuleTreePlan(ctx context.Context, plan *plans }) return noOpResult, diags } + defer closer() var newState *states.State if modifiedPlan.Applyable { @@ -1197,7 +1185,7 @@ func (c *ComponentInstance) PlanChanges(ctx context.Context) ([]stackplan.Planne _, moreDiags := c.CheckInputVariableValues(ctx, PlanPhase) diags = diags.Append(moreDiags) - _, moreDiags = c.CheckProviders(ctx, PlanPhase) + _, _, moreDiags = c.CheckProviders(ctx, PlanPhase) diags = diags.Append(moreDiags) corePlan, moreDiags := c.CheckModuleTreePlan(ctx) @@ -1454,7 +1442,7 @@ func (c *ComponentInstance) CheckApply(ctx context.Context) ([]stackstate.Applie _, moreDiags := c.CheckInputVariableValues(ctx, ApplyPhase) diags = diags.Append(moreDiags) - _, moreDiags = c.CheckProviders(ctx, ApplyPhase) + _, _, moreDiags = c.CheckProviders(ctx, ApplyPhase) diags = diags.Append(moreDiags) applyResult, moreDiags := c.CheckApplyResult(ctx) diff --git a/internal/stacks/stackruntime/internal/stackeval/provider.go b/internal/stacks/stackruntime/internal/stackeval/provider.go index 59a29ea468..617ae44ec8 100644 --- a/internal/stacks/stackruntime/internal/stackeval/provider.go +++ b/internal/stacks/stackruntime/internal/stackeval/provider.go @@ -123,18 +123,6 @@ func (p *Provider) CheckForEachValue(ctx context.Context, phase EvalPhase) (cty. if diags.HasErrors() { return cty.DynamicVal, diags } - - if !result.Value.IsKnown() { - // FIXME: We should somehow allow this and emit a - // "deferred change" representing all of the as-yet-unknown - // instances of this call and everything beneath it. - diags = diags.Append(result.Diagnostic( - tfdiags.Error, - "Invalid for_each value", - "The for_each value must not be derived from values that will be determined only during the apply phase.", - )) - } - return result.Value, diags default: @@ -177,11 +165,29 @@ func (p *Provider) CheckInstances(ctx context.Context, phase EvalPhase) (map[add return doOnceWithDiags( ctx, p.instances.For(phase), p.main, func(ctx context.Context) (map[addrs.InstanceKey]*ProviderInstance, tfdiags.Diagnostics) { - var diags tfdiags.Diagnostics - forEachVal := p.ForEachValue(ctx, phase) + + // Since we can't differentiate between a truly unknown foreach and + // an invalid foreach, we must check the diagnostics from the for + // each value. + + forEachVal, diags := p.CheckForEachValue(ctx, phase) + if diags.HasErrors() { + // We expect the caller to have already checked the for_each + // diagnostics and we don't want to return duplicates. + return nil, nil + } + + allowUnknowns := true + if p.main.Planning() { + // We'll set this to false during planning if deferrals are not + // allowed. It's fine to always be true during apply, as this + // would have failed during planning if it was not allowed. + allowUnknowns = p.main.PlanningOpts().DeferralAllowed + } + return instancesMap(forEachVal, func(ik addrs.InstanceKey, rd instances.RepetitionData) *ProviderInstance { return newProviderInstance(p, ik, rd) - }, false), diags + }, allowUnknowns), diags }, ) } @@ -195,7 +201,7 @@ func (p *Provider) ExprReferenceValue(ctx context.Context, phase EvalPhase) cty. switch { case decl.ForEach != nil: - if insts == nil { + if _, ok := insts[addrs.WildcardKey]; ok || insts == nil { return cty.UnknownVal(cty.Map(refType)) } elems := make(map[string]cty.Value, len(insts)) diff --git a/internal/stacks/stackruntime/internal/stackeval/provider_instance.go b/internal/stacks/stackruntime/internal/stackeval/provider_instance.go index 47fb7c1f1c..cb0f3b8bf7 100644 --- a/internal/stacks/stackruntime/internal/stackeval/provider_instance.go +++ b/internal/stacks/stackruntime/internal/stackeval/provider_instance.go @@ -18,6 +18,7 @@ import ( "github.com/hashicorp/terraform/internal/providers" "github.com/hashicorp/terraform/internal/stacks/stackaddrs" "github.com/hashicorp/terraform/internal/stacks/stackplan" + "github.com/hashicorp/terraform/internal/stacks/stackruntime/internal/stackeval/stubs" "github.com/hashicorp/terraform/internal/stacks/stackstate" "github.com/hashicorp/terraform/internal/tfdiags" "github.com/hashicorp/terraform/version" @@ -170,13 +171,13 @@ func (p *ProviderInstance) CheckClient(ctx context.Context, phase EvalPhase) (pr // If we're a placeholder standing in for all instances of // a provider block whose for_each is unknown then we // can't configure. - return stubConfiguredProvider{unknown: true}, diags + return stubs.ConfiguredProvider{Unknown: true}, diags } if p.repetition.CountIndex != cty.NilVal && !p.repetition.CountIndex.IsKnown() { // If we're a placeholder standing in for all instances of // a provider block whose count is unknown then we // can't configure. - return stubConfiguredProvider{unknown: true}, diags + return stubs.ConfiguredProvider{Unknown: true}, diags } args := p.ProviderArgs(ctx, phase) @@ -186,7 +187,7 @@ func (p *ProviderInstance) CheckClient(ctx context.Context, phase EvalPhase) (pr // no provider can accept a wholly-unknown configuration. // (Known objects with unknown attribute values inside are // okay to try and so don't return immediately here.) - return stubConfiguredProvider{unknown: true}, diags + return stubs.ConfiguredProvider{Unknown: true}, diags } providerType := p.ProviderType(ctx) @@ -203,7 +204,7 @@ func (p *ProviderInstance) CheckClient(ctx context.Context, phase EvalPhase) (pr ), Subject: decl.DeclRange.ToHCL().Ptr(), }) - return stubConfiguredProvider{unknown: false}, diags + return stubs.ConfiguredProvider{Unknown: false}, diags } // If the context we recieved gets cancelled then we want providers @@ -268,7 +269,7 @@ func (p *ProviderInstance) CheckClient(ctx context.Context, phase EvalPhase) (pr // stub instead. (The real provider stays running until it // gets cleaned up by the cleanup function above, despite being // inaccessible to the caller.) - return stubConfiguredProvider{unknown: false}, diags + return stubs.ConfiguredProvider{Unknown: false}, diags } return providerClose{ @@ -337,229 +338,3 @@ func (p *ProviderInstance) reportNamedPromises(cb func(id promising.PromiseID, n cb(o.PromiseID(), clientName) }) } - -// stubConfiguredProvider is a placeholder provider used when ConfigureProvider -// on a real provider fails, so that callers can still receieve a usable client -// that will just produce placeholder values from its operations. -// -// This is essentially the cty.DynamicVal equivalent for providers.Interface, -// allowing us to follow our usual pattern that only one return path carries -// diagnostics up to the caller and all other codepaths just do their best -// to unwind with placeholder values. It's intended only for use in situations -// that would expect an already-configured provider, so it's incorrect to call -// [ConfigureProvider] on a value of this type. -// -// Some methods of this type explicitly return errors saying that the provider -// configuration was invalid, while others just optimistically do nothing at -// all. The general rule is that anything that would for a normal provider -// be expected to perform externally-visible side effects must return an error -// to be explicit that those side effects did not occur, but we can silently -// skip anything that is a Terraform-only detail. -// -// As usual with provider calls, the returned diagnostics must be annotated -// using [tfdiags.Diagnostics.InConfigBody] with the relevant configuration body -// so that they can be attributed to the appropriate configuration element. -type stubConfiguredProvider struct { - // If unknown is true then the implementation will assume it's acting - // as a placeholder for a provider whose configuration isn't yet - // sufficiently known to be properly instantiated, which means that - // plan-time operations will return totally-unknown values. - // Otherwise any operation that is supposed to perform a side-effect - // will fail with an error saying that the provider configuration - // is invalid. - unknown bool -} - -var _ providers.Interface = stubConfiguredProvider{} - -// ApplyResourceChange implements providers.Interface. -func (stubConfiguredProvider) ApplyResourceChange(req providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse { - var diags tfdiags.Diagnostics - diags = diags.Append(tfdiags.AttributeValue( - tfdiags.Error, - "Provider configuration is invalid", - "Cannot apply changes because this resource's associated provider configuration is invalid.", - nil, // nil attribute path means the overall configuration block - )) - return providers.ApplyResourceChangeResponse{ - Diagnostics: diags, - } -} - -func (stubConfiguredProvider) CallFunction(providers.CallFunctionRequest) providers.CallFunctionResponse { - panic("can't call functions on the stub provider") -} - -// Close implements providers.Interface. -func (stubConfiguredProvider) Close() error { - return nil -} - -// ConfigureProvider implements providers.Interface. -func (stubConfiguredProvider) ConfigureProvider(req providers.ConfigureProviderRequest) providers.ConfigureProviderResponse { - // This provider is used only in situations where ConfigureProvider on - // a real provider fails and the recipient was expecting a configured - // provider, so it doesn't make sense to configure it. - panic("can't configure the stub provider") -} - -// GetProviderSchema implements providers.Interface. -func (stubConfiguredProvider) GetProviderSchema() providers.GetProviderSchemaResponse { - return providers.GetProviderSchemaResponse{} -} - -// ImportResourceState implements providers.Interface. -func (p stubConfiguredProvider) ImportResourceState(req providers.ImportResourceStateRequest) providers.ImportResourceStateResponse { - var diags tfdiags.Diagnostics - if p.unknown { - diags = diags.Append(tfdiags.AttributeValue( - tfdiags.Error, - "Provider configuration is deferred", - "Cannot import an existing object into this resource because its associated provider configuration is deferred to a later operation due to unknown expansion.", - nil, // nil attribute path means the overall configuration block - )) - } else { - diags = diags.Append(tfdiags.AttributeValue( - tfdiags.Error, - "Provider configuration is invalid", - "Cannot import an existing object into this resource because its associated provider configuration is invalid.", - nil, // nil attribute path means the overall configuration block - )) - } - return providers.ImportResourceStateResponse{ - Diagnostics: diags, - } -} - -// MoveResourceState implements providers.Interface. -func (p stubConfiguredProvider) MoveResourceState(req providers.MoveResourceStateRequest) providers.MoveResourceStateResponse { - var diags tfdiags.Diagnostics - if p.unknown { - diags = diags.Append(tfdiags.AttributeValue( - tfdiags.Error, - "Provider configuration is deferred", - "Cannot move an existing object to this resource because its associated provider configuration is deferred to a later operation due to unknown expansion.", - nil, // nil attribute path means the overall configuration block - )) - } else { - diags = diags.Append(tfdiags.AttributeValue( - tfdiags.Error, - "Provider configuration is invalid", - "Cannot move an existing object to this resource because its associated provider configuration is invalid.", - nil, // nil attribute path means the overall configuration block - )) - } - return providers.MoveResourceStateResponse{ - Diagnostics: diags, - } -} - -// PlanResourceChange implements providers.Interface. -func (p stubConfiguredProvider) PlanResourceChange(req providers.PlanResourceChangeRequest) providers.PlanResourceChangeResponse { - if p.unknown { - return providers.PlanResourceChangeResponse{ - PlannedState: cty.DynamicVal, - } - } - var diags tfdiags.Diagnostics - diags = diags.Append(tfdiags.AttributeValue( - tfdiags.Error, - "Provider configuration is invalid", - "Cannot plan changes for this resource because its associated provider configuration is invalid.", - nil, // nil attribute path means the overall configuration block - )) - return providers.PlanResourceChangeResponse{ - Diagnostics: diags, - } -} - -// ReadDataSource implements providers.Interface. -func (p stubConfiguredProvider) ReadDataSource(req providers.ReadDataSourceRequest) providers.ReadDataSourceResponse { - if p.unknown { - return providers.ReadDataSourceResponse{ - State: cty.DynamicVal, - } - } - var diags tfdiags.Diagnostics - diags = diags.Append(tfdiags.AttributeValue( - tfdiags.Error, - "Provider configuration is invalid", - "Cannot read from this data source because its associated provider configuration is invalid.", - nil, // nil attribute path means the overall configuration block - )) - return providers.ReadDataSourceResponse{ - Diagnostics: diags, - } -} - -// ReadResource implements providers.Interface. -func (stubConfiguredProvider) ReadResource(req providers.ReadResourceRequest) providers.ReadResourceResponse { - // For this one we'll just optimistically assume that the remote object - // hasn't changed. In many cases we'll fail calling PlanResourceChange - // right afterwards anyway, and even if not we'll get another opportunity - // to refresh on a future run once the provider configuration is fixed. - return providers.ReadResourceResponse{ - NewState: req.PriorState, - Private: req.Private, - } -} - -// Stop implements providers.Interface. -func (stubConfiguredProvider) Stop() error { - // This stub provider never actually does any real work, so there's nothing - // for us to stop. - return nil -} - -// UpgradeResourceState implements providers.Interface. -func (p stubConfiguredProvider) UpgradeResourceState(req providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse { - if p.unknown { - return providers.UpgradeResourceStateResponse{ - UpgradedState: cty.DynamicVal, - } - } - - // Ideally we'd just skip this altogether and echo back what the caller - // provided, but the request is in a different serialization format than - // the response and so only the real provider can deal with this one. - var diags tfdiags.Diagnostics - diags = diags.Append(tfdiags.AttributeValue( - tfdiags.Error, - "Provider configuration is invalid", - "Cannot decode the prior state for this resource instance because its provider configuration is invalid.", - nil, // nil attribute path means the overall configuration block - )) - return providers.UpgradeResourceStateResponse{ - Diagnostics: diags, - } -} - -// ValidateDataResourceConfig implements providers.Interface. -func (stubConfiguredProvider) ValidateDataResourceConfig(req providers.ValidateDataResourceConfigRequest) providers.ValidateDataResourceConfigResponse { - // We'll just optimistically assume the configuration is valid, so that - // we can progress to planning and return an error there instead. - return providers.ValidateDataResourceConfigResponse{ - Diagnostics: nil, - } -} - -// ValidateProviderConfig implements providers.Interface. -func (stubConfiguredProvider) ValidateProviderConfig(req providers.ValidateProviderConfigRequest) providers.ValidateProviderConfigResponse { - // It doesn't make sense to call this one on stubProvider, because - // we only use stubProvider for situations where ConfigureProvider failed - // on a real provider and we should already have called - // ValidateProviderConfig on that provider by then anyway. - return providers.ValidateProviderConfigResponse{ - PreparedConfig: req.Config, - Diagnostics: nil, - } -} - -// ValidateResourceConfig implements providers.Interface. -func (stubConfiguredProvider) ValidateResourceConfig(req providers.ValidateResourceConfigRequest) providers.ValidateResourceConfigResponse { - // We'll just optimistically assume the configuration is valid, so that - // we can progress to reading and return an error there instead. - return providers.ValidateResourceConfigResponse{ - Diagnostics: nil, - } -} diff --git a/internal/stacks/stackruntime/internal/stackeval/provider_test.go b/internal/stacks/stackruntime/internal/stackeval/provider_test.go index bb77a5e0d7..9371adc049 100644 --- a/internal/stacks/stackruntime/internal/stackeval/provider_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/provider_test.go @@ -10,13 +10,14 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/google/go-cmp/cmp" + "github.com/zclconf/go-cty-debug/ctydebug" + "github.com/zclconf/go-cty/cty" + "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/instances" "github.com/hashicorp/terraform/internal/stacks/stackaddrs" "github.com/hashicorp/terraform/internal/stacks/stackconfig/stackconfigtypes" "github.com/hashicorp/terraform/internal/tfdiags" - "github.com/zclconf/go-cty-debug/ctydebug" - "github.com/zclconf/go-cty/cty" ) func TestProviderCheckInstances(t *testing.T) { @@ -203,24 +204,18 @@ func TestProviderCheckInstances(t *testing.T) { // future plan after everything else has been applied first. provider := getProvider(ctx, t, main) gotVal, diags := provider.CheckForEachValue(ctx, InspectPhase) - assertMatchingDiag(t, diags, func(diag tfdiags.Diagnostic) bool { - return (diag.Severity() == tfdiags.Error && - diag.Description().Detail == "The for_each value must not be derived from values that will be determined only during the apply phase.") - }) + assertNoDiags(t, diags) wantVal := cty.UnknownVal(cty.Map(cty.EmptyObject)) if !wantVal.RawEquals(gotVal) { t.Errorf("wrong result\ngot: %#v\nwant: %#v", gotVal, wantVal) } - // When the for_each expression is invalid, CheckInstances should - // return nil to represent that we don't know enough to predict - // how many instances there are. This is a different result than - // when we know there are zero instances, which would be a non-nil - // empty map. - gotInsts, diags := provider.CheckInstances(ctx, InspectPhase) + // An unknown for-each expression should return a placeholder set + // of instances. + insts, diags := provider.CheckInstances(ctx, InspectPhase) assertNoDiags(t, diags) - if gotInsts != nil { - t.Errorf("wrong instances; want nil\n%#v", gotInsts) + if got, want := len(insts), 1; got != want { + t.Fatalf("wrong number of instances %d; want %d\n%#v", got, want, insts) } }) }) diff --git a/internal/stacks/stackruntime/internal/stackeval/stubs/configured.go b/internal/stacks/stackruntime/internal/stackeval/stubs/configured.go new file mode 100644 index 0000000000..fcfa9d3230 --- /dev/null +++ b/internal/stacks/stackruntime/internal/stackeval/stubs/configured.go @@ -0,0 +1,237 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: BUSL-1.1 + +package stubs + +import ( + "github.com/zclconf/go-cty/cty" + + "github.com/hashicorp/terraform/internal/providers" + "github.com/hashicorp/terraform/internal/tfdiags" +) + +// ConfiguredProvider is a placeholder provider used when ConfigureProvider +// on a real provider fails, so that callers can still receieve a usable client +// that will just produce placeholder values from its operations. +// +// This is essentially the cty.DynamicVal equivalent for providers.Interface, +// allowing us to follow our usual pattern that only one return path carries +// diagnostics up to the caller and all other codepaths just do their best +// to unwind with placeholder values. It's intended only for use in situations +// that would expect an already-configured provider, so it's incorrect to call +// [ConfigureProvider] on a value of this type. +// +// Some methods of this type explicitly return errors saying that the provider +// configuration was invalid, while others just optimistically do nothing at +// all. The general rule is that anything that would for a normal provider +// be expected to perform externally-visible side effects must return an error +// to be explicit that those side effects did not occur, but we can silently +// skip anything that is a Terraform-only detail. +// +// As usual with provider calls, the returned diagnostics must be annotated +// using [tfdiags.Diagnostics.InConfigBody] with the relevant configuration body +// so that they can be attributed to the appropriate configuration element. +type ConfiguredProvider struct { + // If unknown is true then the implementation will assume it's acting + // as a placeholder for a provider whose configuration isn't yet + // sufficiently known to be properly instantiated, which means that + // plan-time operations will return totally-unknown values. + // Otherwise any operation that is supposed to perform a side-effect + // will fail with an error saying that the provider configuration + // is invalid. + Unknown bool +} + +var _ providers.Interface = ConfiguredProvider{} + +// ApplyResourceChange implements providers.Interface. +func (ConfiguredProvider) ApplyResourceChange(req providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse { + var diags tfdiags.Diagnostics + diags = diags.Append(tfdiags.AttributeValue( + tfdiags.Error, + "Provider configuration is invalid", + "Cannot apply changes because this resource's associated provider configuration is invalid.", + nil, // nil attribute path means the overall configuration block + )) + return providers.ApplyResourceChangeResponse{ + Diagnostics: diags, + } +} + +func (ConfiguredProvider) CallFunction(providers.CallFunctionRequest) providers.CallFunctionResponse { + panic("can't call functions on the stub provider") +} + +// Close implements providers.Interface. +func (ConfiguredProvider) Close() error { + return nil +} + +// ConfigureProvider implements providers.Interface. +func (ConfiguredProvider) ConfigureProvider(req providers.ConfigureProviderRequest) providers.ConfigureProviderResponse { + // This provider is used only in situations where ConfigureProvider on + // a real provider fails and the recipient was expecting a configured + // provider, so it doesn't make sense to configure it. + panic("can't configure the stub provider") +} + +// GetProviderSchema implements providers.Interface. +func (ConfiguredProvider) GetProviderSchema() providers.GetProviderSchemaResponse { + return providers.GetProviderSchemaResponse{} +} + +// ImportResourceState implements providers.Interface. +func (p ConfiguredProvider) ImportResourceState(req providers.ImportResourceStateRequest) providers.ImportResourceStateResponse { + var diags tfdiags.Diagnostics + if p.Unknown { + diags = diags.Append(tfdiags.AttributeValue( + tfdiags.Error, + "Provider configuration is deferred", + "Cannot import an existing object into this resource because its associated provider configuration is deferred to a later operation due to unknown expansion.", + nil, // nil attribute path means the overall configuration block + )) + } else { + diags = diags.Append(tfdiags.AttributeValue( + tfdiags.Error, + "Provider configuration is invalid", + "Cannot import an existing object into this resource because its associated provider configuration is invalid.", + nil, // nil attribute path means the overall configuration block + )) + } + return providers.ImportResourceStateResponse{ + Diagnostics: diags, + } +} + +// MoveResourceState implements providers.Interface. +func (p ConfiguredProvider) MoveResourceState(req providers.MoveResourceStateRequest) providers.MoveResourceStateResponse { + var diags tfdiags.Diagnostics + if p.Unknown { + diags = diags.Append(tfdiags.AttributeValue( + tfdiags.Error, + "Provider configuration is deferred", + "Cannot move an existing object to this resource because its associated provider configuration is deferred to a later operation due to unknown expansion.", + nil, // nil attribute path means the overall configuration block + )) + } else { + diags = diags.Append(tfdiags.AttributeValue( + tfdiags.Error, + "Provider configuration is invalid", + "Cannot move an existing object to this resource because its associated provider configuration is invalid.", + nil, // nil attribute path means the overall configuration block + )) + } + return providers.MoveResourceStateResponse{ + Diagnostics: diags, + } +} + +// PlanResourceChange implements providers.Interface. +func (p ConfiguredProvider) PlanResourceChange(req providers.PlanResourceChangeRequest) providers.PlanResourceChangeResponse { + if p.Unknown { + return providers.PlanResourceChangeResponse{ + PlannedState: cty.DynamicVal, + } + } + var diags tfdiags.Diagnostics + diags = diags.Append(tfdiags.AttributeValue( + tfdiags.Error, + "Provider configuration is invalid", + "Cannot plan changes for this resource because its associated provider configuration is invalid.", + nil, // nil attribute path means the overall configuration block + )) + return providers.PlanResourceChangeResponse{ + Diagnostics: diags, + } +} + +// ReadDataSource implements providers.Interface. +func (p ConfiguredProvider) ReadDataSource(req providers.ReadDataSourceRequest) providers.ReadDataSourceResponse { + if p.Unknown { + return providers.ReadDataSourceResponse{ + State: cty.DynamicVal, + } + } + var diags tfdiags.Diagnostics + diags = diags.Append(tfdiags.AttributeValue( + tfdiags.Error, + "Provider configuration is invalid", + "Cannot read from this data source because its associated provider configuration is invalid.", + nil, // nil attribute path means the overall configuration block + )) + return providers.ReadDataSourceResponse{ + Diagnostics: diags, + } +} + +// ReadResource implements providers.Interface. +func (ConfiguredProvider) ReadResource(req providers.ReadResourceRequest) providers.ReadResourceResponse { + // For this one we'll just optimistically assume that the remote object + // hasn't changed. In many cases we'll fail calling PlanResourceChange + // right afterwards anyway, and even if not we'll get another opportunity + // to refresh on a future run once the provider configuration is fixed. + return providers.ReadResourceResponse{ + NewState: req.PriorState, + Private: req.Private, + } +} + +// Stop implements providers.Interface. +func (ConfiguredProvider) Stop() error { + // This stub provider never actually does any real work, so there's nothing + // for us to stop. + return nil +} + +// UpgradeResourceState implements providers.Interface. +func (p ConfiguredProvider) UpgradeResourceState(req providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse { + if p.Unknown { + return providers.UpgradeResourceStateResponse{ + UpgradedState: cty.DynamicVal, + } + } + + // Ideally we'd just skip this altogether and echo back what the caller + // provided, but the request is in a different serialization format than + // the response and so only the real provider can deal with this one. + var diags tfdiags.Diagnostics + diags = diags.Append(tfdiags.AttributeValue( + tfdiags.Error, + "Provider configuration is invalid", + "Cannot decode the prior state for this resource instance because its provider configuration is invalid.", + nil, // nil attribute path means the overall configuration block + )) + return providers.UpgradeResourceStateResponse{ + Diagnostics: diags, + } +} + +// ValidateDataResourceConfig implements providers.Interface. +func (ConfiguredProvider) ValidateDataResourceConfig(req providers.ValidateDataResourceConfigRequest) providers.ValidateDataResourceConfigResponse { + // We'll just optimistically assume the configuration is valid, so that + // we can progress to planning and return an error there instead. + return providers.ValidateDataResourceConfigResponse{ + Diagnostics: nil, + } +} + +// ValidateProviderConfig implements providers.Interface. +func (ConfiguredProvider) ValidateProviderConfig(req providers.ValidateProviderConfigRequest) providers.ValidateProviderConfigResponse { + // It doesn't make sense to call this one on stubProvider, because + // we only use stubProvider for situations where ConfigureProvider failed + // on a real provider and we should already have called + // ValidateProviderConfig on that provider by then anyway. + return providers.ValidateProviderConfigResponse{ + PreparedConfig: req.Config, + Diagnostics: nil, + } +} + +// ValidateResourceConfig implements providers.Interface. +func (ConfiguredProvider) ValidateResourceConfig(req providers.ValidateResourceConfigRequest) providers.ValidateResourceConfigResponse { + // We'll just optimistically assume the configuration is valid, so that + // we can progress to reading and return an error there instead. + return providers.ValidateResourceConfigResponse{ + Diagnostics: nil, + } +} diff --git a/internal/stacks/stackruntime/internal/stackeval/stubs/unknown.go b/internal/stacks/stackruntime/internal/stackeval/stubs/unknown.go new file mode 100644 index 0000000000..cbc76b663d --- /dev/null +++ b/internal/stacks/stackruntime/internal/stackeval/stubs/unknown.go @@ -0,0 +1,234 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: BUSL-1.1 + +package stubs + +import ( + "github.com/zclconf/go-cty/cty" + + "github.com/hashicorp/terraform/internal/moduletest/mocking" + "github.com/hashicorp/terraform/internal/providers" + "github.com/hashicorp/terraform/internal/tfdiags" +) + +var _ providers.Interface = (*unknownProvider)(nil) + +// unknownProvider is a stub provider that represents a provider that is +// unknown to the current Terraform configuration. This is used when a reference +// to a provider is unknown, or the provider itself has unknown instances. +// +// This provider wraps an unconfigured provider client, which is used to handle +// offline functionality. +type unknownProvider struct { + unconfiguredClient providers.Interface +} + +func UnknownProvider(unconfiguredClient providers.Interface) providers.Interface { + return &unknownProvider{ + unconfiguredClient: unconfiguredClient, + } +} + +func (u *unknownProvider) GetProviderSchema() providers.GetProviderSchemaResponse { + // This is offline functionality, so we can hand it off to the unconfigured + // client. + return u.unconfiguredClient.GetProviderSchema() +} + +func (u *unknownProvider) ValidateProviderConfig(request providers.ValidateProviderConfigRequest) providers.ValidateProviderConfigResponse { + // This is offline functionality, so we can hand it off to the unconfigured + // client. + return u.unconfiguredClient.ValidateProviderConfig(request) +} + +func (u *unknownProvider) ValidateResourceConfig(request providers.ValidateResourceConfigRequest) providers.ValidateResourceConfigResponse { + // This is offline functionality, so we can hand it off to the unconfigured + // client. + return u.unconfiguredClient.ValidateResourceConfig(request) +} + +func (u *unknownProvider) ValidateDataResourceConfig(request providers.ValidateDataResourceConfigRequest) providers.ValidateDataResourceConfigResponse { + // This is offline functionality, so we can hand it off to the unconfigured + // client. + return u.unconfiguredClient.ValidateDataResourceConfig(request) +} + +func (u *unknownProvider) UpgradeResourceState(request providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse { + // This is offline functionality, so we can hand it off to the unconfigured + // client. + return u.unconfiguredClient.UpgradeResourceState(request) +} + +func (u *unknownProvider) ConfigureProvider(request providers.ConfigureProviderRequest) providers.ConfigureProviderResponse { + // This shouldn't be called, we don't configure an unknown provider within + // stacks and Terraform Core shouldn't call this method. + panic("attempted to configure an unknown provider") +} + +func (u *unknownProvider) Stop() error { + // the underlying unconfiguredClient is managed elsewhere. + return nil +} + +func (u *unknownProvider) ReadResource(request providers.ReadResourceRequest) providers.ReadResourceResponse { + if request.ClientCapabilities.DeferralAllowed { + // For ReadResource, we'll just return the existing state and defer + // the operation. + return providers.ReadResourceResponse{ + NewState: request.PriorState, + Deferred: &providers.Deferred{ + Reason: providers.DeferredReasonProviderConfigUnknown, + }, + } + } + return providers.ReadResourceResponse{ + Diagnostics: []tfdiags.Diagnostic{ + tfdiags.AttributeValue( + tfdiags.Error, + "Provider configuration is unknown", + "Cannot read from this data source because its associated provider configuration is unknown.", + nil, // nil attribute path means the overall configuration block + ), + }, + } +} + +func (u *unknownProvider) PlanResourceChange(request providers.PlanResourceChangeRequest) providers.PlanResourceChangeResponse { + if request.ClientCapabilities.DeferralAllowed { + // For PlanResourceChange, we'll kind of abuse the mocking library to + // populate the computed values with unknown values so that future + // operations can still be used. + // + // PlanComputedValuesForResource populates the computed values with + // unknown values. This isn't the original use case for the mocking + // library, but it is doing exactly what we need it to do. + + schema := u.GetProviderSchema().ResourceTypes[request.TypeName] + val, diags := mocking.PlanComputedValuesForResource(request.ProposedNewState, schema.Block) + if diags.HasErrors() { + // All the potential errors we get back from this function are + // related to the user badly defining mocks. We should never hit + // this as we are just using the default behaviour. + panic(diags.Err()) + } + + return providers.PlanResourceChangeResponse{ + PlannedState: val, + Deferred: &providers.Deferred{ + Reason: providers.DeferredReasonProviderConfigUnknown, + }, + } + } + return providers.PlanResourceChangeResponse{ + Diagnostics: []tfdiags.Diagnostic{ + tfdiags.AttributeValue( + tfdiags.Error, + "Provider configuration is unknown", + "Cannot plan changes for this resource because its associated provider configuration is unknown.", + nil, // nil attribute path means the overall configuration block + ), + }, + } +} + +func (u *unknownProvider) ApplyResourceChange(_ providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse { + return providers.ApplyResourceChangeResponse{ + Diagnostics: []tfdiags.Diagnostic{ + tfdiags.AttributeValue( + tfdiags.Error, + "Provider configuration is unknown", + "Cannot apply changes for this resource because its associated provider configuration is unknown.", + nil, // nil attribute path means the overall configuration block + ), + }, + } +} + +func (u *unknownProvider) ImportResourceState(request providers.ImportResourceStateRequest) providers.ImportResourceStateResponse { + if request.ClientCapabilities.DeferralAllowed { + // For ImportResourceState, we don't have any config to work with and + // we don't know enough to work out which value the ID corresponds to. + // + // We'll just return an unknown value that corresponds to the correct + // type. Terraform should know how to handle this when it arrives + // alongside the deferred metadata. + + schema := u.GetProviderSchema().ResourceTypes[request.TypeName] + return providers.ImportResourceStateResponse{ + ImportedResources: []providers.ImportedResource{ + { + TypeName: request.TypeName, + State: cty.UnknownVal(schema.Block.ImpliedType()), + }, + }, + Deferred: &providers.Deferred{ + Reason: providers.DeferredReasonProviderConfigUnknown, + }, + } + } + return providers.ImportResourceStateResponse{ + Diagnostics: []tfdiags.Diagnostic{ + tfdiags.AttributeValue( + tfdiags.Error, + "Provider configuration is unknown", + "Cannot import an existing object into this resource because its associated provider configuration is unknown.", + nil, // nil attribute path means the overall configuration block + ), + }, + } +} + +func (u *unknownProvider) MoveResourceState(request providers.MoveResourceStateRequest) providers.MoveResourceStateResponse { + // This is offline functionality, so we can hand it off to the unconfigured + // client. + return u.unconfiguredClient.MoveResourceState(request) +} + +func (u *unknownProvider) ReadDataSource(request providers.ReadDataSourceRequest) providers.ReadDataSourceResponse { + if request.ClientCapabilities.DeferralAllowed { + // For ReadDataSource, we'll kind of abuse the mocking library to + // populate the computed values with unknown values so that future + // operations can still be used. + // + // PlanComputedValuesForResource populates the computed values with + // unknown values. This isn't the original use case for the mocking + // library, but it is doing exactly what we need it to do. + + schema := u.GetProviderSchema().ResourceTypes[request.TypeName] + val, diags := mocking.PlanComputedValuesForResource(request.Config, schema.Block) + if diags.HasErrors() { + // All the potential errors we get back from this function are + // related to the user badly defining mocks. We should never hit + // this as we are just using the default behaviour. + panic(diags.Err()) + } + + return providers.ReadDataSourceResponse{ + State: val, + Deferred: &providers.Deferred{ + Reason: providers.DeferredReasonProviderConfigUnknown, + }, + } + } + return providers.ReadDataSourceResponse{ + Diagnostics: []tfdiags.Diagnostic{ + tfdiags.AttributeValue( + tfdiags.Error, + "Provider configuration is unknown", + "Cannot read from this data source because its associated provider configuration is unknown.", + nil, // nil attribute path means the overall configuration block + ), + }, + } +} + +func (u *unknownProvider) CallFunction(request providers.CallFunctionRequest) providers.CallFunctionResponse { + // This is offline functionality, so we can hand it off to the unconfigured + // client. + return u.unconfiguredClient.CallFunction(request) +} + +func (u *unknownProvider) Close() error { + // the underlying unconfiguredClient is managed elsewhere. + return nil +} diff --git a/internal/stacks/stackruntime/plan_test.go b/internal/stacks/stackruntime/plan_test.go index 54ffb8ff43..0f5f3cfca7 100644 --- a/internal/stacks/stackruntime/plan_test.go +++ b/internal/stacks/stackruntime/plan_test.go @@ -2524,6 +2524,209 @@ func TestPlanWithDeferredComponentForEachOfInvalidType(t *testing.T) { } } +func TestPlanWithDeferredProviderForEach(t *testing.T) { + ctx := context.Background() + cfg := loadMainBundleConfigForTest(t, path.Join("with-single-input", "deferred-provider-for-each")) + + fakePlanTimestamp, err := time.Parse(time.RFC3339, "1991-08-25T20:57:08Z") + if err != nil { + t.Fatal(err) + } + + changesCh := make(chan stackplan.PlannedChange) + diagsCh := make(chan tfdiags.Diagnostic) + req := PlanRequest{ + Config: cfg, + ProviderFactories: map[addrs.Provider]providers.Factory{ + addrs.NewDefaultProvider("testing"): func() (providers.Interface, error) { + return stacks_testing_provider.NewProvider(), nil + }, + }, + ForcePlanTimestamp: &fakePlanTimestamp, + InputValues: map[stackaddrs.InputVariable]ExternalInputValue{ + {Name: "providers"}: { + Value: cty.UnknownVal(cty.Set(cty.String)), + DefRange: tfdiags.SourceRange{}, + }, + }, + DeferralAllowed: true, + } + resp := PlanResponse{ + PlannedChanges: changesCh, + Diagnostics: diagsCh, + } + go Plan(ctx, &req, &resp) + gotChanges, diags := collectPlanOutput(changesCh, diagsCh) + + reportDiagnosticsForTest(t, diags) + if len(diags) != 0 { + t.FailNow() // We reported the diags above + } + + sort.SliceStable(gotChanges, func(i, j int) bool { + return plannedChangeSortKey(gotChanges[i]) < plannedChangeSortKey(gotChanges[j]) + }) + + wantChanges := []stackplan.PlannedChange{ + &stackplan.PlannedChangeApplyable{ + Applyable: true, + }, + &stackplan.PlannedChangeComponentInstance{ + Addr: stackaddrs.Absolute( + stackaddrs.RootStackInstance, + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "known"}, + }), + PlanComplete: false, + PlanApplyable: false, + Action: plans.Create, + PlannedInputValues: map[string]plans.DynamicValue{ + "id": mustPlanDynamicValueDynamicType(cty.NullVal(cty.String)), + "input": mustPlanDynamicValueDynamicType(cty.StringVal("primary")), + }, + PlannedOutputValues: map[string]cty.Value{}, + PlannedCheckResults: &states.CheckResults{}, + PlanTimestamp: fakePlanTimestamp, + PlannedInputValueMarks: map[string][]cty.PathValueMarks{ + "id": nil, + "input": nil, + }, + }, + &stackplan.PlannedChangeDeferredResourceInstancePlanned{ + ResourceInstancePlanned: stackplan.PlannedChangeResourceInstancePlanned{ + ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ + Component: stackaddrs.Absolute( + stackaddrs.RootStackInstance, + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "known"}, + }, + ), + Item: addrs.AbsResourceInstanceObject{ + ResourceInstance: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + }, + }, + ProviderConfigAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: &plans.ResourceInstanceChangeSrc{ + Addr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + PrevRunAddr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + ProviderAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: plans.ChangeSrc{ + Action: plans.Create, + Before: mustPlanDynamicValue(cty.NullVal(cty.DynamicPseudoType)), + After: mustPlanDynamicValueSchema(cty.ObjectVal(map[string]cty.Value{ + "id": cty.UnknownVal(cty.String), + "value": cty.StringVal("primary"), + }), stacks_testing_provider.TestingResourceSchema), + }, + }, + Schema: stacks_testing_provider.TestingResourceSchema, + }, + DeferredReason: providers.DeferredReasonProviderConfigUnknown, + }, + &stackplan.PlannedChangeComponentInstance{ + Addr: stackaddrs.Absolute( + stackaddrs.RootStackInstance, + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "unknown"}, + Key: addrs.WildcardKey, + }), + PlanComplete: false, + PlanApplyable: false, + Action: plans.Create, + PlannedInputValues: map[string]plans.DynamicValue{ + "id": mustPlanDynamicValueDynamicType(cty.NullVal(cty.String)), + "input": mustPlanDynamicValueDynamicType(cty.StringVal("secondary")), + }, + PlannedOutputValues: map[string]cty.Value{}, + PlannedCheckResults: &states.CheckResults{}, + PlanTimestamp: fakePlanTimestamp, + PlannedInputValueMarks: map[string][]cty.PathValueMarks{ + "id": nil, + "input": nil, + }, + }, + &stackplan.PlannedChangeDeferredResourceInstancePlanned{ + ResourceInstancePlanned: stackplan.PlannedChangeResourceInstancePlanned{ + ResourceInstanceObjectAddr: stackaddrs.AbsResourceInstanceObject{ + Component: stackaddrs.Absolute( + stackaddrs.RootStackInstance, + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "unknown"}, + Key: addrs.WildcardKey, + }, + ), + Item: addrs.AbsResourceInstanceObject{ + ResourceInstance: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + }, + }, + ProviderConfigAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: &plans.ResourceInstanceChangeSrc{ + Addr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + PrevRunAddr: addrs.Resource{ + Mode: addrs.ManagedResourceMode, + Type: "testing_resource", + Name: "data", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + ProviderAddr: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.MustParseProviderSourceString("hashicorp/testing"), + }, + ChangeSrc: plans.ChangeSrc{ + Action: plans.Create, + Before: mustPlanDynamicValue(cty.NullVal(cty.DynamicPseudoType)), + After: mustPlanDynamicValueSchema(cty.ObjectVal(map[string]cty.Value{ + "id": cty.UnknownVal(cty.String), + "value": cty.StringVal("secondary"), + }), stacks_testing_provider.TestingResourceSchema), + }, + }, + Schema: stacks_testing_provider.TestingResourceSchema, + }, + DeferredReason: providers.DeferredReasonProviderConfigUnknown, + }, + &stackplan.PlannedChangeHeader{ + TerraformVersion: version.SemVer, + }, + &stackplan.PlannedChangeRootInputValue{ + Addr: stackaddrs.InputVariable{Name: "providers"}, + Value: cty.UnknownVal(cty.Set(cty.String)), + }, + } + + if diff := cmp.Diff(wantChanges, gotChanges, ctydebug.CmpOptions, cmpCollectionsSet); diff != "" { + t.Errorf("wrong changes\n%s", diff) + } +} + // collectPlanOutput consumes the two output channels emitting results from // a call to [Plan], and collects all of the data written to them before // returning once changesCh has been closed by the sender to indicate that diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/deferred-provider-for-each/deferred-provider-for-each.tfstack.hcl b/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/deferred-provider-for-each/deferred-provider-for-each.tfstack.hcl new file mode 100644 index 0000000000..73f143816b --- /dev/null +++ b/internal/stacks/stackruntime/testdata/mainbundle/test/with-single-input/deferred-provider-for-each/deferred-provider-for-each.tfstack.hcl @@ -0,0 +1,46 @@ +required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } +} + +variable "providers" { + type = set(string) +} + +provider "testing" "unknown" { + for_each = var.providers +} + +provider "testing" "known" { + for_each = toset(["primary"]) +} + +component "known" { + source = "../" + + providers = { + // We're testing a known component referencing an unknown provider here. + testing = provider.testing.unknown["primary"] + } + + inputs = { + input = "primary" + } +} + +component "unknown" { + source = "../" + + for_each = var.providers + + providers = { + // We're testing an unknown component referencing a known provider here. + testing = provider.testing.known[each.key] + } + + inputs = { + input = "secondary" + } +} From eeb2c5338509fe1c41c1776c7af065d5dbf1cc18 Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Tue, 4 Jun 2024 17:08:02 +0200 Subject: [PATCH 142/161] stacks: remove wildcard key from computed instances (#35284) * stacks: remove wildcard key from computed instances * fix compliation error --- .../internal/stackeval/component.go | 66 ++++++++++++------- .../internal/stackeval/component_instance.go | 8 ++- .../internal/stackeval/component_test.go | 46 +++++-------- .../internal/stackeval/for_each.go | 26 ++++---- .../internal/stackeval/for_each_test.go | 55 ++++++---------- .../internal/stackeval/input_variable.go | 9 ++- .../stackruntime/internal/stackeval/main.go | 35 ---------- .../internal/stackeval/main_apply.go | 12 +++- .../internal/stackeval/provider.go | 38 +++++------ .../stackeval/provider_instance_test.go | 6 +- .../internal/stackeval/provider_test.go | 28 ++++---- .../stackruntime/internal/stackeval/stack.go | 15 ++--- .../internal/stackeval/stack_call.go | 52 ++++++++++----- .../internal/stackeval/stack_call_test.go | 58 ++++++---------- .../internal/stackeval/testing_test.go | 14 ++++ .../internal/stackeval/walk_dynamic.go | 31 ++++++++- 16 files changed, 261 insertions(+), 238 deletions(-) diff --git a/internal/stacks/stackruntime/internal/stackeval/component.go b/internal/stacks/stackruntime/internal/stackeval/component.go index 0ff237fb5a..691de0f1b5 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component.go +++ b/internal/stacks/stackruntime/internal/stackeval/component.go @@ -26,8 +26,9 @@ type Component struct { main *Main - forEachValue perEvalPhase[promising.Once[withDiagnostics[cty.Value]]] - instances perEvalPhase[promising.Once[withDiagnostics[map[addrs.InstanceKey]*ComponentInstance]]] + forEachValue perEvalPhase[promising.Once[withDiagnostics[cty.Value]]] + instances perEvalPhase[promising.Once[withDiagnostics[instancesResult[*ComponentInstance]]]] + unknownInstance perEvalPhase[promising.Once[*ComponentInstance]] } var _ Plannable = (*Component)(nil) @@ -149,21 +150,21 @@ func (c *Component) CheckForEachValue(ctx context.Context, phase EvalPhase) (cty // for_each expression is invalid because we assume that the main plan walk // will visit the stack call directly and ask it to check itself, and that // call will be the one responsible for returning any diagnostics. -func (c *Component) Instances(ctx context.Context, phase EvalPhase) map[addrs.InstanceKey]*ComponentInstance { - ret, _ := c.CheckInstances(ctx, phase) - return ret +func (c *Component) Instances(ctx context.Context, phase EvalPhase) (map[addrs.InstanceKey]*ComponentInstance, bool) { + ret, unknown, _ := c.CheckInstances(ctx, phase) + return ret, unknown } -func (c *Component) CheckInstances(ctx context.Context, phase EvalPhase) (map[addrs.InstanceKey]*ComponentInstance, tfdiags.Diagnostics) { - return doOnceWithDiags( +func (c *Component) CheckInstances(ctx context.Context, phase EvalPhase) (map[addrs.InstanceKey]*ComponentInstance, bool, tfdiags.Diagnostics) { + result, diags := doOnceWithDiags( ctx, c.instances.For(phase), c.main, - func(ctx context.Context) (map[addrs.InstanceKey]*ComponentInstance, tfdiags.Diagnostics) { + func(ctx context.Context) (instancesResult[*ComponentInstance], tfdiags.Diagnostics) { var diags tfdiags.Diagnostics forEachVal, forEachValueDiags := c.CheckForEachValue(ctx, phase) diags = diags.Append(forEachValueDiags) if diags.HasErrors() { - return nil, diags + return instancesResult[*ComponentInstance]{}, diags } allowUnknowns := true @@ -174,12 +175,12 @@ func (c *Component) CheckInstances(ctx context.Context, phase EvalPhase) (map[ad allowUnknowns = c.main.PlanningOpts().DeferralAllowed } - ret := instancesMap(forEachVal, func(ik addrs.InstanceKey, rd instances.RepetitionData) *ComponentInstance { + result := instancesMap(forEachVal, func(ik addrs.InstanceKey, rd instances.RepetitionData) *ComponentInstance { return newComponentInstance(c, ik, rd) }, allowUnknowns) - addrs := make([]stackaddrs.AbsComponentInstance, 0, len(ret)) - for _, ci := range ret { + addrs := make([]stackaddrs.AbsComponentInstance, 0, len(result.insts)) + for _, ci := range result.insts { addrs = append(addrs, ci.Addr()) } @@ -189,14 +190,27 @@ func (c *Component) CheckInstances(ctx context.Context, phase EvalPhase) (map[ad InstanceAddrs: addrs, }) - return ret, diags + return result, diags }, ) + return result.insts, result.unknown, diags +} + +func (c *Component) UnknownInstance(ctx context.Context, phase EvalPhase) *ComponentInstance { + inst, err := c.unknownInstance.For(PlanPhase).Do(ctx, func(ctx context.Context) (*ComponentInstance, error) { + return newComponentInstance(c, addrs.WildcardKey, instances.UnknownForEachRepetitionData(c.ForEachValue(ctx, phase).Type())), nil + }) + if err != nil { + // Since we never return an error from the function we pass to Do, + // this should never happen. + panic(err) + } + return inst } func (c *Component) ResultValue(ctx context.Context, phase EvalPhase) cty.Value { decl := c.Declaration(ctx) - insts := c.Instances(ctx, phase) + insts, unknown := c.Instances(ctx, phase) switch { case decl.ForEach != nil: @@ -205,12 +219,18 @@ func (c *Component) ResultValue(ctx context.Context, phase EvalPhase) cty.Value // exact type constraints for its output values and so each instance of // a component can potentially produce a different object type. - if _, exists := insts[addrs.WildcardKey]; exists || insts == nil { - // If we don't even know what instances we have then we can't - // predict anything about our result. + if unknown { + // We can't predict the result if we don't know what the instances + // are, so we'll return dynamic. return cty.DynamicVal } + if insts == nil { + // Then we errored during instance calculation, this should have + // been caught before we got here. + return cty.NilVal + } + // We expect that the instances all have string keys, which will // become the keys of a map that we're returning. elems := make(map[string]cty.Value, len(insts)) @@ -254,7 +274,7 @@ func (c *Component) PlanIsComplete(ctx context.Context) bool { if !c.main.Planning() { panic("PlanIsComplete used when not in the planning phase") } - insts := c.Instances(ctx, PlanPhase) + insts, unknown := c.Instances(ctx, PlanPhase) if insts == nil { // Suggests that the configuration was not even valid enough to // decide what the instances are, so we'll return false to be @@ -262,7 +282,7 @@ func (c *Component) PlanIsComplete(ctx context.Context) bool { return false } - if insts[addrs.WildcardKey] != nil { + if unknown { // If the wildcard key is used the instance originates from an unknown // for_each value, which means the result is unknown. return false @@ -295,7 +315,7 @@ func (c *Component) ExprReferenceValue(ctx context.Context, phase EvalPhase) cty func (c *Component) checkValid(ctx context.Context, phase EvalPhase) tfdiags.Diagnostics { var diags tfdiags.Diagnostics - _, moreDiags := c.CheckInstances(ctx, phase) + _, _, moreDiags := c.CheckInstances(ctx, phase) diags = diags.Append(moreDiags) return diags @@ -343,7 +363,9 @@ func (c *Component) ApplySuccessful(ctx context.Context) bool { // Apply is successful if all of our instances fully completed their // apply phases. - for _, inst := range c.Instances(ctx, ApplyPhase) { + insts, _ := c.Instances(ctx, ApplyPhase) + + for _, inst := range insts { result := inst.ApplyResult(ctx) if result == nil || !result.Complete { return false @@ -364,7 +386,7 @@ func (c *Component) reportNamedPromises(cb func(id promising.PromiseID, name str name := c.Addr().String() instsName := name + " instances" forEachName := name + " for_each" - c.instances.Each(func(ep EvalPhase, o *promising.Once[withDiagnostics[map[addrs.InstanceKey]*ComponentInstance]]) { + c.instances.Each(func(ep EvalPhase, o *promising.Once[withDiagnostics[instancesResult[*ComponentInstance]]]) { cb(o.PromiseID(), instsName) }) // FIXME: We should call reportNamedPromises on the individual diff --git a/internal/stacks/stackruntime/internal/stackeval/component_instance.go b/internal/stacks/stackruntime/internal/stackeval/component_instance.go index 3295ada0f7..a7669b42b6 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_instance.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_instance.go @@ -422,7 +422,13 @@ func (c *ComponentInstance) neededProviderClients(ctx context.Context, phase Eva if provider == nil { continue } - insts := provider.Instances(ctx, phase) + insts, unknown := provider.Instances(ctx, phase) + if unknown { + // an unknown provider should have been added to the unknown + // providers and not the known providers, so this is a bug if we get + // here. + panic(fmt.Errorf("provider %s returned unknown instances", callerAddr)) + } if insts == nil { continue } diff --git a/internal/stacks/stackruntime/internal/stackeval/component_test.go b/internal/stacks/stackruntime/internal/stackeval/component_test.go index 33d7c6c36b..78f48c12dd 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_test.go @@ -50,8 +50,9 @@ func TestComponentCheckInstances(t *testing.T) { t.Fatalf("unexpected for_each value\ngot: %#v\nwant: cty.NilVal", forEachVal) } - insts, diags := component.CheckInstances(ctx, InspectPhase) + insts, unknown, diags := component.CheckInstances(ctx, InspectPhase) assertNoDiags(t, diags) + assertFalse(t, unknown) if got, want := len(insts), 1; got != want { t.Fatalf("wrong number of instances %d; want %d\n%#v", got, want, insts) } @@ -80,8 +81,9 @@ func TestComponentCheckInstances(t *testing.T) { if got, want := forEachVal, cty.MapValEmpty(cty.EmptyObject); !want.RawEquals(got) { t.Fatalf("unexpected for_each value\ngot: %#v\nwant: %#v", got, want) } - insts, diags := component.CheckInstances(ctx, InspectPhase) + insts, unknown, diags := component.CheckInstances(ctx, InspectPhase) assertNoDiags(t, diags) + assertFalse(t, unknown) if got, want := len(insts), 0; got != want { t.Fatalf("wrong number of instances %d; want %d\n%#v", got, want, insts) } @@ -117,8 +119,9 @@ func TestComponentCheckInstances(t *testing.T) { if !wantForEachVal.RawEquals(gotForEachVal) { t.Fatalf("unexpected for_each value\ngot: %#v\nwant: %#v", gotForEachVal, wantForEachVal) } - insts, diags := component.CheckInstances(ctx, InspectPhase) + insts, unknown, diags := component.CheckInstances(ctx, InspectPhase) assertNoDiags(t, diags) + assertFalse(t, unknown) if got, want := len(insts), 2; got != want { t.Fatalf("wrong number of instances %d; want %d\n%#v", got, want, insts) } @@ -192,8 +195,8 @@ func TestComponentCheckInstances(t *testing.T) { // When the for_each expression is invalid, CheckInstances should // return nil and diagnostics. - gotInsts, diags := component.CheckInstances(ctx, InspectPhase) - + gotInsts, unknown, diags := component.CheckInstances(ctx, InspectPhase) + assertFalse(t, unknown) if gotInsts != nil { t.Fatalf("unexpected instances\ngot: %#v\nwant: nil", gotInsts) } @@ -222,23 +225,12 @@ func TestComponentCheckInstances(t *testing.T) { // When the for_each expression is unknown, CheckInstances should // return a single instance with dynamic values in the repetition data. - gotInsts, diags := component.CheckInstances(ctx, InspectPhase) + gotInsts, unknown, diags := component.CheckInstances(ctx, InspectPhase) assertNoDiags(t, diags) - if got, want := len(gotInsts), 1; got != want { + assertTrue(t, unknown) + if got, want := len(gotInsts), 0; got != want { t.Fatalf("wrong number of instances %d; want %d\n%#v", got, want, gotInsts) } - - if gotInsts[addrs.WildcardKey] == nil { - t.Fatalf("missing expected addrs.WildcardKey instance\n%#v", gotInsts) - } - - if gotInsts[addrs.WildcardKey].repetition.EachKey.IsKnown() { - t.Errorf("EachKey should be unknown, but is known") - } - - if gotInsts[addrs.WildcardKey].repetition.EachValue.IsKnown() { - t.Errorf("EachValue should be unknown, but is known") - } }) }) @@ -347,10 +339,9 @@ func TestComponentResultValue(t *testing.T) { component := getComponent(ctx, t, main) got := component.ResultValue(ctx, InspectPhase) - // When the for_each expression is invalid, the result value - // is unknown so we can use it as a placeholder for partial - // downstream checking. - want := cty.DynamicVal + // When the for_each expression is null, the result value should + // be a cty.NilVal. + want := cty.NilVal // FIXME: the cmp transformer ctydebug.CmpOptions seems to find // this particular pair of values troubling, causing it to get // into an infinite recursion. For now we'll just use RawEquals, @@ -370,10 +361,9 @@ func TestComponentResultValue(t *testing.T) { component := getComponent(ctx, t, main) got := component.ResultValue(ctx, InspectPhase) - // When the for_each expression is invalid, the result value - // is unknown so we can use it as a placeholder for partial - // downstream checking. - want := cty.DynamicVal + // When the for_each expression is null, the result value should + // be a cty.NilVal. + want := cty.NilVal // FIXME: the cmp transformer ctydebug.CmpOptions seems to find // this particular pair of values troubling, causing it to get // into an infinite recursion. For now we'll just use RawEquals, @@ -394,7 +384,7 @@ func TestComponentResultValue(t *testing.T) { component := getComponent(ctx, t, main) got := component.ResultValue(ctx, InspectPhase) // When the for_each expression is unknown, the result value - // is aa dynamic instance. + // is a dynamic instance. want := cty.DynamicVal if diff := cmp.Diff(want, got, ctydebug.CmpOptions); diff != "" { diff --git a/internal/stacks/stackruntime/internal/stackeval/for_each.go b/internal/stacks/stackruntime/internal/stackeval/for_each.go index db410c5f31..47442a2b6f 100644 --- a/internal/stacks/stackruntime/internal/stackeval/for_each.go +++ b/internal/stacks/stackruntime/internal/stackeval/for_each.go @@ -8,13 +8,19 @@ import ( "fmt" "github.com/hashicorp/hcl/v2" + "github.com/zclconf/go-cty/cty" + "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/instances" "github.com/hashicorp/terraform/internal/lang/marks" "github.com/hashicorp/terraform/internal/tfdiags" - "github.com/zclconf/go-cty/cty" ) +type instancesResult[T any] struct { + insts map[addrs.InstanceKey]T + unknown bool +} + // evaluateForEachExpr deals with all of the for_each evaluation concerns // that are common across all uses of for_each in all evaluation phases. // @@ -147,20 +153,16 @@ func evaluateForEachExpr(ctx context.Context, expr hcl.Expression, phase EvalPha // If maybeForEach value is non-nil but not a valid value produced by // [evaluateForEachExpr] then the behavior is unpredictable, including the // possibility of a panic. -func instancesMap[T any](maybeForEachVal cty.Value, makeInst func(addrs.InstanceKey, instances.RepetitionData) T, allowsUnknown bool) map[addrs.InstanceKey]T { +func instancesMap[T any](maybeForEachVal cty.Value, makeInst func(addrs.InstanceKey, instances.RepetitionData) T, allowsUnknown bool) instancesResult[T] { switch { case maybeForEachVal == cty.NilVal: // No for_each expression at all, then. We have exactly one instance // without an instance key and with no repetition data. - return noForEachInstancesMap(makeInst) + return instancesResult[T]{noForEachInstancesMap(makeInst), false} case !maybeForEachVal.IsKnown(): // This is temporary to gradually rollout support for unknown for_each values - if allowsUnknown { - return unknownForEachInstancesMap(maybeForEachVal.Type(), makeInst) - } else { - return nil - } + return instancesResult[T]{nil, allowsUnknown} default: // Otherwise we should be able to assume the value is valid per the @@ -173,7 +175,7 @@ func instancesMap[T any](maybeForEachVal cty.Value, makeInst func(addrs.Instance // this case, even if there are zero elements in it, because a nil map // represents an _invalid_ for_each expression (handled above). // forEachInstancesMap guarantees to never return a nil map. - return forEachInstancesMap(maybeForEachVal, makeInst) + return instancesResult[T]{forEachInstancesMap(maybeForEachVal, makeInst), false} } } @@ -242,12 +244,6 @@ func noForEachInstancesMap[T any](makeInst func(addrs.InstanceKey, instances.Rep } } -func unknownForEachInstancesMap[T any](ty cty.Type, makeInst func(addrs.InstanceKey, instances.RepetitionData) T) map[addrs.InstanceKey]T { - return map[addrs.InstanceKey]T{ - addrs.WildcardKey: makeInst(addrs.WildcardKey, instances.UnknownForEachRepetitionData(ty)), - } -} - // markSafeLengthInt allows calling LengthInt on marked values safely func markSafeLengthInt(val cty.Value) int { v, _ := val.UnmarkDeep() diff --git a/internal/stacks/stackruntime/internal/stackeval/for_each_test.go b/internal/stacks/stackruntime/internal/stackeval/for_each_test.go index d3d93c3cf8..b45d5b3c3c 100644 --- a/internal/stacks/stackruntime/internal/stackeval/for_each_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/for_each_test.go @@ -11,12 +11,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/hcltest" + "github.com/zclconf/go-cty-debug/ctydebug" + "github.com/zclconf/go-cty/cty" + "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/instances" "github.com/hashicorp/terraform/internal/lang/marks" "github.com/hashicorp/terraform/internal/tfdiags" - "github.com/zclconf/go-cty-debug/ctydebug" - "github.com/zclconf/go-cty/cty" ) func TestEvaluateForEachExpr(t *testing.T) { @@ -199,6 +200,7 @@ func TestInstancesMap(t *testing.T) { // This is a temporary nusiance while we gradually rollout support for // unknown for_each values. type Expectation struct { + UnknownValue bool UnknownForEachSupported map[addrs.InstanceKey]InstanceObj UnknownForEachUnsupported map[addrs.InstanceKey]InstanceObj } @@ -247,48 +249,27 @@ func TestInstancesMap(t *testing.T) { "unknown empty object", cty.UnknownVal(cty.EmptyObject), Expectation{ - UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ - addrs.WildcardKey: { - Key: addrs.WildcardKey, - Rep: instances.RepetitionData{ - EachKey: cty.UnknownVal(cty.String), - EachValue: cty.DynamicVal, - }, - }, - }, - UnknownForEachUnsupported: nil, // a nil map means "unknown" for this function + UnknownValue: true, + UnknownForEachSupported: nil, + UnknownForEachUnsupported: nil, }, }, { "unknown bool map", cty.UnknownVal(cty.Map(cty.Bool)), Expectation{ - UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ - addrs.WildcardKey: { - Key: addrs.WildcardKey, - Rep: instances.RepetitionData{ - EachKey: cty.UnknownVal(cty.String), - EachValue: cty.UnknownVal(cty.Bool), - }, - }, - }, - UnknownForEachUnsupported: nil, // a nil map means "unknown" for this function + UnknownValue: true, + UnknownForEachSupported: nil, + UnknownForEachUnsupported: nil, }, }, { "unknown set of strings", cty.UnknownVal(cty.Set(cty.String)), Expectation{ - UnknownForEachSupported: map[addrs.InstanceKey]InstanceObj{ - addrs.WildcardKey: { - Key: addrs.WildcardKey, - Rep: instances.RepetitionData{ - EachKey: cty.UnknownVal(cty.String), - EachValue: cty.UnknownVal(cty.String), - }, - }, - }, - UnknownForEachUnsupported: nil, // a nil map means "unknown" for this function + UnknownValue: true, + UnknownForEachSupported: nil, + UnknownForEachUnsupported: nil, }, }, @@ -472,15 +453,17 @@ func TestInstancesMap(t *testing.T) { t.Run(test.Name, func(t *testing.T) { t.Run("unknown for_each supported", func(t *testing.T) { got := instancesMap(test.Input, makeObj, true) - - if diff := cmp.Diff(test.Want.UnknownForEachSupported, got, ctydebug.CmpOptions); diff != "" { + if got.unknown != test.Want.UnknownValue { + t.Errorf("wrong unknown value\ngot: %#v\nwant: %#v", got.unknown, test.Want.UnknownValue) + } + if diff := cmp.Diff(test.Want.UnknownForEachSupported, got.insts, ctydebug.CmpOptions); diff != "" { t.Errorf("wrong result\ninput: %#v\n%s", test.Input, diff) } }) t.Run("unknown for_each unsupported", func(t *testing.T) { got := instancesMap(test.Input, makeObj, false) - - if diff := cmp.Diff(test.Want.UnknownForEachUnsupported, got, ctydebug.CmpOptions); diff != "" { + assertFalse(t, got.unknown) + if diff := cmp.Diff(test.Want.UnknownForEachUnsupported, got.insts, ctydebug.CmpOptions); diff != "" { t.Errorf("wrong result\ninput: %#v\n%s", test.Input, diff) } }) diff --git a/internal/stacks/stackruntime/internal/stackeval/input_variable.go b/internal/stacks/stackruntime/internal/stackeval/input_variable.go index 7c66cf5648..926671a7b0 100644 --- a/internal/stacks/stackruntime/internal/stackeval/input_variable.go +++ b/internal/stacks/stackruntime/internal/stackeval/input_variable.go @@ -84,10 +84,13 @@ func (v *InputVariable) DefinedByStackCallInstance(ctx context.Context, phase Ev // actually exist, which is odd but we'll tolerate it. return nil } - callInsts := call.Instances(ctx, phase) + callInsts, unknown := call.Instances(ctx, phase) + if unknown { + // Return our static unknown instance for this variable. + return call.UnknownInstance(ctx, phase) + } if callInsts == nil { - // Could get here if the call's for_each is unknown or invalid, - // in which case we'll assume unknown. + // Could get here if the call's for_each is invalid. return nil } diff --git a/internal/stacks/stackruntime/internal/stackeval/main.go b/internal/stacks/stackruntime/internal/stackeval/main.go index 4aab455a81..b524b6cbb8 100644 --- a/internal/stacks/stackruntime/internal/stackeval/main.go +++ b/internal/stacks/stackruntime/internal/stackeval/main.go @@ -16,7 +16,6 @@ import ( "github.com/hashicorp/terraform/internal/addrs" fileProvisioner "github.com/hashicorp/terraform/internal/builtin/provisioners/file" remoteExecProvisioner "github.com/hashicorp/terraform/internal/builtin/provisioners/remote-exec" - "github.com/hashicorp/terraform/internal/instances" "github.com/hashicorp/terraform/internal/promising" "github.com/hashicorp/terraform/internal/provisioners" "github.com/hashicorp/terraform/internal/stacks/stackaddrs" @@ -387,40 +386,6 @@ func (m *Main) ProviderRefTypes() map[addrs.Provider]cty.Type { return m.config.ProviderRefTypes } -// ProviderInstance returns the provider instance with the given address, -// or nil if there is no such provider instance. -// -// This function needs to evaluate the for_each expression of each stack along -// the path and of a final multi-instance provider configuration, and so will -// block on whatever those expressions depend on. -// -// If any of the objects along the path have an as-yet-unknown set of -// instances, this function will optimistically return a non-nil provider -// configuration but further operations with that configuration are likely -// to return unknown values themselves. -func (m *Main) ProviderInstance(ctx context.Context, addr stackaddrs.AbsProviderConfigInstance, phase EvalPhase) *ProviderInstance { - stack := m.Stack(ctx, addr.Stack, phase) - if stack == nil { - return nil - } - provider := stack.Provider(ctx, addr.Item.ProviderConfig) - if provider == nil { - return nil - } - insts := provider.Instances(ctx, phase) - if insts == nil { - // A nil result means that the for_each expression is unknown, and - // so we must optimistically return an instance referring to the - // given address which will then presumably yield unknown values - // of some kind when used. - return newProviderInstance(provider, addr.Item.Key, instances.RepetitionData{ - EachKey: cty.UnknownVal(cty.String), - EachValue: cty.DynamicVal, - }) - } - return insts[addr.Item.Key] -} - // PreviousProviderInstances fetches the set of providers that are required // based on the current plan or state file. They are previous in the sense that // they're not based on the current config. So if a provider has been removed diff --git a/internal/stacks/stackruntime/internal/stackeval/main_apply.go b/internal/stacks/stackruntime/internal/stackeval/main_apply.go index b940e40706..2dccf8709a 100644 --- a/internal/stacks/stackruntime/internal/stackeval/main_apply.go +++ b/internal/stacks/stackruntime/internal/stackeval/main_apply.go @@ -100,7 +100,17 @@ func ApplyPlan(ctx context.Context, config *stackconfig.Config, rawPlan []*anypb stack := main.Stack(ctx, addr.Stack, ApplyPhase) component := stack.Component(ctx, addr.Item.Component) - insts := component.Instances(ctx, ApplyPhase) + + insts, unknown := component.Instances(ctx, ApplyPhase) + if unknown { + // an unknown instance should not have been applied + // during the apply phase, so we should not have + // reached this point. + log.Printf("[ERROR] stackeval: %s has planned changes, but was unknown so should not have been applied", addr) + span.SetStatus(codes.Error, "unknown component") + return nil, nil + } + inst, ok := insts[addr.Item.Key] if !ok { // If we managed to plan a change for this instance diff --git a/internal/stacks/stackruntime/internal/stackeval/provider.go b/internal/stacks/stackruntime/internal/stackeval/provider.go index 617ae44ec8..e204c50442 100644 --- a/internal/stacks/stackruntime/internal/stackeval/provider.go +++ b/internal/stacks/stackruntime/internal/stackeval/provider.go @@ -28,7 +28,7 @@ type Provider struct { main *Main forEachValue perEvalPhase[promising.Once[withDiagnostics[cty.Value]]] - instances perEvalPhase[promising.Once[withDiagnostics[map[addrs.InstanceKey]*ProviderInstance]]] + instances perEvalPhase[promising.Once[withDiagnostics[instancesResult[*ProviderInstance]]]] } func newProvider(main *Main, addr stackaddrs.AbsProviderConfig, config *stackconfig.ProviderConfig) *Provider { @@ -156,25 +156,18 @@ func (p *Provider) CheckForEachValue(ctx context.Context, phase EvalPhase) (cty. // for_each expression is invalid because we assume that the main plan walk // will visit the stack call directly and ask it to check itself, and that // call will be the one responsible for returning any diagnostics. -func (p *Provider) Instances(ctx context.Context, phase EvalPhase) map[addrs.InstanceKey]*ProviderInstance { - ret, _ := p.CheckInstances(ctx, phase) - return ret +func (p *Provider) Instances(ctx context.Context, phase EvalPhase) (map[addrs.InstanceKey]*ProviderInstance, bool) { + ret, unknown, _ := p.CheckInstances(ctx, phase) + return ret, unknown } -func (p *Provider) CheckInstances(ctx context.Context, phase EvalPhase) (map[addrs.InstanceKey]*ProviderInstance, tfdiags.Diagnostics) { - return doOnceWithDiags( +func (p *Provider) CheckInstances(ctx context.Context, phase EvalPhase) (map[addrs.InstanceKey]*ProviderInstance, bool, tfdiags.Diagnostics) { + result, diags := doOnceWithDiags( ctx, p.instances.For(phase), p.main, - func(ctx context.Context) (map[addrs.InstanceKey]*ProviderInstance, tfdiags.Diagnostics) { - - // Since we can't differentiate between a truly unknown foreach and - // an invalid foreach, we must check the diagnostics from the for - // each value. - + func(ctx context.Context) (instancesResult[*ProviderInstance], tfdiags.Diagnostics) { forEachVal, diags := p.CheckForEachValue(ctx, phase) if diags.HasErrors() { - // We expect the caller to have already checked the for_each - // diagnostics and we don't want to return duplicates. - return nil, nil + return instancesResult[*ProviderInstance]{}, diags } allowUnknowns := true @@ -190,20 +183,27 @@ func (p *Provider) CheckInstances(ctx context.Context, phase EvalPhase) (map[add }, allowUnknowns), diags }, ) + return result.insts, result.unknown, diags } // ExprReferenceValue implements Referenceable, returning a value containing // one or more values that act as references to instances of the provider. func (p *Provider) ExprReferenceValue(ctx context.Context, phase EvalPhase) cty.Value { decl := p.Declaration(ctx) - insts := p.Instances(ctx, phase) + insts, unknown := p.Instances(ctx, phase) refType := p.InstRefValueType(ctx) switch { case decl.ForEach != nil: - if _, ok := insts[addrs.WildcardKey]; ok || insts == nil { + if unknown { return cty.UnknownVal(cty.Map(refType)) } + + if insts == nil { + // Then we errored during instance calculation, this should have + // been caught before we got here. + return cty.NilVal + } elems := make(map[string]cty.Value, len(insts)) for instKey := range insts { k, ok := instKey.(addrs.StringKey) @@ -241,7 +241,7 @@ func (p *Provider) checkValid(ctx context.Context, phase EvalPhase) tfdiags.Diag _, moreDiags := p.CheckForEachValue(ctx, phase) diags = diags.Append(moreDiags) - _, moreDiags = p.CheckInstances(ctx, phase) + _, _, moreDiags = p.CheckInstances(ctx, phase) diags = diags.Append(moreDiags) // Everything else is instance-specific and so the plan walk driver must // call p.Instances and ask each instance to plan itself. @@ -288,7 +288,7 @@ func (p *Provider) reportNamedPromises(cb func(id promising.PromiseID, name stri p.forEachValue.Each(func(ep EvalPhase, o *promising.Once[withDiagnostics[cty.Value]]) { cb(o.PromiseID(), forEachName) }) - p.instances.Each(func(ep EvalPhase, o *promising.Once[withDiagnostics[map[addrs.InstanceKey]*ProviderInstance]]) { + p.instances.Each(func(ep EvalPhase, o *promising.Once[withDiagnostics[instancesResult[*ProviderInstance]]]) { cb(o.PromiseID(), instsName) }) // FIXME: We should call reportNamedPromises on the individual diff --git a/internal/stacks/stackruntime/internal/stackeval/provider_instance_test.go b/internal/stacks/stackruntime/internal/stackeval/provider_instance_test.go index 84f67fd56c..255d1839c0 100644 --- a/internal/stacks/stackruntime/internal/stackeval/provider_instance_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/provider_instance_test.go @@ -68,7 +68,8 @@ func TestProviderInstanceCheckProviderArgs(t *testing.T) { if provider == nil { t.Fatal("no provider.foo.bar is available") } - insts := provider.Instances(ctx, InspectPhase) + insts, unknown := provider.Instances(ctx, InspectPhase) + assertFalse(t, unknown) inst, ok := insts[addrs.NoKey] if !ok { t.Fatal("missing NoKey instance of provider.foo.bar") @@ -341,7 +342,8 @@ func TestProviderInstanceCheckClient(t *testing.T) { if provider == nil { t.Fatal("no provider.foo.bar is available") } - insts := provider.Instances(ctx, InspectPhase) + insts, unknown := provider.Instances(ctx, InspectPhase) + assertFalse(t, unknown) inst, ok := insts[addrs.NoKey] if !ok { t.Fatal("missing NoKey instance of provider.foo.bar") diff --git a/internal/stacks/stackruntime/internal/stackeval/provider_test.go b/internal/stacks/stackruntime/internal/stackeval/provider_test.go index 9371adc049..df14a86dae 100644 --- a/internal/stacks/stackruntime/internal/stackeval/provider_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/provider_test.go @@ -47,8 +47,9 @@ func TestProviderCheckInstances(t *testing.T) { t.Fatalf("unexpected for_each value\ngot: %#v\nwant: cty.NilVal", forEachVal) } - insts, diags := provider.CheckInstances(ctx, InspectPhase) + insts, unknown, diags := provider.CheckInstances(ctx, InspectPhase) assertNoDiags(t, diags) + assertFalse(t, unknown) if got, want := len(insts), 1; got != want { t.Fatalf("wrong number of instances %d; want %d\n%#v", got, want, insts) } @@ -77,8 +78,9 @@ func TestProviderCheckInstances(t *testing.T) { if got, want := forEachVal, cty.MapValEmpty(cty.EmptyObject); !want.RawEquals(got) { t.Fatalf("unexpected for_each value\ngot: %#v\nwant: %#v", got, want) } - insts, diags := provider.CheckInstances(ctx, InspectPhase) + insts, unknown, diags := provider.CheckInstances(ctx, InspectPhase) assertNoDiags(t, diags) + assertFalse(t, unknown) if got, want := len(insts), 0; got != want { t.Fatalf("wrong number of instances %d; want %d\n%#v", got, want, insts) } @@ -110,8 +112,9 @@ func TestProviderCheckInstances(t *testing.T) { if !wantForEachVal.RawEquals(gotForEachVal) { t.Fatalf("unexpected for_each value\ngot: %#v\nwant: %#v", gotForEachVal, wantForEachVal) } - insts, diags := provider.CheckInstances(ctx, InspectPhase) + insts, unknown, diags := provider.CheckInstances(ctx, InspectPhase) assertNoDiags(t, diags) + assertFalse(t, unknown) if got, want := len(insts), 2; got != want { t.Fatalf("wrong number of instances %d; want %d\n%#v", got, want, insts) } @@ -184,8 +187,12 @@ func TestProviderCheckInstances(t *testing.T) { // how many instances there are. This is a different result than // when we know there are zero instances, which would be a non-nil // empty map. - gotInsts, diags := provider.CheckInstances(ctx, InspectPhase) - assertNoDiags(t, diags) + gotInsts, unknown, diags := provider.CheckInstances(ctx, InspectPhase) + assertFalse(t, unknown) + assertMatchingDiag(t, diags, func(diag tfdiags.Diagnostic) bool { + return (diag.Severity() == tfdiags.Error && + diag.Description().Detail == "The for_each expression must produce either a map of any type or a set of strings. The keys of the map or the set elements will serve as unique identifiers for multiple instances of this provider.") + }) if gotInsts != nil { t.Errorf("wrong instances; want nil\n%#v", gotInsts) } @@ -210,11 +217,10 @@ func TestProviderCheckInstances(t *testing.T) { t.Errorf("wrong result\ngot: %#v\nwant: %#v", gotVal, wantVal) } - // An unknown for-each expression should return a placeholder set - // of instances. - insts, diags := provider.CheckInstances(ctx, InspectPhase) + insts, unknown, diags := provider.CheckInstances(ctx, InspectPhase) assertNoDiags(t, diags) - if got, want := len(insts), 1; got != want { + assertTrue(t, unknown) + if got, want := len(insts), 0; got != want { t.Fatalf("wrong number of instances %d; want %d\n%#v", got, want, insts) } }) @@ -360,7 +366,7 @@ func TestProviderExprReferenceValue(t *testing.T) { // When the for_each expression is invalid, the result value // is unknown so we can use it as a placeholder for partial // downstream checking. - want := cty.UnknownVal(cty.Map(providerRefType)) + want := cty.NilVal // FIXME: the cmp transformer ctydebug.CmpOptions seems to find // this particular pair of values troubling, causing it to get // into an infinite recursion. For now we'll just use RawEquals, @@ -383,7 +389,7 @@ func TestProviderExprReferenceValue(t *testing.T) { // When the for_each expression is invalid, the result value // is unknown so we can use it as a placeholder for partial // downstream checking. - want := cty.UnknownVal(cty.Map(providerRefType)) + want := cty.NilVal // FIXME: the cmp transformer ctydebug.CmpOptions seems to find // this particular pair of values troubling, causing it to get // into an infinite recursion. For now we'll just use RawEquals, diff --git a/internal/stacks/stackruntime/internal/stackeval/stack.go b/internal/stacks/stackruntime/internal/stackeval/stack.go index 5cacadff21..5667d1066b 100644 --- a/internal/stacks/stackruntime/internal/stackeval/stack.go +++ b/internal/stacks/stackruntime/internal/stackeval/stack.go @@ -79,7 +79,7 @@ func (s *Stack) ParentStack(ctx context.Context) *Stack { return s.main.StackUnchecked(ctx, parentAddr) } -// ChildStackUnckecked returns an object representing a child of this stack, or +// ChildStackUnchecked returns an object representing a child of this stack, or // nil if the "name" part of the step doesn't correspond to a declared // embedded stack call. // @@ -139,15 +139,14 @@ func (s *Stack) ChildStackChecked(ctx context.Context, addr stackaddrs.StackInst callAddr := stackaddrs.StackCall{Name: addr.Name} call := calls[callAddr] - instances := call.Instances(ctx, phase) - if instances == nil { - // Totally-nil instances (as opposed to a non-nil zero-length map) - // means that we don't actually know what the instances for this - // stack call are, and so we optimistically assume that the given - // key was intended to exist and assume that later work with the - // resulting object will also return unknown/indeterminate values. + instances, unknown := call.Instances(ctx, phase) + if unknown { return candidate } + + if instances == nil { + return nil + } if _, exists := instances[addr.Key]; !exists { return nil } diff --git a/internal/stacks/stackruntime/internal/stackeval/stack_call.go b/internal/stacks/stackruntime/internal/stackeval/stack_call.go index 5ae13d74ff..2aef363ba2 100644 --- a/internal/stacks/stackruntime/internal/stackeval/stack_call.go +++ b/internal/stacks/stackruntime/internal/stackeval/stack_call.go @@ -27,8 +27,9 @@ type StackCall struct { main *Main - forEachValue perEvalPhase[promising.Once[withDiagnostics[cty.Value]]] - instances perEvalPhase[promising.Once[withDiagnostics[map[addrs.InstanceKey]*StackCallInstance]]] + forEachValue perEvalPhase[promising.Once[withDiagnostics[cty.Value]]] + instances perEvalPhase[promising.Once[withDiagnostics[instancesResult[*StackCallInstance]]]] + unknownInstance perEvalPhase[promising.Once[*StackCallInstance]] } var _ Plannable = (*StackCall)(nil) @@ -142,21 +143,21 @@ func (c *StackCall) CheckForEachValue(ctx context.Context, phase EvalPhase) (cty // for_each expression is invalid because we assume that the main plan walk // will visit the stack call directly and ask it to check itself, and that // call will be the one responsible for returning any diagnostics. -func (c *StackCall) Instances(ctx context.Context, phase EvalPhase) map[addrs.InstanceKey]*StackCallInstance { - ret, _ := c.CheckInstances(ctx, phase) - return ret +func (c *StackCall) Instances(ctx context.Context, phase EvalPhase) (map[addrs.InstanceKey]*StackCallInstance, bool) { + ret, unknown, _ := c.CheckInstances(ctx, phase) + return ret, unknown } -func (c *StackCall) CheckInstances(ctx context.Context, phase EvalPhase) (map[addrs.InstanceKey]*StackCallInstance, tfdiags.Diagnostics) { - return doOnceWithDiags( +func (c *StackCall) CheckInstances(ctx context.Context, phase EvalPhase) (map[addrs.InstanceKey]*StackCallInstance, bool, tfdiags.Diagnostics) { + result, diags := doOnceWithDiags( ctx, c.instances.For(phase), c.main, - func(ctx context.Context) (map[addrs.InstanceKey]*StackCallInstance, tfdiags.Diagnostics) { + func(ctx context.Context) (instancesResult[*StackCallInstance], tfdiags.Diagnostics) { var diags tfdiags.Diagnostics forEachVal, forEachValueDiags := c.CheckForEachValue(ctx, phase) diags = diags.Append(forEachValueDiags) if diags.HasErrors() { - return nil, diags + return instancesResult[*StackCallInstance]{}, diags } allowUnknowns := true @@ -172,22 +173,41 @@ func (c *StackCall) CheckInstances(ctx context.Context, phase EvalPhase) (map[ad }, allowUnknowns), diags }, ) + return result.insts, result.unknown, diags +} + +func (c *StackCall) UnknownInstance(ctx context.Context, phase EvalPhase) *StackCallInstance { + inst, err := c.unknownInstance.For(phase).Do(ctx, func(ctx context.Context) (*StackCallInstance, error) { + return newStackCallInstance(c, addrs.WildcardKey, instances.UnknownForEachRepetitionData(c.ForEachValue(ctx, phase).Type())), nil + }) + if err != nil { + // Since we never return an error from the function we pass to Do, + // this should never happen. + panic(err) + } + return inst } func (c *StackCall) ResultValue(ctx context.Context, phase EvalPhase) cty.Value { decl := c.Declaration(ctx) - insts := c.Instances(ctx, phase) + insts, unknown := c.Instances(ctx, phase) childResultType := c.Config(ctx).CalleeConfig(ctx).ResultType(ctx) switch { case decl.ForEach != nil: - if insts == nil { - // If we don't even know what instances we have then all we can - // say is that our result ought to be a map of an object type - // constructed from the child stack's output values. + + if unknown { + // We don't know what instances we have, so we can't know what + // the result will be. return cty.UnknownVal(cty.Map(childResultType)) } + if insts == nil { + // Then we errored during instance calculation, this should have + // already been reported. + return cty.NilVal + } + // We expect that the instances all have string keys, which will // become the keys of a map that we're returning. elems := make(map[string]cty.Value, len(insts)) @@ -231,7 +251,7 @@ func (c *StackCall) ExprReferenceValue(ctx context.Context, phase EvalPhase) cty func (c *StackCall) checkValid(ctx context.Context, phase EvalPhase) tfdiags.Diagnostics { var diags tfdiags.Diagnostics - _, moreDiags := c.CheckInstances(ctx, phase) + _, _, moreDiags := c.CheckInstances(ctx, phase) diags = diags.Append(moreDiags) // All of the other arguments in a stack call get evaluated separately @@ -283,7 +303,7 @@ func (c *StackCall) reportNamedPromises(cb func(id promising.PromiseID, name str name := c.Addr().String() instsName := name + " instances" forEachName := name + " for_each" - c.instances.Each(func(ep EvalPhase, o *promising.Once[withDiagnostics[map[addrs.InstanceKey]*StackCallInstance]]) { + c.instances.Each(func(ep EvalPhase, o *promising.Once[withDiagnostics[instancesResult[*StackCallInstance]]]) { cb(o.PromiseID(), instsName) }) // FIXME: We should call reportNamedPromises on the individual diff --git a/internal/stacks/stackruntime/internal/stackeval/stack_call_test.go b/internal/stacks/stackruntime/internal/stackeval/stack_call_test.go index 82e2cf61df..f2dd36503b 100644 --- a/internal/stacks/stackruntime/internal/stackeval/stack_call_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/stack_call_test.go @@ -10,12 +10,13 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/google/go-cmp/cmp" + "github.com/zclconf/go-cty-debug/ctydebug" + "github.com/zclconf/go-cty/cty" + "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/instances" "github.com/hashicorp/terraform/internal/stacks/stackaddrs" "github.com/hashicorp/terraform/internal/tfdiags" - "github.com/zclconf/go-cty-debug/ctydebug" - "github.com/zclconf/go-cty/cty" ) func TestStackCallCheckInstances(t *testing.T) { @@ -44,8 +45,9 @@ func TestStackCallCheckInstances(t *testing.T) { t.Fatalf("unexpected for_each value\ngot: %#v\nwant: cty.NilVal", forEachVal) } - insts, diags := call.CheckInstances(ctx, InspectPhase) + insts, unknown, diags := call.CheckInstances(ctx, InspectPhase) assertNoDiags(t, diags) + assertFalse(t, unknown) if got, want := len(insts), 1; got != want { t.Fatalf("wrong number of instances %d; want %d\n%#v", got, want, insts) } @@ -74,8 +76,9 @@ func TestStackCallCheckInstances(t *testing.T) { if got, want := forEachVal, cty.MapValEmpty(cty.EmptyObject); !want.RawEquals(got) { t.Fatalf("unexpected for_each value\ngot: %#v\nwant: %#v", got, want) } - insts, diags := call.CheckInstances(ctx, InspectPhase) + insts, unknown, diags := call.CheckInstances(ctx, InspectPhase) assertNoDiags(t, diags) + assertFalse(t, unknown) if got, want := len(insts), 0; got != want { t.Fatalf("wrong number of instances %d; want %d\n%#v", got, want, insts) } @@ -111,8 +114,9 @@ func TestStackCallCheckInstances(t *testing.T) { if !wantForEachVal.RawEquals(gotForEachVal) { t.Fatalf("unexpected for_each value\ngot: %#v\nwant: %#v", gotForEachVal, wantForEachVal) } - insts, diags := call.CheckInstances(ctx, InspectPhase) + insts, unknown, diags := call.CheckInstances(ctx, InspectPhase) assertNoDiags(t, diags) + assertFalse(t, unknown) if got, want := len(insts), 2; got != want { t.Fatalf("wrong number of instances %d; want %d\n%#v", got, want, insts) } @@ -189,7 +193,8 @@ func TestStackCallCheckInstances(t *testing.T) { // how many instances there are. This is a different result than // when we know there are zero instances, which would be a non-nil // empty map. - gotInsts, diags := call.CheckInstances(ctx, InspectPhase) + gotInsts, unknown, diags := call.CheckInstances(ctx, InspectPhase) + assertFalse(t, unknown) assertMatchingDiag(t, diags, func(diag tfdiags.Diagnostic) bool { return (diag.Severity() == tfdiags.Error && diag.Description().Detail == "The for_each expression must produce either a map of any type or a set of strings. The keys of the map or the set elements will serve as unique identifiers for multiple instances of this stack.") @@ -214,25 +219,12 @@ func TestStackCallCheckInstances(t *testing.T) { t.Errorf("wrong result\ngot: %#v\nwant: %#v", gotVal, wantVal) } - // When for_each is unknown, CheckInstances returns a single instance - // whose key is `*` to represent the unknown number of instances. - gotInsts, diags := call.CheckInstances(ctx, InspectPhase) + gotInsts, unknown, diags := call.CheckInstances(ctx, InspectPhase) assertNoDiags(t, diags) - if got, want := len(gotInsts), 1; got != want { + assertTrue(t, unknown) + if got, want := len(gotInsts), 0; got != want { t.Fatalf("wrong number of instances %d; want %d\n%#v", got, want, gotInsts) } - - if gotInsts[addrs.WildcardKey] == nil { - t.Fatalf("missing expected addrs.WildcardKey instance\n%#v", gotInsts) - } - - if gotInsts[addrs.WildcardKey].repetition.EachKey.IsKnown() { - t.Errorf("EachKey should be unknown, but is known") - } - - if gotInsts[addrs.WildcardKey].repetition.EachValue.IsKnown() { - t.Errorf("EachValue should be unknown, but is known") - } }) }) } @@ -340,10 +332,7 @@ func TestStackCallResultValue(t *testing.T) { // When the for_each expression is invalid, the result value // is unknown so we can use it as a placeholder for partial // downstream checking. - want := cty.UnknownVal(cty.Map(cty.Object(map[string]cty.Type{ - "test_map": cty.Map(cty.String), - "test_string": cty.String, - }))) + want := cty.NilVal // FIXME: the cmp transformer ctydebug.CmpOptions seems to find // this particular pair of values troubling, causing it to get // into an infinite recursion. For now we'll just use RawEquals, @@ -366,10 +355,7 @@ func TestStackCallResultValue(t *testing.T) { // When the for_each expression is invalid, the result value // is unknown so we can use it as a placeholder for partial // downstream checking. - want := cty.UnknownVal(cty.Map(cty.Object(map[string]cty.Type{ - "test_map": cty.Map(cty.String), - "test_string": cty.String, - }))) + want := cty.NilVal // FIXME: the cmp transformer ctydebug.CmpOptions seems to find // this particular pair of values troubling, causing it to get // into an infinite recursion. For now we'll just use RawEquals, @@ -392,14 +378,10 @@ func TestStackCallResultValue(t *testing.T) { // When the for_each expression is unknown, the result value // is a placeholder instance, with a wildcard key and potentially // unknown attributes. - want := cty.MapVal( - map[string]cty.Value{ - "*": cty.ObjectVal(map[string]cty.Value{ - "test_map": cty.UnknownVal(cty.Map(cty.String)), - "test_string": cty.UnknownVal(cty.String), - }), - }, - ) + want := cty.UnknownVal(cty.Map(cty.Object(map[string]cty.Type{ + "test_map": cty.Map(cty.String), + "test_string": cty.String, + }))) // FIXME: the cmp transformer ctydebug.CmpOptions seems to find // this particular pair of values troubling, causing it to get diff --git a/internal/stacks/stackruntime/internal/stackeval/testing_test.go b/internal/stacks/stackruntime/internal/stackeval/testing_test.go index 093f9e1053..06ec88b88c 100644 --- a/internal/stacks/stackruntime/internal/stackeval/testing_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/testing_test.go @@ -435,6 +435,20 @@ func (m *Main) SetTestOnlyGlobals(t *testing.T, vals map[string]cty.Value) { m.testOnlyGlobals = vals } +func assertFalse(t *testing.T, value bool) { + t.Helper() + if value { + t.Fatalf("expected false but got true") + } +} + +func assertTrue(t *testing.T, value bool) { + t.Helper() + if !value { + t.Fatalf("expected true but got false") + } +} + func assertNoDiags(t *testing.T, diags tfdiags.Diagnostics) { t.Helper() if len(diags) != 0 { diff --git a/internal/stacks/stackruntime/internal/stackeval/walk_dynamic.go b/internal/stacks/stackruntime/internal/stackeval/walk_dynamic.go index 92ed14b189..827de9562b 100644 --- a/internal/stacks/stackruntime/internal/stackeval/walk_dynamic.go +++ b/internal/stacks/stackruntime/internal/stackeval/walk_dynamic.go @@ -58,7 +58,19 @@ func walkDynamicObjectsInStack[Output any]( // because it involves evaluating for_each expressions, and one // stack call's for_each might depend on the results of another. walk.AsyncTask(ctx, func(ctx context.Context) { - insts := call.Instances(ctx, phase) + insts, unknown := call.Instances(ctx, phase) + + // If unknown, then process the unknown instance and skip the rest. + if unknown { + inst := call.UnknownInstance(ctx, phase) + visit(ctx, walk, inst) + + childStack := inst.CalledStack(ctx) + walkDynamicObjectsInStack(ctx, walk, childStack, phase, visit) + return + } + + // Otherwise, process the instances and their child stacks. for _, inst := range insts { visit(ctx, walk, inst) @@ -78,7 +90,14 @@ func walkDynamicObjectsInStack[Output any]( // because it involves potentially evaluating a for_each expression. // and that might depend on data from elsewhere in the same stack. walk.AsyncTask(ctx, func(ctx context.Context) { - insts := component.Instances(ctx, phase) + insts, unknown := component.Instances(ctx, phase) + + if unknown { + inst := component.UnknownInstance(ctx, phase) + visit(ctx, walk, inst) + return + } + for _, inst := range insts { visit(ctx, walk, inst) } @@ -93,7 +112,13 @@ func walkDynamicObjectsInStack[Output any]( // task because it involves potentially evaluating a for_each expression, // and that might depend on data from elsewhere in the same stack. walk.AsyncTask(ctx, func(ctx context.Context) { - insts := provider.Instances(ctx, phase) + insts, unknown := provider.Instances(ctx, phase) + if unknown { + // We use the unconfigured client for unknown instances of a + // provider so there is nothing for us to do here. + return + } + for _, inst := range insts { visit(ctx, walk, inst) } From 7b7afe82c69216af8e97958abdb889eda6644279 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Tue, 4 Jun 2024 14:59:32 -0400 Subject: [PATCH 143/161] update backport-assistant to 0.4.3 --- .github/workflows/main.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7c730a1a51..b4693ede34 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,12 +10,17 @@ jobs: backport: if: github.event.pull_request.merged runs-on: ubuntu-latest - container: hashicorpdev/backport-assistant:0.4.0@sha256:0c0c7e452673de42675d7966bfa1268103ca60c9de30ae4a72b2136d448a54dc + container: hashicorpdev/backport-assistant:0.4.3@sha256:2381806dd059c14515463b87e8a923d57734bd484beea6a561e411e25628e010 steps: - name: Run Backport Assistant run: | + curl -L \ + -H "Accept: application/vnd.github+json" \ + -H "Authorization: Bearer ${{ github.token }}" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + https://api.github.com/installation/repositories backport-assistant backport env: BACKPORT_LABEL_REGEXP: "(?P\\d+\\.\\d+)-backport" BACKPORT_TARGET_TEMPLATE: "v{{.target}}" - GITHUB_TOKEN: ${{ secrets.ELEVATED_GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ github.token }} From b9b181290f2f76b4b6a7cdfe85bb3fe5d1a2301c Mon Sep 17 00:00:00 2001 From: "hashicorp-tsccr[bot]" <129506189+hashicorp-tsccr[bot]@users.noreply.github.com> Date: Wed, 5 Jun 2024 09:33:07 +0100 Subject: [PATCH 144/161] Result of tsccr-helper -log-level=info gha update -latest . (#35275) Co-authored-by: hashicorp-tsccr[bot] --- .github/workflows/build-terraform-cli.yml | 2 +- .github/workflows/build.yml | 14 +++++++------- .github/workflows/checks.yml | 8 ++++---- .github/workflows/crt-hook-equivalence-tests.yml | 2 +- .github/workflows/manual-equivalence-tests.yml | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build-terraform-cli.yml b/.github/workflows/build-terraform-cli.yml index d85349f6d5..5870d0bc80 100644 --- a/.github/workflows/build-terraform-cli.yml +++ b/.github/workflows/build-terraform-cli.yml @@ -38,7 +38,7 @@ jobs: runs-on: ${{ inputs.runson }} name: Terraform ${{ inputs.goos }} ${{ inputs.goarch }} v${{ inputs.product-version }} steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 with: go-version: ${{ inputs.go-version }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f293f1053b..7c973c7520 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,7 +37,7 @@ jobs: pkg-name: ${{ steps.get-pkg-name.outputs.pkg-name }} steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - name: Get Package Name id: get-pkg-name run: | @@ -64,7 +64,7 @@ jobs: go-version: ${{ steps.get-go-version.outputs.version }} steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - name: Determine Go version id: get-go-version uses: ./.github/actions/go-version @@ -77,7 +77,7 @@ jobs: filepath: ${{ steps.generate-metadata-file.outputs.filepath }} steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - name: Generate package metadata id: generate-metadata-file uses: hashicorp/actions-generate-metadata@fdbc8803a0e53bcbb912ddeee3808329033d6357 # v1.1.1 @@ -139,7 +139,7 @@ jobs: repo: "terraform" version: ${{needs.get-product-version.outputs.product-version}} steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - name: Build Docker images uses: hashicorp/actions-docker-build@11d43ef520c65f58683d048ce9b47d6617893c9a # v2 with: @@ -187,7 +187,7 @@ jobs: cache_path=internal/command/e2etest/build echo "e2e-cache-key=${cache_key}" | tee -a "${GITHUB_OUTPUT}" echo "e2e-cache-path=${cache_path}" | tee -a "${GITHUB_OUTPUT}" - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - name: Install Go toolchain uses: actions/setup-go@cdcb36043654635271a94b9a6d1392de5bb323a7 # v5.0.1 @@ -245,7 +245,7 @@ jobs: # fresh build from source.) - name: Checkout repo if: ${{ (matrix.goos == 'linux') || (matrix.goos == 'darwin') }} - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - name: "Restore cache" uses: actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 id: e2etestpkg @@ -310,7 +310,7 @@ jobs: name: terraform_${{ env.version }}_linux_amd64.zip path: . - name: Checkout terraform-exec repo - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 with: repository: hashicorp/terraform-exec path: terraform-exec diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 1d298b78c9..ab1b35e89a 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -36,7 +36,7 @@ jobs: steps: - name: "Fetch source code" - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - name: Determine Go version id: go @@ -71,7 +71,7 @@ jobs: steps: - name: "Fetch source code" - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - name: Determine Go version id: go @@ -109,7 +109,7 @@ jobs: steps: - name: "Fetch source code" - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 - name: Determine Go version id: go @@ -141,7 +141,7 @@ jobs: steps: - name: "Fetch source code" - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 with: fetch-depth: 0 # We need to do comparisons against the main branch. diff --git a/.github/workflows/crt-hook-equivalence-tests.yml b/.github/workflows/crt-hook-equivalence-tests.yml index f675d8bfca..2e4bd1c9d4 100644 --- a/.github/workflows/crt-hook-equivalence-tests.yml +++ b/.github/workflows/crt-hook-equivalence-tests.yml @@ -33,7 +33,7 @@ jobs: needs: - parse-metadata steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 with: ref: ${{ needs.parse-metadata.outputs.target-branch }} - uses: ./.github/actions/equivalence-test diff --git a/.github/workflows/manual-equivalence-tests.yml b/.github/workflows/manual-equivalence-tests.yml index 5a66b375eb..f1c20e7a75 100644 --- a/.github/workflows/manual-equivalence-tests.yml +++ b/.github/workflows/manual-equivalence-tests.yml @@ -25,7 +25,7 @@ jobs: name: "Run equivalence tests" runs-on: ubuntu-latest steps: - - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6 with: ref: ${{ inputs.target-branch }} - uses: ./.github/actions/equivalence-test From 230921213143d27b15a4e6f4e3cd88e4d93555e0 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Wed, 5 Jun 2024 02:37:45 +0200 Subject: [PATCH 145/161] stacks: deferred action tests for modules --- .../terraform/context_apply_deferred_test.go | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/internal/terraform/context_apply_deferred_test.go b/internal/terraform/context_apply_deferred_test.go index 1161169970..2a09e476be 100644 --- a/internal/terraform/context_apply_deferred_test.go +++ b/internal/terraform/context_apply_deferred_test.go @@ -2470,6 +2470,86 @@ import { }, }, } + + moduleDeferredForEachValue = deferredActionsTest{ + configs: map[string]string{ + "main.tf": ` +variable "input" { + type = set(string) +} + +module "my_module" { + for_each = var.input + source = "../module" + + + name = each.value +} +`, + "../module/main.tf": ` +variable "name" { + type = string +} + +resource "test" "a" { + name = var.name +} +`, + }, + stages: []deferredActionsTestStage{ + { + inputs: map[string]cty.Value{ + "input": cty.UnknownVal(cty.Set(cty.String)), + }, + wantPlanned: map[string]cty.Value{ + "": cty.ObjectVal(map[string]cty.Value{ + "name": cty.UnknownVal(cty.String), + "upstream_names": cty.NullVal(cty.Set(cty.String)), + "output": cty.UnknownVal(cty.String), + }), + }, + wantActions: make(map[string]plans.Action), + wantDeferred: map[string]ExpectedDeferred{ + `module.my_module["*"].test.a["*"]`: {Reason: providers.DeferredReasonInstanceCountUnknown, Action: plans.Create}, + }, + wantOutputs: make(map[string]cty.Value), + complete: false, + }, + }, + } + + moduleInnerResourceInstanceDeferred = deferredActionsTest{ + configs: map[string]string{ + "main.tf": ` +module "my_module" { + source = "../module" +} +`, + "../module/main.tf": ` +resource "test" "a" { + name = "deferred_resource_change" +} +`, + }, + stages: []deferredActionsTestStage{ + { + inputs: map[string]cty.Value{}, + wantPlanned: map[string]cty.Value{ + "deferred_resource_change": cty.ObjectVal(map[string]cty.Value{ + "name": cty.StringVal("deferred_resource_change"), + "upstream_names": cty.NullVal(cty.Set(cty.String)), + "output": cty.UnknownVal(cty.String), + }), + }, + wantActions: make(map[string]plans.Action), + wantDeferred: map[string]ExpectedDeferred{ + `module.my_module.test.a`: {Reason: providers.DeferredReasonProviderConfigUnknown, Action: plans.Create}, + }, + wantOutputs: make(map[string]cty.Value), + complete: false, + }, + }, + } ) func TestContextApply_deferredActions(t *testing.T) { @@ -2502,6 +2582,8 @@ func TestContextApply_deferredActions(t *testing.T) { "resource_read_but_forbidden": resourceReadButForbiddenTest, "data_read_but_forbidden": readDataSourceButForbiddenTest, "plan_destroy_resource_change_but_forbidden": planDestroyResourceChangeButForbidden, + "module_deferred_for_each_value": moduleDeferredForEachValue, + "module_inner_resource_instance_deferred": moduleInnerResourceInstanceDeferred, } for name, test := range tests { From 18c71458f0ddad30a90066558aca813771466468 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Wed, 5 Jun 2024 11:06:29 -0400 Subject: [PATCH 146/161] update backport-assistant --- .github/workflows/main.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b4693ede34..9556199aa6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,13 +14,8 @@ jobs: steps: - name: Run Backport Assistant run: | - curl -L \ - -H "Accept: application/vnd.github+json" \ - -H "Authorization: Bearer ${{ github.token }}" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - https://api.github.com/installation/repositories backport-assistant backport env: BACKPORT_LABEL_REGEXP: "(?P\\d+\\.\\d+)-backport" BACKPORT_TARGET_TEMPLATE: "v{{.target}}" - GITHUB_TOKEN: ${{ github.token }} + GITHUB_TOKEN: ${{ secrets.ELEVATED_GITHUB_TOKEN }} From c04f023cbfe400415ec9b6a7fa2eec28f434bf29 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Wed, 5 Jun 2024 11:40:01 -0400 Subject: [PATCH 147/161] Update internal/terraform/node_resource_plan_instance.go Co-authored-by: kmoe <5575356+kmoe@users.noreply.github.com> --- internal/terraform/node_resource_plan_instance.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/terraform/node_resource_plan_instance.go b/internal/terraform/node_resource_plan_instance.go index 3dcfad33f7..deea1d688d 100644 --- a/internal/terraform/node_resource_plan_instance.go +++ b/internal/terraform/node_resource_plan_instance.go @@ -243,7 +243,7 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext) } if n.skipRefresh && !importing && updatedCBD { - // CreateBeforeDestroy must be set correctly in the state which us used + // CreateBeforeDestroy must be set correctly in the state which is used // to create the apply graph, so if we did not refresh the state make // sure we still update any changes to CreateBeforeDestroy. diags = diags.Append(n.writeResourceInstanceState(ctx, instanceRefreshState, refreshState)) From 5e2281a9e060440a69dce658492184ac785c5a07 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Thu, 29 Feb 2024 10:40:53 -0800 Subject: [PATCH 148/161] lang: A new mark type for ephemeral values This isn't actually used anywhere yet. We'll introduce uses of it in subsequent commits. --- internal/lang/marks/marks.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/internal/lang/marks/marks.go b/internal/lang/marks/marks.go index 5c3a6d8c7f..7ba2752d22 100644 --- a/internal/lang/marks/marks.go +++ b/internal/lang/marks/marks.go @@ -39,6 +39,14 @@ func Contains(val cty.Value, mark valueMark) bool { // Terraform. const Sensitive = valueMark("Sensitive") +// Ephemeral indicates that a value exists only in memory during a single +// phase, and thus cannot persist between phases or between rounds. +// +// Ephemeral values can be used only in locations that don't require Terraform +// to persist them as part of artifacts such as state snapshots or saved plan +// files. +const Ephemeral = valueMark("Ephemeral") + // TypeType is used to indicate that the value contains a representation of // another value's type. This is part of the implementation of the console-only // `type` function. From 1ef2ad7d4c0f4edda81d82f908bab0be19fab5d5 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Thu, 29 Feb 2024 11:06:44 -0800 Subject: [PATCH 149/161] experiments: "ephemeral_values" language experiment This doesn't actually do anything yet, but in future commits it will enable some new language features for marking input variables and output values as "ephemeral", meaning that they don't get saved as part of state snapshots or saved plan files. --- internal/experiments/experiment.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/internal/experiments/experiment.go b/internal/experiments/experiment.go index 637a91b3de..90ca9a48f7 100644 --- a/internal/experiments/experiment.go +++ b/internal/experiments/experiment.go @@ -23,6 +23,7 @@ const ( TemplateStringFunc = Experiment("template_string_func") ConfigDrivenMove = Experiment("config_driven_move") PreconditionsPostconditions = Experiment("preconditions_postconditions") + EphemeralValues = Experiment("ephemeral_values") UnknownInstances = Experiment("unknown_instances") ) @@ -36,6 +37,7 @@ func init() { registerConcludedExperiment(TemplateStringFunc, "The templatestring function can now be used without enabling an experiment.") registerConcludedExperiment(ConfigDrivenMove, "Declarations of moved resource instances using \"moved\" blocks can now be used by default, without enabling an experiment.") registerConcludedExperiment(PreconditionsPostconditions, "Condition blocks can now be used by default, without enabling an experiment.") + registerCurrentExperiment(EphemeralValues) registerConcludedExperiment(ModuleVariableOptionalAttrs, "The final feature corresponding to this experiment differs from the experimental form and is available in the Terraform language from Terraform v1.3.0 onwards.") } From 6fad32b033ec06f78d496cd9cff600431907639c Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Thu, 29 Feb 2024 11:28:14 -0800 Subject: [PATCH 150/161] configs: Variables and outputs can be "ephemeral" When the ephemeral_values experiment is active, a module author can designate individual input variables and output values as being "ephemeral", which doesn't currently do anything but in future commits will represent that the values can be used only in locations that don't require Terraform to persist the value as part of state snapshots or saved plan files. --- internal/configs/experiments.go | 23 +++++++++++++++++++ internal/configs/module_merge.go | 8 +++++++ internal/configs/named_values.go | 22 ++++++++++++++++++ internal/configs/parser_config_test.go | 9 ++++++++ .../warning-files/ephemeral_inputs_outputs.tf | 21 +++++++++++++++++ 5 files changed, 83 insertions(+) create mode 100644 internal/configs/testdata/warning-files/ephemeral_inputs_outputs.tf diff --git a/internal/configs/experiments.go b/internal/configs/experiments.go index 163e75e6d1..d3fd6a4e59 100644 --- a/internal/configs/experiments.go +++ b/internal/configs/experiments.go @@ -208,5 +208,28 @@ func checkModuleExperiments(m *Module) hcl.Diagnostics { } */ + if !m.ActiveExperiments.Has(experiments.EphemeralValues) { + for _, oc := range m.Outputs { + if oc.EphemeralSet { + diags = append(diags, &hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Ephemeral values are experimental", + Detail: "This feature is currently an opt-in experiment, subject to change in future releases based on feedback.\n\nActivate the feature for this module by adding ephemeral_values to the list of active experiments.", + Subject: oc.DeclRange.Ptr(), + }) + } + } + for _, vc := range m.Variables { + if vc.EphemeralSet { + diags = append(diags, &hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Ephemeral values are experimental", + Detail: "This feature is currently an opt-in experiment, subject to change in future releases based on feedback.\n\nActivate the feature for this module by adding ephemeral_values to the list of active experiments.", + Subject: vc.DeclRange.Ptr(), + }) + } + } + } + return diags } diff --git a/internal/configs/module_merge.go b/internal/configs/module_merge.go index 01c3f2088c..42e956e5db 100644 --- a/internal/configs/module_merge.go +++ b/internal/configs/module_merge.go @@ -49,6 +49,10 @@ func (v *Variable) merge(ov *Variable) hcl.Diagnostics { v.Sensitive = ov.Sensitive v.SensitiveSet = ov.SensitiveSet } + if ov.EphemeralSet { + v.Ephemeral = ov.Ephemeral + v.EphemeralSet = ov.EphemeralSet + } if ov.Default != cty.NilVal { v.Default = ov.Default } @@ -148,6 +152,10 @@ func (o *Output) merge(oo *Output) hcl.Diagnostics { o.Sensitive = oo.Sensitive o.SensitiveSet = oo.SensitiveSet } + if oo.EphemeralSet { + o.Ephemeral = oo.Ephemeral + o.EphemeralSet = oo.EphemeralSet + } // We don't allow depends_on to be overridden because that is likely to // cause confusing misbehavior. diff --git a/internal/configs/named_values.go b/internal/configs/named_values.go index 43a624d9d8..ad82960fe3 100644 --- a/internal/configs/named_values.go +++ b/internal/configs/named_values.go @@ -35,9 +35,11 @@ type Variable struct { ParsingMode VariableParsingMode Validations []*CheckRule Sensitive bool + Ephemeral bool DescriptionSet bool SensitiveSet bool + EphemeralSet bool // Nullable indicates that null is a valid value for this variable. Setting // Nullable to false means that the module can expect this variable to @@ -120,6 +122,12 @@ func decodeVariableBlock(block *hcl.Block, override bool) (*Variable, hcl.Diagno v.SensitiveSet = true } + if attr, exists := content.Attributes["ephemeral"]; exists { + valDiags := gohcl.DecodeExpression(attr.Expr, nil, &v.Ephemeral) + diags = append(diags, valDiags...) + v.EphemeralSet = true + } + if attr, exists := content.Attributes["nullable"]; exists { valDiags := gohcl.DecodeExpression(attr.Expr, nil, &v.Nullable) diags = append(diags, valDiags...) @@ -332,11 +340,13 @@ type Output struct { Expr hcl.Expression DependsOn []hcl.Traversal Sensitive bool + Ephemeral bool Preconditions []*CheckRule DescriptionSet bool SensitiveSet bool + EphemeralSet bool DeclRange hcl.Range } @@ -382,6 +392,12 @@ func decodeOutputBlock(block *hcl.Block, override bool) (*Output, hcl.Diagnostic o.SensitiveSet = true } + if attr, exists := content.Attributes["ephemeral"]; exists { + valDiags := gohcl.DecodeExpression(attr.Expr, nil, &o.Ephemeral) + diags = append(diags, valDiags...) + o.EphemeralSet = true + } + if attr, exists := content.Attributes["depends_on"]; exists { deps, depsDiags := decodeDependsOn(attr) diags = append(diags, depsDiags...) @@ -473,6 +489,9 @@ var variableBlockSchema = &hcl.BodySchema{ { Name: "sensitive", }, + { + Name: "ephemeral", + }, { Name: "nullable", }, @@ -499,6 +518,9 @@ var outputBlockSchema = &hcl.BodySchema{ { Name: "sensitive", }, + { + Name: "ephemeral", + }, }, Blocks: []hcl.BlockHeaderSchema{ {Type: "precondition"}, diff --git a/internal/configs/parser_config_test.go b/internal/configs/parser_config_test.go index c305cd1fab..e85bfa2da2 100644 --- a/internal/configs/parser_config_test.go +++ b/internal/configs/parser_config_test.go @@ -192,18 +192,27 @@ func TestParserLoadConfigFileWarning(t *testing.T) { sc := bufio.NewScanner(bytes.NewReader(src)) wantWarnings := make(map[int]string) lineNum := 1 + allowExperiments := false for sc.Scan() { lineText := sc.Text() if idx := strings.Index(lineText, marker); idx != -1 { summaryText := lineText[idx+len(marker):] wantWarnings[lineNum] = summaryText } + if lineText == "# ALLOW-LANGUAGE-EXPERIMENTS" { + allowExperiments = true + } lineNum++ } parser := testParser(map[string]string{ name: string(src), }) + // Some inputs use a special comment to request that they be + // permitted to use language experiments. We typically use that + // to test that the experiment opt-in is working and is causing + // the expected "you are using experimental features" warning. + parser.AllowLanguageExperiments(allowExperiments) _, diags := parser.LoadConfigFile(name) if diags.HasErrors() { diff --git a/internal/configs/testdata/warning-files/ephemeral_inputs_outputs.tf b/internal/configs/testdata/warning-files/ephemeral_inputs_outputs.tf new file mode 100644 index 0000000000..feedccd606 --- /dev/null +++ b/internal/configs/testdata/warning-files/ephemeral_inputs_outputs.tf @@ -0,0 +1,21 @@ +# ALLOW-LANGUAGE-EXPERIMENTS + +# If the ephemeral_values features get stabilized, this test input will fail +# due to the experiment being concluded, in which case it might make sense to +# move this file to valid-files and remove the experiment opt-in +# +# If this experiment is removed without stabilizing it then this will fail +# and should be removed altogether. + +terraform { + experiments = [ephemeral_values] # WARNING: Experimental feature "ephemeral_values" is active +} + +variable "in" { + ephemeral = true +} + +output "out" { + ephemeral = true + value = var.in +} From 6f84623cb6f8394a54c0670583313da5326126aa Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Thu, 29 Feb 2024 12:08:19 -0800 Subject: [PATCH 151/161] terraform: Initial partial support for ephemeral values This is a checkpoint commit on the path to supporting ephemeral values as a cross-cutting concern in the Terraform language. An ephemeral value is one that lives only in RAM during a single phase and so cannot persist from the plan phase to the apply phase, or between consecutive plan/apply rounds. Terraform tracks whether each value is ephemeral using the cty "marks" concept, thus achieving the same dynamic analysis as we already employ for the concept of "sensitive values" that prevents displaying a value in the user interface. This commit is just a starting point which gets some of the basics into place: - input variables and output values can both be statically declared as being ephemeral. Only ephemeral inputs/outputs can have ephemeral values assigned to them, and the recipient of the value sees it as ephemeral even if the assigned value was not already ephemeral. This creates a dynamic analysis cutoff point at module boundaries so that it's possible to determine in isolation whether a single module is using ephemeral values correctly, without having to test it in every possible calling context. - Managed and data resources cannot have ephemeral values assigned into their configurations because Terraform and providers both expect the resource attributes to persist between phases. - Ephemeral values _can_ be used in provider and provisioner configurations, because both of those effectively meet the definition of the new "ephemeral" concept despite it not previously having a name. - Ephemeral markings propagate through all of the built-in language features for dynamic analysis purposes, largely relying on cty's efforts to do that in similar vein as for sensitive marks. In particular, it's possible to define a local value whose expression produces an ephemeral result, and passing ephemeral values to functions should propagate the ephemeral mark to the results when appropriate. (I've not yet thoroughly reviewed all of the built-in functions for correct marks handling though, so there may be some gaps to address in later commits.) The next step for this work will be to change the modules runtime to have support for a workflow involving ephemeral _root_ input variables, where their values must be re-supplied during the apply phase. That will then achieve (in experimental capacity) the first goal of ephemeral values: to be able to provide non-persistent settings such as time-limited API tokens to use in provider configuration blocks. --- internal/command/views/json/diagnostic.go | 47 ++++- internal/lang/ephemeral/doc.go | 13 ++ internal/lang/ephemeral/paths.go | 18 ++ internal/lang/ephemeral/paths_test.go | 42 ++++ internal/terraform/context_apply.go | 10 + internal/terraform/context_plan2_test.go | 190 +++++++++++++++++- internal/terraform/diagnostics.go | 17 ++ internal/terraform/eval_count.go | 23 ++- internal/terraform/eval_count_test.go | 18 +- internal/terraform/eval_for_each.go | 26 ++- internal/terraform/eval_for_each_test.go | 62 ++++-- internal/terraform/eval_variable.go | 30 +++ internal/terraform/evaluate.go | 16 +- internal/terraform/node_output.go | 92 ++++++--- .../node_resource_abstract_instance.go | 10 +- internal/terraform/node_resource_validate.go | 34 ++++ internal/tfdiags/diagnostic_extra.go | 34 ++++ 17 files changed, 618 insertions(+), 64 deletions(-) create mode 100644 internal/lang/ephemeral/doc.go create mode 100644 internal/lang/ephemeral/paths.go create mode 100644 internal/lang/ephemeral/paths_test.go diff --git a/internal/command/views/json/diagnostic.go b/internal/command/views/json/diagnostic.go index 4b5f7f4abc..71e3e9910e 100644 --- a/internal/command/views/json/diagnostic.go +++ b/internal/command/views/json/diagnostic.go @@ -275,6 +275,7 @@ func NewDiagnostic(diag tfdiags.Diagnostic, sources map[string][]byte) *Diagnost values := make([]DiagnosticExpressionValue, 0, len(vars)) seen := make(map[string]struct{}, len(vars)) includeUnknown := tfdiags.DiagnosticCausedByUnknown(diag) + includeEphemeral := tfdiags.DiagnosticCausedByEphemeral(diag) includeSensitive := tfdiags.DiagnosticCausedBySensitive(diag) Traversals: for _, traversal := range vars { @@ -295,6 +296,22 @@ func NewDiagnostic(diag tfdiags.Diagnostic, sources map[string][]byte) *Diagnost value := DiagnosticExpressionValue{ Traversal: traversalStr, } + // We'll skip any value that has a mark that we don't + // know how to handle, because in that case we can't + // know what that mark is intended to represent and so + // must be conservative. + _, valMarks := val.Unmark() + for mark := range valMarks { + switch mark { + case marks.Sensitive, marks.Ephemeral: + // These are handled below + continue + default: + // All other marks are unhandled, so we'll + // skip this traversal entirely. + continue Traversals + } + } switch { case val.HasMark(marks.Sensitive): // We only mention a sensitive value if the diagnostic @@ -351,6 +368,9 @@ func NewDiagnostic(diag tfdiags.Diagnostic, sources map[string][]byte) *Diagnost default: value.Statement = fmt.Sprintf("is %s", compactValueStr(val)) } + if includeEphemeral && val.HasMark(marks.Ephemeral) { + value.Statement += ", and is ephemeral" + } values = append(values, value) seen[traversalStr] = struct{}{} } @@ -417,12 +437,27 @@ func compactValueStr(val cty.Value) string { // helpful but concise messages in diagnostics. It is not comprehensive // nor intended to be used for other purposes. - if val.HasMark(marks.Sensitive) { - // We check this in here just to make sure, but note that the caller - // of compactValueStr ought to have already checked this and skipped - // calling into compactValueStr anyway, so this shouldn't actually - // be reachable. - return "(sensitive value)" + val, valMarks := val.Unmark() + for mark := range valMarks { + switch mark { + case marks.Sensitive: + // We check this in here just to make sure, but note that the caller + // of compactValueStr ought to have already checked this and skipped + // calling into compactValueStr anyway, so this shouldn't actually + // be reachable. + return "(sensitive value)" + case marks.Ephemeral: + // A non-sensitive ephemeral value is fine to show in the UI. Values + // that are both ephemeral and sensitive should have both markings + // and should therefore get caught by the marks.Sensitive case + // above. + continue + default: + // We don't know about any other marks, so we'll be conservative. + // This shouldn't actuallyr eachable since the caller should've + // checked this and skipped calling compactValueStr anyway. + return "value with unrecognized marks (this is a bug in Terraform)" + } } // WARNING: We've only checked that the value isn't sensitive _shallowly_ diff --git a/internal/lang/ephemeral/doc.go b/internal/lang/ephemeral/doc.go new file mode 100644 index 0000000000..015440fc6b --- /dev/null +++ b/internal/lang/ephemeral/doc.go @@ -0,0 +1,13 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: BUSL-1.1 + +// Package ephemeral contains helper functions for working with values that +// might have ephemeral parts. +// +// "Ephemeral" in this context means that a value is preserved only in memory +// for no longer than the duration of a single Terraform phase, and is not +// persisted as part of longer-lived artifacts such as state snapshots and +// saved plan files. Because ephemeral values cannot be persisted, they can +// be used only as part of the configuration of objects that are ephemeral +// themselves, such as provider configurations and provisioners. +package ephemeral diff --git a/internal/lang/ephemeral/paths.go b/internal/lang/ephemeral/paths.go new file mode 100644 index 0000000000..3fc48d0d2a --- /dev/null +++ b/internal/lang/ephemeral/paths.go @@ -0,0 +1,18 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: BUSL-1.1 + +package ephemeral + +import ( + "github.com/zclconf/go-cty/cty" + + "github.com/hashicorp/terraform/internal/lang/marks" +) + +// EphemeralValuePaths returns the paths within the given value that are +// marked as ephemeral, if any. +func EphemeralValuePaths(v cty.Value) []cty.Path { + _, pvms := v.UnmarkDeepWithPaths() + ret, _ := marks.PathsWithMark(pvms, marks.Ephemeral) + return ret +} diff --git a/internal/lang/ephemeral/paths_test.go b/internal/lang/ephemeral/paths_test.go new file mode 100644 index 0000000000..c865d8dee0 --- /dev/null +++ b/internal/lang/ephemeral/paths_test.go @@ -0,0 +1,42 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: BUSL-1.1 + +package ephemeral + +import ( + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/hashicorp/terraform/internal/lang/marks" + "github.com/zclconf/go-cty/cty" +) + +func TestEphemeralValuePaths(t *testing.T) { + // This test is intentionally not a thorough wringing of all possible cases + // because EphemeralValuePaths is really just a thing wrapper around a + // more general function in package marks, and that function already has + // its own tests. That also in turn wraps a more-general-again function in + // upstream cty that also has its own tests. + v := cty.ObjectVal(map[string]cty.Value{ + "unmarked": cty.StringVal("unmarked"), + "sensitive": cty.StringVal("sensitive").Mark(marks.Sensitive), + "ephemeral": cty.StringVal("ephemeral").Mark(marks.Ephemeral), + "both": cty.StringVal("both").Mark(marks.Ephemeral).Mark(marks.Sensitive), + "nested": cty.ListVal([]cty.Value{ + cty.StringVal("unmarked"), + cty.StringVal("sensitive").Mark(marks.Sensitive), + cty.StringVal("ephemeral").Mark(marks.Ephemeral), + cty.StringVal("both").Mark(marks.Ephemeral).Mark(marks.Sensitive), + }), + }) + got := cty.NewPathSet(EphemeralValuePaths(v)...) + want := cty.NewPathSet( + cty.GetAttrPath("ephemeral"), + cty.GetAttrPath("both"), + cty.GetAttrPath("nested").IndexInt(2), + cty.GetAttrPath("nested").IndexInt(3), + ) + if diff := cmp.Diff(want, got); diff != "" { + t.Errorf("wrong result\n%s", diff) + } +} diff --git a/internal/terraform/context_apply.go b/internal/terraform/context_apply.go index 8195b20693..987192126e 100644 --- a/internal/terraform/context_apply.go +++ b/internal/terraform/context_apply.go @@ -28,6 +28,16 @@ type ApplyOpts struct { // the providers that were passed when creating the plan that's being // applied, or the results will be erratic. ExternalProviders map[addrs.RootProviderConfig]providers.Interface + + // SetVariables are the raw values for root module variables as provided + // by the user who is requesting the run, prior to any normalization or + // substitution of defaults. See the documentation for the InputValue + // type for more information on how to correctly populate this. + // + // During the apply phase it's only valid to specify values for input + // values that were declared as ephemeral, because all other input + // values must retain the values that were specified during planning. + SetVariables InputValues } // ApplyOpts creates an [ApplyOpts] with copies of all of the elements that diff --git a/internal/terraform/context_plan2_test.go b/internal/terraform/context_plan2_test.go index bb099e1987..9abf586693 100644 --- a/internal/terraform/context_plan2_test.go +++ b/internal/terraform/context_plan2_test.go @@ -7,6 +7,7 @@ import ( "bytes" "errors" "fmt" + "path/filepath" "strings" "sync" "testing" @@ -14,19 +15,17 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/google/go-cmp/cmp" + "github.com/hashicorp/hcl/v2" "github.com/zclconf/go-cty-debug/ctydebug" "github.com/zclconf/go-cty/cty" - // "github.com/hashicorp/hcl/v2" "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/checks" - testing_provider "github.com/hashicorp/terraform/internal/providers/testing" - - // "github.com/hashicorp/terraform/internal/configs" "github.com/hashicorp/terraform/internal/configs/configschema" "github.com/hashicorp/terraform/internal/lang/marks" "github.com/hashicorp/terraform/internal/plans" "github.com/hashicorp/terraform/internal/providers" + testing_provider "github.com/hashicorp/terraform/internal/providers/testing" "github.com/hashicorp/terraform/internal/states" "github.com/hashicorp/terraform/internal/tfdiags" ) @@ -5496,6 +5495,189 @@ resource "test_object" "obj" { } } +func TestContext2Plan_ephemeralInResource(t *testing.T) { + m := testModuleInline(t, map[string]string{ + "main.tf": ` + terraform { + # Ephemeral values are currently experimental. Remove this + # argument if the feature gets stablized and this test otherwise + # still makes sense for what was stabilized. + experiments = [ephemeral_values] + + required_providers { + beep = { + source = "terraform.io/builtin/beep" + } + } + } + + variable "in" { + type = string + ephemeral = true + } + + resource "beep" "boop" { + in = var.in + } + + data "beep" "boop" { + in = var.in + } + `, + }) + + p := new(testing_provider.MockProvider) + p.GetProviderSchemaResponse = getProviderSchemaResponseFromProviderSchema(&providerSchema{ + ResourceTypes: map[string]*configschema.Block{ + "beep": { + Attributes: map[string]*configschema.Attribute{ + "in": { + Type: cty.String, + Optional: true, + }, + }, + }, + }, + }) + p.GetProviderSchemaResponse.DataSources = p.GetProviderSchemaResponse.ResourceTypes + + ctx := testContext2(t, &ContextOpts{ + Providers: map[addrs.Provider]providers.Factory{ + addrs.NewBuiltInProvider("beep"): testProviderFuncFixed(p), + }, + }) + + var wantDiags tfdiags.Diagnostics + wantDiags = wantDiags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Invalid use of ephemeral value", + Detail: "Ephemeral values are not valid in resource arguments, because resource instances must persist between Terraform phases.", + Subject: &hcl.Range{ + Filename: filepath.Join(m.Module.SourceDir, "main.tf"), + Start: hcl.Pos{ + Line: 21, Column: 10, Byte: 442, + }, + End: hcl.Pos{ + Line: 21, Column: 16, Byte: 448, + }, + }, + }) + wantDiags = wantDiags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Invalid use of ephemeral value", + Detail: "Ephemeral values are not valid in resource arguments, because resource instances must persist between Terraform phases.", + Subject: &hcl.Range{ + Filename: filepath.Join(m.Module.SourceDir, "main.tf"), + Start: hcl.Pos{ + Line: 25, Column: 10, Byte: 488, + }, + End: hcl.Pos{ + Line: 25, Column: 16, Byte: 494, + }, + }, + }) + _, gotDiags := ctx.Plan( + m, states.NewState(), + SimplePlanOpts(plans.NormalMode, InputValues{ + "in": { + Value: cty.StringVal("hello"), + SourceType: ValueFromCaller, + }, + }), + ) + // We'll use the "for RPC" representation just as a convenient shortcut + // to not worry about exactly which diagnostic type Terraform Core chose + // to return here. + gotDiags = gotDiags.ForRPC() + gotDiags.Sort() + wantDiags = wantDiags.ForRPC() + wantDiags.Sort() + if diff := cmp.Diff(wantDiags, gotDiags); diff != "" { + t.Errorf("wrong diagnostics\n%s", diff) + } + +} + +func TestContext2Plan_ephemeralInProviderConfig(t *testing.T) { + m := testModuleInline(t, map[string]string{ + "main.tf": ` + terraform { + # Ephemeral values are currently experimental. Remove this + # argument if the feature gets stablized and this test otherwise + # still makes sense for what was stabilized. + experiments = [ephemeral_values] + + required_providers { + beep = { + source = "terraform.io/builtin/beep" + } + } + } + + variable "in" { + type = string + ephemeral = true + } + + provider "beep" { + in = var.in + } + + data "beep" "boop" { + } + `, + }) + + p := new(testing_provider.MockProvider) + p.GetProviderSchemaResponse = getProviderSchemaResponseFromProviderSchema(&providerSchema{ + Provider: &configschema.Block{ + Attributes: map[string]*configschema.Attribute{ + "in": { + Type: cty.String, + Optional: true, + }, + }, + }, + DataSources: map[string]*configschema.Block{ + "beep": {}, + }, + }) + p.ReadDataSourceResponse = &providers.ReadDataSourceResponse{ + State: cty.EmptyObjectVal, + } + + ctx := testContext2(t, &ContextOpts{ + Providers: map[addrs.Provider]providers.Factory{ + addrs.NewBuiltInProvider("beep"): testProviderFuncFixed(p), + }, + }) + + _, diags := ctx.Plan( + m, states.NewState(), + SimplePlanOpts(plans.NormalMode, InputValues{ + "in": { + Value: cty.StringVal("hello"), + SourceType: ValueFromCaller, + }, + }), + ) + assertNoDiagnostics(t, diags) + + if !p.ConfigureProviderCalled { + t.Fatal("ConfigureProvider was not called") + } + got := p.ConfigureProviderRequest.Config + want := cty.ObjectVal(map[string]cty.Value{ + // The value is not marked here, because Terraform Core unmarks it + // before calling the provider; ephemerality is Terraform Core's + // concern to deal with, not the provider's. + "in": cty.StringVal("hello"), + }) + if diff := cmp.Diff(want, got, ctydebug.CmpOptions); diff != "" { + t.Errorf("wrong provider configuration\n%s", diff) + } +} + // This test explicitly reproduces the issue described in #34976. func TestContext2Plan_34976(t *testing.T) { m := testModuleInline(t, map[string]string{ diff --git a/internal/terraform/diagnostics.go b/internal/terraform/diagnostics.go index 083f30978d..9481363ae6 100644 --- a/internal/terraform/diagnostics.go +++ b/internal/terraform/diagnostics.go @@ -27,6 +27,23 @@ func (e diagnosticCausedByUnknown) DiagnosticCausedByUnknown() bool { return bool(e) } +// diagnosticCausedByEphemeral is an implementation of +// tfdiags.DiagnosticExtraBecauseEphemeral which we can use in the "Extra" field +// of a diagnostic to indicate that the problem was caused by ephemeral values +// being involved in an expression evaluation. +// +// When using this, set the Extra to diagnosticCausedByEphemeral(true) and also +// populate the EvalContext and Expression fields of the diagnostic so that +// the diagnostic renderer can use all of that information together to assist +// the user in understanding what was ephemeral. +type diagnosticCausedByEphemeral bool + +var _ tfdiags.DiagnosticExtraBecauseEphemeral = diagnosticCausedByEphemeral(true) + +func (e diagnosticCausedByEphemeral) DiagnosticCausedByEphemeral() bool { + return bool(e) +} + // diagnosticCausedBySensitive is an implementation of // tfdiags.DiagnosticExtraBecauseSensitive which we can use in the "Extra" field // of a diagnostic to indicate that the problem was caused by sensitive values diff --git a/internal/terraform/eval_count.go b/internal/terraform/eval_count.go index 3d1f091bf4..07906c7093 100644 --- a/internal/terraform/eval_count.go +++ b/internal/terraform/eval_count.go @@ -10,6 +10,7 @@ import ( "github.com/zclconf/go-cty/cty/gocty" "github.com/hashicorp/hcl/v2" + "github.com/hashicorp/terraform/internal/lang/marks" "github.com/hashicorp/terraform/internal/tfdiags" ) @@ -74,8 +75,26 @@ func evaluateCountExpressionValue(expr hcl.Expression, ctx EvalContext) (cty.Val return nullCount, diags } - // Unmark the count value, sensitive values are allowed in count but not for_each, - // as using it here will not disclose the sensitive value + if countVal.HasMark(marks.Ephemeral) { + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Invalid count argument", + Detail: `The given "count" is derived from an ephemeral value, which means that Terraform cannot persist it between plan/apply rounds. Use only non-ephemeral values to specify the number of resource instances.`, + Subject: expr.Range().Ptr(), + + // TODO: Also populate Expression and EvalContext in here, but + // we can't easily do that right now because the hcl.EvalContext + // (which is not the same as the ctx we have in scope here) is + // hidden away inside ctx.EvaluateExpr. + Extra: diagnosticCausedByEphemeral(true), + }) + } + + // Sensitive values are allowed in count but not for_each. This is a + // somewhat-dubious decision because the number of instances planned + // will disclose exactly what the value was, but in practice it's rare + // for a number alone to be sensitive and so this is pragmatic, along with + // being required for backward-compatibility. countVal, _ = countVal.Unmark() switch { diff --git a/internal/terraform/eval_count_test.go b/internal/terraform/eval_count_test.go index d4d785c37d..307a507771 100644 --- a/internal/terraform/eval_count_test.go +++ b/internal/terraform/eval_count_test.go @@ -5,6 +5,7 @@ package terraform import ( "reflect" + "strings" "testing" "github.com/davecgh/go-spew/spew" @@ -23,7 +24,7 @@ func TestEvaluateCountExpression(t *testing.T) { hcltest.MockExprLiteral(cty.NumberIntVal(0)), 0, }, - "expression with marked value": { + "expression with sensitive value": { hcltest.MockExprLiteral(cty.NumberIntVal(8).Mark(marks.Sensitive)), 8, }, @@ -48,6 +49,21 @@ func TestEvaluateCountExpression(t *testing.T) { } } +func TestEvaluateCountExpression_ephemeral(t *testing.T) { + expr := hcltest.MockExprLiteral(cty.NumberIntVal(8).Mark(marks.Ephemeral)) + ctx := &MockEvalContext{} + ctx.installSimpleEval() + _, diags := evaluateCountExpression(expr, ctx, false) + if !diags.HasErrors() { + t.Fatalf("unexpected success; want error") + } + gotErrs := diags.Err().Error() + wantErr := `The given "count" is derived from an ephemeral value` + if !strings.Contains(gotErrs, wantErr) { + t.Errorf("missing expected error\ngot:\n%s\nwant substring: %s", gotErrs, wantErr) + } +} + func TestEvaluateCountExpression_allowUnknown(t *testing.T) { tests := map[string]struct { Expr hcl.Expression diff --git a/internal/terraform/eval_for_each.go b/internal/terraform/eval_for_each.go index bd1daf1348..d9b6b1422d 100644 --- a/internal/terraform/eval_for_each.go +++ b/internal/terraform/eval_for_each.go @@ -95,6 +95,15 @@ func (ev *forEachEvaluator) ResourceValue() (map[string]cty.Value, bool, tfdiags return res, true, diags } + if _, marks := forEachVal.Unmark(); len(marks) != 0 { + // Should not get here, because validateResource above should have + // rejected values that are marked. If we do get here then it's + // likely that we've added a new kind of mark that validateResource + // doesn't know about yet, and so we'll need to decide how for_each + // should react to that new mark. + diags = diags.Append(fmt.Errorf("for_each value is marked with %#v despite earlier validation; this is a bug in Terraform", marks)) + return res, false, diags + } res = forEachVal.AsValueMap() return res, true, diags } @@ -247,7 +256,8 @@ func (ev *forEachEvaluator) ValidateResourceValue() tfdiags.Diagnostics { func (ev *forEachEvaluator) validateResource(forEachVal cty.Value) tfdiags.Diagnostics { var diags tfdiags.Diagnostics - // give an error diagnostic as this value cannot be used in for_each + // Sensitive values are not allowed because otherwise the sensitive keys + // would get exposed as part of the instance addresses. if forEachVal.HasMark(marks.Sensitive) { diags = diags.Append(&hcl.Diagnostic{ Severity: hcl.DiagError, @@ -259,6 +269,20 @@ func (ev *forEachEvaluator) validateResource(forEachVal cty.Value) tfdiags.Diagn Extra: diagnosticCausedBySensitive(true), }) } + // Ephemeral values are not allowed because instance keys persist from + // plan to apply and between plan/apply rounds, whereas ephemeral values + // do not. + if forEachVal.HasMark(marks.Ephemeral) { + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Invalid for_each argument", + Detail: `The given "for_each" value is derived from an ephemeral value, which means that Terraform cannot persist it between plan/apply rounds. Use only non-ephemeral values to specify a resource's instance keys.`, + Subject: ev.expr.Range().Ptr(), + Expression: ev.expr, + EvalContext: ev.hclCtx, + Extra: diagnosticCausedByEphemeral(true), + }) + } if diags.HasErrors() { return diags diff --git a/internal/terraform/eval_for_each_test.go b/internal/terraform/eval_for_each_test.go index 6f4885b1d4..0f33c25133 100644 --- a/internal/terraform/eval_for_each_test.go +++ b/internal/terraform/eval_for_each_test.go @@ -66,6 +66,16 @@ func TestEvaluateForEachExpression_valid(t *testing.T) { "b": cty.BoolVal(false), }, }, + "map containing ephemeral values": { + hcltest.MockExprLiteral(cty.MapVal(map[string]cty.Value{ + "a": cty.BoolVal(true).Mark(marks.Ephemeral), + "b": cty.BoolVal(false), + })), + map[string]cty.Value{ + "a": cty.BoolVal(true).Mark(marks.Ephemeral), + "b": cty.BoolVal(false), + }, + }, } for name, test := range tests { @@ -91,84 +101,99 @@ func TestEvaluateForEachExpression_valid(t *testing.T) { func TestEvaluateForEachExpression_errors(t *testing.T) { tests := map[string]struct { - Expr hcl.Expression - Summary, DetailSubstring string - CausedByUnknown, CausedBySensitive bool + Expr hcl.Expression + Summary, DetailSubstring string + CausedByUnknown, CausedByEphemeral, CausedBySensitive bool }{ "null set": { hcltest.MockExprLiteral(cty.NullVal(cty.Set(cty.String))), "Invalid for_each argument", `the given "for_each" argument value is null`, - false, false, + false, false, false, }, "string": { hcltest.MockExprLiteral(cty.StringVal("i am definitely a set")), "Invalid for_each argument", "must be a map, or set of strings, and you have provided a value of type string", - false, false, + false, false, false, }, "list": { hcltest.MockExprLiteral(cty.ListVal([]cty.Value{cty.StringVal("a"), cty.StringVal("a")})), "Invalid for_each argument", "must be a map, or set of strings, and you have provided a value of type list", - false, false, + false, false, false, }, "tuple": { hcltest.MockExprLiteral(cty.TupleVal([]cty.Value{cty.StringVal("a"), cty.StringVal("b")})), "Invalid for_each argument", "must be a map, or set of strings, and you have provided a value of type tuple", - false, false, + false, false, false, }, "unknown string set": { hcltest.MockExprLiteral(cty.UnknownVal(cty.Set(cty.String))), "Invalid for_each argument", "set includes values derived from resource attributes that cannot be determined until apply", - true, false, + true, false, false, }, "unknown map": { hcltest.MockExprLiteral(cty.UnknownVal(cty.Map(cty.Bool))), "Invalid for_each argument", "map includes keys derived from resource attributes that cannot be determined until apply", - true, false, + true, false, false, }, - "marked map": { + "sensitive map": { hcltest.MockExprLiteral(cty.MapVal(map[string]cty.Value{ "a": cty.BoolVal(true), "b": cty.BoolVal(false), }).Mark(marks.Sensitive)), "Invalid for_each argument", "Sensitive values, or values derived from sensitive values, cannot be used as for_each arguments. If used, the sensitive value could be exposed as a resource instance key.", - false, true, + false, false, true, + }, + "ephemeral map": { + hcltest.MockExprLiteral(cty.MapVal(map[string]cty.Value{ + "a": cty.BoolVal(true), + "b": cty.BoolVal(false), + }).Mark(marks.Ephemeral)), + "Invalid for_each argument", + `The given "for_each" value is derived from an ephemeral value`, + false, true, false, }, "set containing booleans": { hcltest.MockExprLiteral(cty.SetVal([]cty.Value{cty.BoolVal(true)})), "Invalid for_each set argument", "supports maps and sets of strings, but you have provided a set containing type bool", - false, false, + false, false, false, }, "set containing null": { hcltest.MockExprLiteral(cty.SetVal([]cty.Value{cty.NullVal(cty.String)})), "Invalid for_each set argument", "must not contain null values", - false, false, + false, false, false, }, "set containing unknown value": { hcltest.MockExprLiteral(cty.SetVal([]cty.Value{cty.UnknownVal(cty.String)})), "Invalid for_each argument", "set includes values derived from resource attributes that cannot be determined until apply", - true, false, + true, false, false, }, "set containing dynamic unknown value": { hcltest.MockExprLiteral(cty.SetVal([]cty.Value{cty.UnknownVal(cty.DynamicPseudoType)})), "Invalid for_each argument", "set includes values derived from resource attributes that cannot be determined until apply", - true, false, + true, false, false, }, - "set containing marked values": { + "set containing sensitive values": { hcltest.MockExprLiteral(cty.SetVal([]cty.Value{cty.StringVal("beep").Mark(marks.Sensitive), cty.StringVal("boop")})), "Invalid for_each argument", "Sensitive values, or values derived from sensitive values, cannot be used as for_each arguments. If used, the sensitive value could be exposed as a resource instance key.", - false, true, + false, false, true, + }, + "set containing ephemeral values": { + hcltest.MockExprLiteral(cty.SetVal([]cty.Value{cty.StringVal("beep").Mark(marks.Ephemeral), cty.StringVal("boop")})), + "Invalid for_each argument", + `The given "for_each" value is derived from an ephemeral value`, + false, true, false, }, } @@ -204,6 +229,9 @@ func TestEvaluateForEachExpression_errors(t *testing.T) { if got, want := tfdiags.DiagnosticCausedByUnknown(diags[0]), test.CausedByUnknown; got != want { t.Errorf("wrong result from tfdiags.DiagnosticCausedByUnknown\ngot: %#v\nwant: %#v", got, want) } + if got, want := tfdiags.DiagnosticCausedByEphemeral(diags[0]), test.CausedByEphemeral; got != want { + t.Errorf("wrong result from tfdiags.DiagnosticCausedByEphemeral\ngot: %#v\nwant: %#v", got, want) + } if got, want := tfdiags.DiagnosticCausedBySensitive(diags[0]), test.CausedBySensitive; got != want { t.Errorf("wrong result from tfdiags.DiagnosticCausedBySensitive\ngot: %#v\nwant: %#v", got, want) } diff --git a/internal/terraform/eval_variable.go b/internal/terraform/eval_variable.go index fc34598a92..90c50fb1b6 100644 --- a/internal/terraform/eval_variable.go +++ b/internal/terraform/eval_variable.go @@ -189,6 +189,36 @@ func prepareFinalInputVariableValue(addr addrs.AbsInputVariableInstance, raw *In } } + if cfg.Ephemeral { + // An ephemeral input variable always has an ephemeral value inside the + // module, even if the value assigned to it from outside is not. This + // is a useful simplification so that module authors can be explicit + // about what guarantees they are intending to make (regardless of + // current implementation details). Changing the ephemerality of an + // input variable is a breaking change to a module's API. + val = val.Mark(marks.Ephemeral) + } else { + if marks.Contains(val, marks.Ephemeral) { + var subject hcl.Range + if raw.HasSourceRange() { + subject = raw.SourceRange.ToHCL() + } else { + // We shouldn't typically get here for ephemeral values, because + // all of the source types that can represent expressions that + // could potentially produce ephemeral values are those which + // have source locations. This is just here for robustness. + subject = cfg.DeclRange + } + + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Ephemeral value not allowed", + Detail: "This input variable is not declared as accepting a ephemeral values, so it cannot be set to a result derived from an ephemeral value.", + Subject: subject.Ptr(), + }) + } + } + return val, diags } diff --git a/internal/terraform/evaluate.go b/internal/terraform/evaluate.go index 6e59436af7..b0b2417556 100644 --- a/internal/terraform/evaluate.go +++ b/internal/terraform/evaluate.go @@ -274,19 +274,27 @@ func (d *evaluationStateData) GetInputVariable(addr addrs.InputVariable, rng tfd // being liberal in what it accepts because the subsequent plan walk has // more information available and so can be more conservative. if d.Operation == walkValidate { - // Ensure variable sensitivity is captured in the validate walk + // We should still capture the statically-configured marks during + // the validate walk. + ret := cty.UnknownVal(config.Type) if config.Sensitive { - return cty.UnknownVal(config.Type).Mark(marks.Sensitive), diags + ret = ret.Mark(marks.Sensitive) } - return cty.UnknownVal(config.Type), diags + if config.Ephemeral { + ret = ret.Mark(marks.Ephemeral) + } + return ret, diags } val := d.Evaluator.NamedValues.GetInputVariableValue(d.ModulePath.InputVariable(addr.Name)) - // Mark if sensitive + // Mark if sensitive and/or ephemeral if config.Sensitive { val = val.Mark(marks.Sensitive) } + if config.Ephemeral { + val = val.Mark(marks.Ephemeral) + } return val, diags } diff --git a/internal/terraform/node_output.go b/internal/terraform/node_output.go index a036438400..e8735ca406 100644 --- a/internal/terraform/node_output.go +++ b/internal/terraform/node_output.go @@ -471,6 +471,33 @@ If you do intend to export this data, annotate the output value as sensitive by } return diags } + + // The checks below this point are intentionally not opted out by + // "flagWarnOutputErrors", because they relate to features that were added + // more recently than the historical change to treat invalid output values + // as errors rather than warnings. + + if n.Config.Ephemeral { + // An ephemeral output value always produces an ephemeral result, + // even if the value assigned to it internally is not. This is + // a useful simplification so that module authors can be + // explicit about what guarantees they are intending to make + // (regardless of current implementation details). Marking an + // output value as ephemeral when it wasn't before is always a + // breaking change to a module's API. + val = val.Mark(marks.Ephemeral) + } else { + if marks.Contains(val, marks.Ephemeral) { + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Ephemeral value not allowed", + Detail: "This output value is not declared as returning an ephemeral value, so it cannot be set to a result derived from an ephemeral value.", + Subject: n.Config.Expr.Range().Ptr(), + }) + return diags + } + } + n.setValue(ctx.NamedValues(), state, changes, val) // If we were able to evaluate a new value, we can update that in the @@ -694,23 +721,26 @@ func (n *NodeApplyableOutput) setValue(namedVals *namedvals.State, state *states action = plans.NoOp } - change := &plans.OutputChange{ - Addr: n.Addr, - Sensitive: sensitiveChange, - Change: plans.Change{ - Action: action, - Before: before, - After: val, - }, - } + // Non-ephemeral output values get their changes recorded in the plan + if !n.Config.Ephemeral { + change := &plans.OutputChange{ + Addr: n.Addr, + Sensitive: sensitiveChange, + Change: plans.Change{ + Action: action, + Before: before, + After: val, + }, + } - cs, err := change.Encode() - if err != nil { - // Should never happen, since we just constructed this right above - panic(fmt.Sprintf("planned change for %s could not be encoded: %s", n.Addr, err)) + cs, err := change.Encode() + if err != nil { + // Should never happen, since we just constructed this right above + panic(fmt.Sprintf("planned change for %s could not be encoded: %s", n.Addr, err)) + } + log.Printf("[TRACE] setValue: Saving %s change for %s in changeset", change.Action, n.Addr) + changes.AppendOutputChange(cs) // add the new planned change } - log.Printf("[TRACE] setValue: Saving %s change for %s in changeset", change.Action, n.Addr) - changes.AppendOutputChange(cs) // add the new planned change } if changes != nil && !n.Planning { @@ -732,19 +762,27 @@ func (n *NodeApplyableOutput) setValue(namedVals *namedvals.State, state *states // with a different state, since we only have one namedVals regardless // of how many states are involved in an operation. if namedVals != nil { - namedVals.SetOutputValue(n.Addr, val) + saveVal := val + if n.Config.Ephemeral { + // Downstream uses of this output value must propagate the + // ephemerality. + saveVal = saveVal.Mark(marks.Ephemeral) + } + namedVals.SetOutputValue(n.Addr, saveVal) } - // The state itself doesn't represent unknown values, so we null them - // out here and then we'll save the real unknown value in the planned - // changeset, if we have one on this graph walk. - log.Printf("[TRACE] setValue: Saving value for %s in state", n.Addr) - // non-root outputs need to keep sensitive marks for evaluation, but are - // not serialized. - if n.Addr.Module.IsRoot() { - val, _ = val.UnmarkDeep() - val = cty.UnknownAsNull(val) + // Non-ephemeral output values get saved in the state too + if !n.Config.Ephemeral { + // The state itself doesn't represent unknown values, so we null them + // out here and then we'll save the real unknown value in the planned + // changeset, if we have one on this graph walk. + log.Printf("[TRACE] setValue: Saving value for %s in state", n.Addr) + // non-root outputs need to keep sensitive marks for evaluation, but are + // not serialized. + if n.Addr.Module.IsRoot() { + val, _ = val.UnmarkDeep() + val = cty.UnknownAsNull(val) + } + state.SetOutputValue(n.Addr, val, n.Config.Sensitive) } - - state.SetOutputValue(n.Addr, val, n.Config.Sensitive) } diff --git a/internal/terraform/node_resource_abstract_instance.go b/internal/terraform/node_resource_abstract_instance.go index d298961ff5..6d6a88b9af 100644 --- a/internal/terraform/node_resource_abstract_instance.go +++ b/internal/terraform/node_resource_abstract_instance.go @@ -841,7 +841,10 @@ func (n *NodeAbstractResourceInstance) plan( origConfigVal, _, configDiags := ctx.EvaluateBlock(config.Config, schema, nil, keyData) diags = diags.Append(configDiags) - if configDiags.HasErrors() { + diags = diags.Append( + validateResourceForbiddenEphemeralValues(ctx, origConfigVal, schema).InConfigBody(n.Config.Config, n.Addr.String()), + ) + if diags.HasErrors() { return nil, nil, deferred, keyData, diags } @@ -1711,7 +1714,10 @@ func (n *NodeAbstractResourceInstance) planDataSource(ctx EvalContext, checkRule var configDiags tfdiags.Diagnostics configVal, _, configDiags = ctx.EvaluateBlock(config.Config, schema, nil, keyData) diags = diags.Append(configDiags) - if configDiags.HasErrors() { + diags = diags.Append( + validateResourceForbiddenEphemeralValues(ctx, configVal, schema).InConfigBody(n.Config.Config, n.Addr.String()), + ) + if diags.HasErrors() { return nil, nil, keyData, diags } unmarkedConfigVal, unmarkedPaths := configVal.UnmarkDeepWithPaths() diff --git a/internal/terraform/node_resource_validate.go b/internal/terraform/node_resource_validate.go index 5d96607b34..995670f2e0 100644 --- a/internal/terraform/node_resource_validate.go +++ b/internal/terraform/node_resource_validate.go @@ -15,6 +15,7 @@ import ( "github.com/hashicorp/terraform/internal/configs/configschema" "github.com/hashicorp/terraform/internal/didyoumean" "github.com/hashicorp/terraform/internal/instances" + "github.com/hashicorp/terraform/internal/lang/ephemeral" "github.com/hashicorp/terraform/internal/lang/langrefs" "github.com/hashicorp/terraform/internal/providers" "github.com/hashicorp/terraform/internal/provisioners" @@ -380,6 +381,9 @@ func (n *NodeValidatableResource) validateResource(ctx EvalContext) tfdiags.Diag if valDiags.HasErrors() { return diags } + diags = diags.Append( + validateResourceForbiddenEphemeralValues(ctx, configVal, schema).InConfigBody(n.Config.Config, n.Addr.String()), + ) if n.Config.Managed != nil { // can be nil only in tests with poorly-configured mocks for _, traversal := range n.Config.Managed.IgnoreChanges { @@ -454,6 +458,9 @@ func (n *NodeValidatableResource) validateResource(ctx EvalContext) tfdiags.Diag if valDiags.HasErrors() { return diags } + diags = diags.Append( + validateResourceForbiddenEphemeralValues(ctx, configVal, schema).InConfigBody(n.Config.Config, n.Addr.String()), + ) // Use unmarked value for validate request unmarkedConfigVal, _ := configVal.UnmarkDeep() @@ -585,3 +592,30 @@ func validateDependsOn(ctx EvalContext, dependsOn []hcl.Traversal) (diags tfdiag } return diags } + +// validateResourceForbiddenEphemeralValues returns an error diagnostic for each +// value anywhere inside the given value that is marked as ephemeral, for +// situations where ephemeral values are not permitted. +// +// All returned diagnostics are contextual diagnostics that must be finalized +// by calling [tfdiags.Diagnostics.InConfigBody] before returning them to +// any caller that expects fully-resolved diagnostics. +func validateResourceForbiddenEphemeralValues(ctx EvalContext, value cty.Value, schema *configschema.Block) (diags tfdiags.Diagnostics) { + // NOTE: We take a schema argument in anticipation of a future feature + // that might allow managed resources to declare certain attributes as + // being "write-only", which would create a little nested island where + // ephemeral values are permitted in return for providers accepting that + // those values will not be preserved between plan and apply or between + // sequential plan/apply rounds. But we aren't doing that yet, so we + // just ignore that argument for now. + + for _, path := range ephemeral.EphemeralValuePaths(value) { + diags = diags.Append(tfdiags.AttributeValue( + tfdiags.Error, + "Invalid use of ephemeral value", + "Ephemeral values are not valid in resource arguments, because resource instances must persist between Terraform phases.", + path, + )) + } + return diags +} diff --git a/internal/tfdiags/diagnostic_extra.go b/internal/tfdiags/diagnostic_extra.go index 6a1e0e845d..944c58da9e 100644 --- a/internal/tfdiags/diagnostic_extra.go +++ b/internal/tfdiags/diagnostic_extra.go @@ -147,6 +147,40 @@ func DiagnosticCausedByUnknown(diag Diagnostic) bool { return maybe.DiagnosticCausedByUnknown() } +// DiagnosticExtraBecauseEphemeral is an interface implemented by values in +// the Extra field of Diagnostic when the diagnostic is potentially caused by +// the presence of ephemeral values in an expression evaluation. +// +// Just implementing this interface is not sufficient signal, though. Callers +// must also call the DiagnosticCausedByEphemeral method in order to confirm +// the result, or use the package-level function DiagnosticCausedByEphemeral +// as a convenient wrapper. +type DiagnosticExtraBecauseEphemeral interface { + // DiagnosticCausedByEphemeral returns true if the associated diagnostic + // was caused by the presence of ephemeral values during an expression + // evaluation, or false otherwise. + // + // Callers might use this to tailor what contextual information they show + // alongside an error report in the UI, to avoid potential confusion + // caused by talking about the presence of deferred values if that was + // immaterial to the error. + DiagnosticCausedByEphemeral() bool +} + +// DiagnosticCausedByEphemeral returns true if the given diagnostic has an +// indication that it was caused by the presence of deferred values during +// an expression evaluation. +// +// This is a wrapper around checking if the diagnostic's extra info implements +// interface DiagnosticExtraBecauseDeferred and then calling its method if so. +func DiagnosticCausedByEphemeral(diag Diagnostic) bool { + maybe := ExtraInfo[DiagnosticExtraBecauseEphemeral](diag) + if maybe == nil { + return false + } + return maybe.DiagnosticCausedByEphemeral() +} + // DiagnosticExtraBecauseSensitive is an interface implemented by values in // the Extra field of Diagnostic when the diagnostic is potentially caused by // the presence of sensitive values in an expression evaluation. From 641219bd19a554de0bb64043796dc998bb1f7f2d Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Thu, 18 Apr 2024 11:41:34 -0700 Subject: [PATCH 152/161] plans: Track input variables that must be re-supplied during apply We'll use this to track what subset of the ephemeral input variables were set in the planning options, and which ones must therefore be re-supplied in the apply phase options. This new plan field is not yet populated anywhere. The uses of this will follow in subsequent commits. --- internal/plans/plan.go | 24 +- internal/plans/planfile/planfile_test.go | 3 +- internal/plans/planfile/tfplan.go | 14 + internal/plans/planfile/tfplan_test.go | 4 + internal/plans/planproto/planfile.pb.go | 468 ++++++++++++----------- internal/plans/planproto/planfile.proto | 3 + 6 files changed, 285 insertions(+), 231 deletions(-) diff --git a/internal/plans/plan.go b/internal/plans/plan.go index d4529cc896..a1c08418c7 100644 --- a/internal/plans/plan.go +++ b/internal/plans/plan.go @@ -10,6 +10,7 @@ import ( "github.com/zclconf/go-cty/cty" "github.com/hashicorp/terraform/internal/addrs" + "github.com/hashicorp/terraform/internal/collections" "github.com/hashicorp/terraform/internal/configs/configschema" "github.com/hashicorp/terraform/internal/lang/globalref" "github.com/hashicorp/terraform/internal/moduletest/mocking" @@ -42,8 +43,27 @@ type Plan struct { // checked carefully against existing destroy behaviors. UIMode Mode - VariableValues map[string]DynamicValue - VariableMarks map[string][]cty.PathValueMarks + // VariableValues, VariableMarks, and ApplyTimeVariables together describe + // how Terraform should decide the input variable values for the apply + // phase if this plan is to be applied. + // + // VariableValues and VariableMarks describe persisted (non-ephemeral) + // values that were set as part of the planning options and are to be + // re-used during the apply phase. VariableValues can potentially contain + // unknown values for a speculative plan, but the variable values must + // all be known for a plan that will subsequently be applied. + // + // ApplyTimeVariables retains the names of any ephemeral variables that were + // set (non-null) during the planning phase and must therefore be + // re-supplied by the caller (potentially with different values) during + // the apply phase. Ephemeral input variables are intended for populating + // arguments for other ephemeral objects in the configuration, such as + // provider configurations. Although the values for these variables can + // change between plan and apply, their "nullness" may not. + VariableValues map[string]DynamicValue + VariableMarks map[string][]cty.PathValueMarks + ApplyTimeVariables collections.Set[string] + Changes *Changes DriftedResources []*ResourceInstanceChangeSrc DeferredResources []*DeferredResourceInstanceChangeSrc diff --git a/internal/plans/planfile/planfile_test.go b/internal/plans/planfile/planfile_test.go index d55614246d..8dadf1f738 100644 --- a/internal/plans/planfile/planfile_test.go +++ b/internal/plans/planfile/planfile_test.go @@ -11,6 +11,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/hashicorp/terraform/internal/addrs" + "github.com/hashicorp/terraform/internal/collections" "github.com/hashicorp/terraform/internal/configs/configload" "github.com/hashicorp/terraform/internal/depsfile" "github.com/hashicorp/terraform/internal/getproviders/providerreqs" @@ -119,7 +120,7 @@ func TestRoundtrip(t *testing.T) { if err != nil { t.Fatalf("failed to read plan: %s", err) } - if diff := cmp.Diff(planIn, planOut); diff != "" { + if diff := cmp.Diff(planIn, planOut, collections.CmpOptions); diff != "" { t.Errorf("plan did not survive round-trip\n%s", diff) } }) diff --git a/internal/plans/planfile/tfplan.go b/internal/plans/planfile/tfplan.go index 20f7c6f90e..01be61b507 100644 --- a/internal/plans/planfile/tfplan.go +++ b/internal/plans/planfile/tfplan.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/checks" + "github.com/hashicorp/terraform/internal/collections" "github.com/hashicorp/terraform/internal/lang/globalref" "github.com/hashicorp/terraform/internal/plans" "github.com/hashicorp/terraform/internal/plans/planproto" @@ -165,6 +166,13 @@ func readTfplan(r io.Reader) (*plans.Plan, error) { plan.VariableValues[name] = val } + if len(rawPlan.ApplyTimeVariables) != 0 { + plan.ApplyTimeVariables = collections.NewSetCmp[string]() + for _, name := range rawPlan.ApplyTimeVariables { + plan.ApplyTimeVariables.Add(name) + } + } + for _, hash := range rawPlan.ProviderFunctionResults { plan.ProviderFunctionResults = append(plan.ProviderFunctionResults, providers.FunctionHash{ @@ -589,6 +597,12 @@ func writeTfplan(plan *plans.Plan, w io.Writer) error { for name, val := range plan.VariableValues { rawPlan.Variables[name] = valueToTfplan(val) } + if plan.ApplyTimeVariables.Len() != 0 { + rawPlan.ApplyTimeVariables = make([]string, 0, plan.ApplyTimeVariables.Len()) + for _, name := range plan.ApplyTimeVariables.Elems() { + rawPlan.ApplyTimeVariables = append(rawPlan.ApplyTimeVariables, name) + } + } for _, hash := range plan.ProviderFunctionResults { rawPlan.ProviderFunctionResults = append(rawPlan.ProviderFunctionResults, diff --git a/internal/plans/planfile/tfplan_test.go b/internal/plans/planfile/tfplan_test.go index 73bad353a7..715c3c4d0f 100644 --- a/internal/plans/planfile/tfplan_test.go +++ b/internal/plans/planfile/tfplan_test.go @@ -12,6 +12,7 @@ import ( "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/checks" + "github.com/hashicorp/terraform/internal/collections" "github.com/hashicorp/terraform/internal/lang/globalref" "github.com/hashicorp/terraform/internal/plans" "github.com/hashicorp/terraform/internal/providers" @@ -22,6 +23,8 @@ func TestTFPlanRoundTrip(t *testing.T) { objTy := cty.Object(map[string]cty.Type{ "id": cty.String, }) + applyTimeVariables := collections.NewSetCmp[string]() + applyTimeVariables.Add("bar") plan := &plans.Plan{ Applyable: true, @@ -29,6 +32,7 @@ func TestTFPlanRoundTrip(t *testing.T) { VariableValues: map[string]plans.DynamicValue{ "foo": mustNewDynamicValueStr("foo value"), }, + ApplyTimeVariables: applyTimeVariables, Changes: &plans.Changes{ Outputs: []*plans.OutputChangeSrc{ { diff --git a/internal/plans/planproto/planfile.pb.go b/internal/plans/planproto/planfile.pb.go index 3561f3539c..c7e1dda063 100644 --- a/internal/plans/planproto/planfile.pb.go +++ b/internal/plans/planproto/planfile.pb.go @@ -448,6 +448,8 @@ type Plan struct { // The variables that were set when creating the plan. Each value is // a msgpack serialization of an HCL value. Variables map[string]*DynamicValue `protobuf:"bytes,2,rep,name=variables,proto3" json:"variables,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Variables whose values must be provided during the apply phase. + ApplyTimeVariables []string `protobuf:"bytes,28,rep,name=apply_time_variables,json=applyTimeVariables,proto3" json:"apply_time_variables,omitempty"` // An unordered set of proposed changes to resources throughout the // configuration, including any nested modules. Use the address of // each resource to determine which module it belongs to. @@ -568,6 +570,13 @@ func (x *Plan) GetVariables() map[string]*DynamicValue { return nil } +func (x *Plan) GetApplyTimeVariables() []string { + if x != nil { + return x.ApplyTimeVariables + } + return nil +} + func (x *Plan) GetResourceChanges() []*ResourceInstanceChange { if x != nil { return x.ResourceChanges @@ -1635,7 +1644,7 @@ var File_planfile_proto protoreflect.FileDescriptor var file_planfile_proto_rawDesc = []byte{ 0x0a, 0x0e, 0x70, 0x6c, 0x61, 0x6e, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x12, 0x06, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x22, 0xca, 0x08, 0x0a, 0x04, 0x50, 0x6c, 0x61, + 0x12, 0x06, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x22, 0xfc, 0x08, 0x0a, 0x04, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x07, 0x75, 0x69, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x74, @@ -1649,236 +1658,239 @@ var file_planfile_proto_rawDesc = []byte{ 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x12, 0x49, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0f, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x0e, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x72, 0x69, 0x66, 0x74, 0x18, 0x12, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x72, - 0x69, 0x66, 0x74, 0x12, 0x51, 0x0a, 0x10, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x1b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0e, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, - 0x52, 0x0c, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x21, - 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, - 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, - 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x65, - 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, - 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, - 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x4b, 0x0a, 0x13, 0x72, 0x65, 0x6c, - 0x65, 0x76, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, - 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, - 0x50, 0x6c, 0x61, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x74, - 0x74, 0x72, 0x52, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x41, 0x74, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5c, 0x0a, 0x19, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, - 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x48, 0x61, 0x73, 0x68, 0x52, 0x17, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x1a, 0x52, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x44, - 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x04, 0x61, 0x74, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x73, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x1c, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x12, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x45, + 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x64, 0x72, 0x69, 0x66, 0x74, + 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x44, 0x72, 0x69, 0x66, 0x74, 0x12, 0x51, 0x0a, 0x10, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, + 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x1b, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, + 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0e, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x0d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, + 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x52, 0x0c, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x41, 0x64, + 0x64, 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x11, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, 0x6d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x29, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x4b, 0x0a, 0x13, 0x72, + 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, + 0x6e, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x61, 0x74, 0x74, 0x72, 0x52, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x41, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5c, 0x0a, 0x19, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x61, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x46, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x48, 0x61, 0x73, 0x68, 0x52, 0x17, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x1a, 0x52, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, + 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4d, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x04, 0x61, 0x74, 0x74, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x50, 0x61, 0x74, + 0x68, 0x52, 0x04, 0x61, 0x74, 0x74, 0x72, 0x22, 0x69, 0x0a, 0x07, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, + 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x22, 0xc0, 0x02, 0x0a, 0x06, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x26, 0x0a, + 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x44, + 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x16, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x65, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x50, 0x61, 0x74, + 0x68, 0x52, 0x14, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x53, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x40, 0x0a, 0x15, 0x61, 0x66, 0x74, 0x65, 0x72, + 0x5f, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, + 0x50, 0x61, 0x74, 0x68, 0x52, 0x13, 0x61, 0x66, 0x74, 0x65, 0x72, 0x53, 0x65, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x2f, 0x0a, 0x09, 0x69, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, + 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x09, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x29, 0x0a, 0x10, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xd3, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x61, 0x64, 0x64, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x72, 0x75, 0x6e, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x65, + 0x76, 0x52, 0x75, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6f, + 0x73, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, + 0x65, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, - 0x04, 0x61, 0x74, 0x74, 0x72, 0x22, 0x69, 0x0a, 0x07, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x44, 0x79, - 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x22, 0xc0, 0x02, 0x0a, 0x06, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x74, 0x66, - 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x44, 0x79, 0x6e, - 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x12, 0x42, 0x0a, 0x16, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x65, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, - 0x14, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x53, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x40, 0x0a, 0x15, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x73, - 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x50, 0x61, - 0x74, 0x68, 0x52, 0x13, 0x61, 0x66, 0x74, 0x65, 0x72, 0x53, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x2f, 0x0a, 0x09, 0x69, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x61, 0x6e, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x09, 0x69, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x29, 0x0a, 0x10, 0x67, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x22, 0xd3, 0x02, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, - 0x64, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x52, - 0x75, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x65, - 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, - 0x6f, 0x73, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x64, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0c, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0f, 0x72, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x12, 0x49, - 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x86, 0x01, 0x0a, 0x1e, 0x44, 0x65, - 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x08, - 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, - 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x06, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x66, 0x70, - 0x6c, 0x61, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x22, 0x68, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x22, 0xfc, 0x03, 0x0a, - 0x0c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x33, 0x0a, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x74, 0x66, + 0x0f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, + 0x12, 0x49, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x0c, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x86, 0x01, 0x0a, 0x1e, + 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x2c, + 0x0a, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x65, 0x64, 0x52, 0x08, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x06, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, + 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x22, 0x68, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, + 0x6e, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x22, 0xfc, + 0x03, 0x0a, 0x0c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, + 0x33, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, + 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x41, 0x64, 0x64, 0x72, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x07, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x41, - 0x64, 0x64, 0x72, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x74, 0x66, 0x70, 0x6c, + 0x73, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x1a, 0x8f, 0x01, 0x0a, 0x0c, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x1a, 0x8f, 0x01, 0x0a, 0x0c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, - 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x0a, 0x10, - 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x34, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, - 0x0a, 0x04, 0x50, 0x41, 0x53, 0x53, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x49, 0x4c, - 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x22, 0x5c, 0x0a, - 0x0a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0f, 0x0a, 0x0b, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, - 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x55, - 0x54, 0x50, 0x55, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, - 0x43, 0x48, 0x45, 0x43, 0x4b, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x50, 0x55, 0x54, - 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x44, 0x0a, 0x18, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x61, 0x6c, 0x6c, 0x48, 0x61, 0x73, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x22, 0x28, 0x0a, 0x0c, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x70, 0x61, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x70, 0x61, 0x63, 0x6b, 0x22, 0xa5, 0x01, 0x0a, 0x04, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x27, 0x0a, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x50, 0x61, 0x74, - 0x68, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x52, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x1a, 0x74, 0x0a, - 0x04, 0x53, 0x74, 0x65, 0x70, 0x12, 0x27, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x0d, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, - 0x0a, 0x0b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x44, 0x79, 0x6e, - 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x65, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x22, 0x1b, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x22, 0x3a, 0x0a, 0x08, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x06, - 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, - 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2a, 0x31, 0x0a, 0x04, - 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, - 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x53, 0x54, 0x52, 0x4f, 0x59, 0x10, 0x01, 0x12, 0x10, 0x0a, - 0x0c, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x2a, - 0x94, 0x01, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, - 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x01, - 0x12, 0x08, 0x0a, 0x04, 0x52, 0x45, 0x41, 0x44, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, - 0x44, 0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, - 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x54, 0x48, 0x45, - 0x4e, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x06, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x52, - 0x45, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x48, 0x45, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, - 0x10, 0x07, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x4f, 0x52, 0x47, 0x45, 0x54, 0x10, 0x08, 0x12, 0x16, - 0x0a, 0x12, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x48, 0x45, 0x4e, 0x5f, 0x46, 0x4f, - 0x52, 0x47, 0x45, 0x54, 0x10, 0x09, 0x2a, 0xc8, 0x03, 0x0a, 0x1c, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, - 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x5f, 0x42, 0x45, 0x43, - 0x41, 0x55, 0x53, 0x45, 0x5f, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x16, - 0x0a, 0x12, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x5f, 0x42, 0x59, 0x5f, 0x52, 0x45, 0x51, - 0x55, 0x45, 0x53, 0x54, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, - 0x45, 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, - 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x45, 0x4c, - 0x45, 0x54, 0x45, 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x52, - 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x10, 0x04, - 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, - 0x53, 0x45, 0x5f, 0x57, 0x52, 0x4f, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x50, 0x45, 0x54, 0x49, 0x54, - 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, - 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x49, 0x4e, - 0x44, 0x45, 0x58, 0x10, 0x06, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, - 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x45, 0x41, 0x43, 0x48, 0x5f, 0x4b, 0x45, 0x59, - 0x10, 0x07, 0x12, 0x1c, 0x0a, 0x18, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x42, 0x45, 0x43, - 0x41, 0x55, 0x53, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x10, 0x08, - 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x5f, 0x42, 0x59, 0x5f, 0x54, - 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x53, 0x10, 0x09, 0x12, 0x1f, 0x0a, 0x1b, 0x52, 0x45, 0x41, - 0x44, 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, - 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x0a, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, - 0x41, 0x44, 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x45, 0x4e, - 0x44, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x0b, 0x12, - 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, - 0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x4e, 0x45, 0x53, 0x54, 0x45, 0x44, 0x10, 0x0d, 0x12, 0x21, - 0x0a, 0x1d, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, - 0x5f, 0x4e, 0x4f, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x10, - 0x0c, 0x2a, 0x9b, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x52, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, - 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, - 0x55, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x1b, 0x0a, - 0x17, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, - 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x50, 0x52, - 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x42, 0x53, 0x45, 0x4e, - 0x54, 0x5f, 0x50, 0x52, 0x45, 0x52, 0x45, 0x51, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x45, - 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x5f, 0x50, 0x52, 0x45, 0x52, 0x45, 0x51, 0x10, 0x05, 0x42, - 0x39, 0x5a, 0x37, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, 0x6f, 0x72, - 0x6d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x6c, 0x61, 0x6e, 0x73, - 0x2f, 0x70, 0x6c, 0x61, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, + 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, + 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x34, 0x0a, 0x06, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, + 0x12, 0x08, 0x0a, 0x04, 0x50, 0x41, 0x53, 0x53, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, + 0x49, 0x4c, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x22, + 0x5c, 0x0a, 0x0a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0f, 0x0a, + 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, + 0x0a, 0x08, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, + 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x02, 0x12, 0x09, + 0x0a, 0x05, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x50, + 0x55, 0x54, 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x44, 0x0a, + 0x18, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x48, 0x61, 0x73, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x22, 0x28, 0x0a, 0x0c, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x73, 0x67, 0x70, 0x61, 0x63, 0x6b, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6d, 0x73, 0x67, 0x70, 0x61, 0x63, 0x6b, 0x22, 0xa5, 0x01, + 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x27, 0x0a, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x50, + 0x61, 0x74, 0x68, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x52, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x1a, + 0x74, 0x0a, 0x04, 0x53, 0x74, 0x65, 0x70, 0x12, 0x27, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0d, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x37, 0x0a, 0x0b, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x44, + 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x65, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x1b, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, + 0x6e, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x22, 0x3a, 0x0a, 0x08, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x12, 0x2e, + 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, + 0x2e, 0x74, 0x66, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, + 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2a, 0x31, + 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, + 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x53, 0x54, 0x52, 0x4f, 0x59, 0x10, 0x01, 0x12, + 0x10, 0x0a, 0x0c, 0x52, 0x45, 0x46, 0x52, 0x45, 0x53, 0x48, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, + 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, + 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, + 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x45, 0x41, 0x44, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, + 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, + 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x54, + 0x48, 0x45, 0x4e, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x06, 0x12, 0x16, 0x0a, 0x12, + 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x48, 0x45, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, + 0x54, 0x45, 0x10, 0x07, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x4f, 0x52, 0x47, 0x45, 0x54, 0x10, 0x08, + 0x12, 0x16, 0x0a, 0x12, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x48, 0x45, 0x4e, 0x5f, + 0x46, 0x4f, 0x52, 0x47, 0x45, 0x54, 0x10, 0x09, 0x2a, 0xc8, 0x03, 0x0a, 0x1c, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, + 0x45, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x5f, 0x42, + 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x54, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x44, 0x10, 0x01, + 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x5f, 0x42, 0x59, 0x5f, 0x52, + 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x50, 0x4c, + 0x41, 0x43, 0x45, 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x43, 0x41, 0x4e, 0x4e, + 0x4f, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x03, 0x12, 0x25, 0x0a, 0x21, 0x44, + 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x4e, 0x4f, + 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, + 0x10, 0x04, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x42, 0x45, 0x43, + 0x41, 0x55, 0x53, 0x45, 0x5f, 0x57, 0x52, 0x4f, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x50, 0x45, 0x54, + 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x44, 0x45, 0x4c, 0x45, 0x54, + 0x45, 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, + 0x49, 0x4e, 0x44, 0x45, 0x58, 0x10, 0x06, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x45, 0x4c, 0x45, 0x54, + 0x45, 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x45, 0x41, 0x43, 0x48, 0x5f, 0x4b, + 0x45, 0x59, 0x10, 0x07, 0x12, 0x1c, 0x0a, 0x18, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x42, + 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, + 0x10, 0x08, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x5f, 0x42, 0x59, + 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x53, 0x10, 0x09, 0x12, 0x1f, 0x0a, 0x1b, 0x52, + 0x45, 0x41, 0x44, 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, + 0x49, 0x47, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x0a, 0x12, 0x23, 0x0a, 0x1f, + 0x52, 0x45, 0x41, 0x44, 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, 0x45, 0x5f, 0x44, 0x45, 0x50, + 0x45, 0x4e, 0x44, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, + 0x0b, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x41, 0x44, 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, 0x53, + 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x4e, 0x45, 0x53, 0x54, 0x45, 0x44, 0x10, 0x0d, + 0x12, 0x21, 0x0a, 0x1d, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x42, 0x45, 0x43, 0x41, 0x55, + 0x53, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, + 0x54, 0x10, 0x0c, 0x2a, 0x9b, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, + 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, + 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, + 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, + 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, + 0x49, 0x47, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, + 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x5f, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x42, 0x53, + 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x45, 0x52, 0x45, 0x51, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, + 0x44, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x5f, 0x50, 0x52, 0x45, 0x52, 0x45, 0x51, 0x10, + 0x05, 0x42, 0x39, 0x5a, 0x37, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x74, 0x65, 0x72, 0x72, 0x61, 0x66, + 0x6f, 0x72, 0x6d, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x6c, 0x61, + 0x6e, 0x73, 0x2f, 0x70, 0x6c, 0x61, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/internal/plans/planproto/planfile.proto b/internal/plans/planproto/planfile.proto index 882c00a80c..c117bc14de 100644 --- a/internal/plans/planproto/planfile.proto +++ b/internal/plans/planproto/planfile.proto @@ -61,6 +61,9 @@ message Plan { // a msgpack serialization of an HCL value. map variables = 2; + // Variables whose values must be provided during the apply phase. + repeated string apply_time_variables = 28; + // An unordered set of proposed changes to resources throughout the // configuration, including any nested modules. Use the address of // each resource to determine which module it belongs to. From 05cf816294d1728e7bfc5bb90137c20d6e87f03f Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Fri, 19 Apr 2024 17:01:34 -0700 Subject: [PATCH 153/161] terraform: Check for required input variables during the apply phase The new concept of "ephemeral input variables" creates the possibility of needing to provide an input variable value during the apply phase, rather than just retaining it in the plan. Now we'll remember in the plan the names of the variables that need to be re-supplied during apply -- that is, any ephemeral values whose plan-time values were non-null -- and then check at the start of the apply phase whether those variables (and _only_ those variables) were provided in the planning options. This doesn't yet update Terraform CLI to actually populate this stuff, so as of this commit any plan with apply-time variables is effectively unapplyable. We'll deal with that in future commits. --- internal/terraform/context_apply.go | 59 +++++++++++ internal/terraform/context_apply2_test.go | 118 ++++++++++++++++++++++ internal/terraform/context_plan.go | 20 ++++ 3 files changed, 197 insertions(+) diff --git a/internal/terraform/context_apply.go b/internal/terraform/context_apply.go index 987192126e..e29a7e8a7c 100644 --- a/internal/terraform/context_apply.go +++ b/internal/terraform/context_apply.go @@ -10,6 +10,7 @@ import ( "github.com/zclconf/go-cty/cty" "github.com/hashicorp/terraform/internal/addrs" + "github.com/hashicorp/terraform/internal/collections" "github.com/hashicorp/terraform/internal/configs" "github.com/hashicorp/terraform/internal/lang" "github.com/hashicorp/terraform/internal/plans" @@ -127,6 +128,17 @@ func (c *Context) ApplyAndEval(plan *plans.Plan, config *configs.Config, opts *A } } + // The caller must provide values for all of the "apply-time variables" + // mentioned in the plan, and for no others because the others come from + // the plan itself. + diags = diags.Append(checkApplyTimeVariables(plan.ApplyTimeVariables, opts.SetVariables, config)) + + if diags.HasErrors() { + // If the apply request is invalid in some way then we'll bail out + // here before we do any real work. + return nil, nil, diags + } + for _, rc := range plan.Changes.Resources { // Import is a no-op change during an apply (all the real action happens during the plan) but we'd // like to show some helpful output that mirrors the way we show other changes. @@ -227,6 +239,44 @@ Note that the -target option is not suitable for routine use, and is provided on return newState, evalScope, diags } +func checkApplyTimeVariables(needed collections.Set[string], gotValues InputValues, config *configs.Config) tfdiags.Diagnostics { + var diags tfdiags.Diagnostics + for _, name := range needed.Elems() { + if vv, exists := gotValues[name]; !exists || vv.Value == cty.NilVal || vv.Value.IsNull() { + // This error message assumes that the only possible reason for + // an apply-time variable is because the variable is ephemeral, + // which is true at the time of writing. This error message might + // need to be generalized if we introduce other reasons for + // apply-time variables in future. + diags = diags.Append(tfdiags.Sourceless( + tfdiags.Error, + "No value for required variable", + fmt.Sprintf("The ephemeral input variable %q was set during the plan phase, and so must also be set during the apply phase.", name), + )) + } + } + for name := range gotValues { + if !needed.Has(name) { + // We'll treat this a little differently depending on whether + // the variable is declared as ephemeral or not. + if vc, ok := config.Module.Variables[name]; ok && vc.Ephemeral { + diags = diags.Append(tfdiags.Sourceless( + tfdiags.Error, + "No value for required variable", + fmt.Sprintf("The ephemeral input variable %q was not set during the plan phase, and so must remain unset during the apply phase.", name), + )) + } else { + diags = diags.Append(tfdiags.Sourceless( + tfdiags.Error, + "Unexpected new value for variable", + fmt.Sprintf("Input variable %q is non-ephemeral, so its value was fixed during planning and cannot be reset during apply.", name), + )) + } + } + } + return diags +} + func (c *Context) applyGraph(plan *plans.Plan, config *configs.Config, opts *ApplyOpts, validate bool) (*Graph, walkOperation, tfdiags.Diagnostics) { var diags tfdiags.Diagnostics @@ -250,6 +300,15 @@ func (c *Context) applyGraph(plan *plans.Plan, config *configs.Config, opts *App SourceType: ValueFromPlan, } } + // Apply-time variables need to be merged in too. + // FIXME: We should check that all of these match declared variables and + // that all of them are declared as ephemeral, because all non-ephemeral + // variables are supposed to come exclusively from plan.VariableValues. + if opts != nil { + for n, vv := range opts.SetVariables { + variables[n] = vv + } + } if diags.HasErrors() { return nil, walkApply, diags } diff --git a/internal/terraform/context_apply2_test.go b/internal/terraform/context_apply2_test.go index d908f49795..8f107fcebe 100644 --- a/internal/terraform/context_apply2_test.go +++ b/internal/terraform/context_apply2_test.go @@ -19,6 +19,7 @@ import ( "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/checks" + "github.com/hashicorp/terraform/internal/collections" "github.com/hashicorp/terraform/internal/configs" "github.com/hashicorp/terraform/internal/configs/configschema" "github.com/hashicorp/terraform/internal/lang/marks" @@ -2917,6 +2918,123 @@ resource "test_object" "obj" { assertNoErrors(t, diags) } +func TestContext2Apply_applyTimeVariables(t *testing.T) { + m := testModuleInline(t, map[string]string{ + "main.tf": ` + # If this experimental feature becomes stablized and this test + # is still relevant, consider just removing this opt-in while + # retaining the rest. + terraform { + experiments = [ephemeral_values] + } + + variable "e" { + type = string + default = null + ephemeral = true + } + + variable "p" { + type = string + default = null + } + `, + }) + + t.Run("set during plan", func(t *testing.T) { + ctx := testContext2(t, &ContextOpts{}) + plan, diags := ctx.Plan( + m, states.NewState(), + SimplePlanOpts(plans.NormalMode, InputValues{ + "e": {Value: cty.StringVal("e value")}, + "p": {Value: cty.StringVal("p value")}, + }), + ) + assertNoErrors(t, diags) + + { + got := plan.ApplyTimeVariables + want := collections.NewSetCmp[string]("e") + if diff := cmp.Diff(want, got, collections.CmpOptions); diff != "" { + t.Errorf("wrong apply-time variables\n%s", diff) + } + } + { + got := plan.VariableValues + want := map[string]plans.DynamicValue{ + // The following is a msgpack-encoded representation of + // the type and value of the variable. + "p": plans.DynamicValue("\x92\xc4\x08\x22string\x22\xa7p value"), + } + if diff := cmp.Diff(want, got); diff != "" { + t.Errorf("wrong persisted variables\n%s", diff) + } + } + + _, diags = ctx.Apply(plan, m, &ApplyOpts{ + // Intentionally not setting any variables for this first + // check, which should therefore fail. + }) + if !diags.HasErrors() { + t.Fatal("apply succeeded without value for 'e'; should have failed") + } + + _, diags = ctx.Apply(plan, m, &ApplyOpts{ + SetVariables: InputValues{ + "e": {Value: cty.StringVal("different e value")}, + }, + }) + assertNoErrors(t, diags) + }) + + t.Run("unset during plan", func(t *testing.T) { + ctx := testContext2(t, &ContextOpts{}) + plan, diags := ctx.Plan( + m, states.NewState(), + SimplePlanOpts(plans.NormalMode, InputValues{ + "e": {Value: cty.NilVal}, + "p": {Value: cty.StringVal("p value")}, + }), + ) + assertNoErrors(t, diags) + + { + got := plan.ApplyTimeVariables + want := collections.NewSetCmp[string]( /* none */ ) + if diff := cmp.Diff(want, got, collections.CmpOptions); diff != "" { + t.Errorf("wrong apply-time variables\n%s", diff) + } + } + { + got := plan.VariableValues + want := map[string]plans.DynamicValue{ + // The following is a msgpack-encoded representation of + // the type and value of the variable. + "p": plans.DynamicValue("\x92\xc4\x08\x22string\x22\xa7p value"), + } + if diff := cmp.Diff(want, got); diff != "" { + t.Errorf("wrong persisted variables\n%s", diff) + } + } + + _, diags = ctx.Apply(plan, m, &ApplyOpts{ + SetVariables: InputValues{ + // 'e' was unset during planning, so this is invalid because + // it must remain unset during apply too. + "e": {Value: cty.StringVal("surprising e value")}, + }, + }) + if !diags.HasErrors() { + t.Fatal("apply succeeded with invalid new value for 'e'; should have failed") + } + + _, diags = ctx.Apply(plan, m, &ApplyOpts{ + // Applying with 'e' still unset should be valid. + }) + assertNoErrors(t, diags) + }) +} + func TestContext2Apply_35039(t *testing.T) { m := testModuleInline(t, map[string]string{ "main.tf": ` diff --git a/internal/terraform/context_plan.go b/internal/terraform/context_plan.go index 9da46a91dc..03faa63d39 100644 --- a/internal/terraform/context_plan.go +++ b/internal/terraform/context_plan.go @@ -14,6 +14,7 @@ import ( "github.com/zclconf/go-cty/cty" "github.com/hashicorp/terraform/internal/addrs" + "github.com/hashicorp/terraform/internal/collections" "github.com/hashicorp/terraform/internal/configs" "github.com/hashicorp/terraform/internal/instances" "github.com/hashicorp/terraform/internal/lang" @@ -272,7 +273,25 @@ The -target option is not for routine use, and is provided only for exceptional // convert the variables into the format expected for the plan varVals := make(map[string]plans.DynamicValue, len(opts.SetVariables)) varMarks := make(map[string][]cty.PathValueMarks, len(opts.SetVariables)) + applyTimeVariables := collections.NewSetCmp[string]() for k, iv := range opts.SetVariables { + // If any input variables were declared as ephemeral and set to a + // non-null value then those variables must be provided again (possibly + // with _different_ non-null values) during the apply phase. + if vc, ok := config.Module.Variables[k]; ok && vc.Ephemeral { + // FIXME: We should actually do this based on the final value + // in the named values state, rather than the value as provided + // by the caller, so we can take into account the transforms + // done during variable evaluation. This is a plausible starting + // point for now, though. + if iv.Value != cty.NilVal && !iv.Value.IsNull() { + applyTimeVariables.Add(k) + } + continue + } + + // Non-ephemeral variables must remain unchanged between plan and + // apply, so we'll record their actual values. if iv.Value == cty.NilVal { continue // We only record values that the caller actually set } @@ -306,6 +325,7 @@ The -target option is not for routine use, and is provided only for exceptional // targets and provider SHAs. if plan != nil { plan.VariableValues = varVals + plan.ApplyTimeVariables = applyTimeVariables if len(varMarks) > 0 { plan.VariableMarks = varMarks } From 598e67a0f21705023d0b664023c528a4ab424965 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Mon, 22 Apr 2024 16:13:40 -0700 Subject: [PATCH 154/161] backend/local: Handle apply-time values for ephemeral input variables When the ephemeral variables experiment is active we can potentially have input variables whose values need to be provided separately in both the plan and apply phases, as a compromise to avoid writing those values as part of a saved plan file and to allow the given value to vary between the two phases if necessary. The CLI layer must therefore re-process the given input variable values during the apply phase whenever this experiment is active for the root module and the plan recorded at least one apply-time variable name. To reduce the risk of this new logic accidentally impacting non-experimental usage, the whole call is guarded by whether the root module is participating in the experiment. Checking just the root module is sufficient here because only the root input variables are directly handled by the CLI layer; input variables for descendent modules are handled entirely within the modules runtime. --- internal/backend/local/backend_apply.go | 145 +++++++++++++++++++++++- 1 file changed, 144 insertions(+), 1 deletion(-) diff --git a/internal/backend/local/backend_apply.go b/internal/backend/local/backend_apply.go index 2d8c6ec62b..5e18009059 100644 --- a/internal/backend/local/backend_apply.go +++ b/internal/backend/local/backend_apply.go @@ -10,9 +10,15 @@ import ( "log" "time" + "github.com/hashicorp/hcl/v2" + "github.com/zclconf/go-cty/cty" + "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/backend/backendrun" + "github.com/hashicorp/terraform/internal/collections" "github.com/hashicorp/terraform/internal/command/views" + "github.com/hashicorp/terraform/internal/configs" + "github.com/hashicorp/terraform/internal/experiments" "github.com/hashicorp/terraform/internal/logging" "github.com/hashicorp/terraform/internal/plans" "github.com/hashicorp/terraform/internal/states" @@ -85,8 +91,10 @@ func (b *Local) opApply( stateHook.PersistInterval = time.Duration(op.StatePersistInterval) * time.Second var plan *plans.Plan + combinedPlanApply := false // If we weren't given a plan, then we refresh/plan if op.PlanFile == nil { + combinedPlanApply = true // Perform the plan log.Printf("[INFO] backend/local: apply calling Plan") plan, moreDiags = lr.Core.Plan(lr.Config, lr.InputState, lr.PlanOpts) @@ -227,6 +235,31 @@ func (b *Local) opApply( // Set up our hook for continuous state updates stateHook.StateMgr = opState + var applyOpts *terraform.ApplyOpts + if lr.Config.Module.ActiveExperiments.Has(experiments.EphemeralValues) { + // We only try to handle apply-time input variables if the root module + // has opted into the ephemeral_values language experiment, because + // otherwise there can't possibly be any input variables required + // in the apply phase and this reduces the risk of the experimental + // code impacting non-experimental usage. + // If we stablize something like this experiment, we should find a + // less clunky way to introduce this extra step. + applyTimeValues, applyVarDiags := applyTimeInputValues( + plan.ApplyTimeVariables, + lr.Config.Module.Variables, + op.Variables, + combinedPlanApply, + ) + diags = diags.Append(applyVarDiags) + if diags.HasErrors() { + op.ReportResult(runningOp, diags) + return + } + applyOpts = &terraform.ApplyOpts{ + SetVariables: applyTimeValues, + } + } + // Start the apply in a goroutine so that we can be interrupted. var applyState *states.State var applyDiags tfdiags.Diagnostics @@ -234,8 +267,9 @@ func (b *Local) opApply( go func() { defer logging.PanicHandler() defer close(doneCh) + log.Printf("[INFO] backend/local: apply calling Apply") - applyState, applyDiags = lr.Core.Apply(plan, lr.Config, nil) + applyState, applyDiags = lr.Core.Apply(plan, lr.Config, applyOpts) }() if b.opWait(doneCh, stopCtx, cancelCtx, lr.Core, opState, op.View) { @@ -332,6 +366,115 @@ func (b *Local) backupStateForError(stateFile *statefile.File, err error, view v return diags } +func applyTimeInputValues(needVars collections.Set[string], decls map[string]*configs.Variable, given map[string]backendrun.UnparsedVariableValue, ignoreExtras bool) (terraform.InputValues, tfdiags.Diagnostics) { + // TEMP: This function is here to deal with the currently-experimental + // possibility of certain input variables being required during an apply + // phase because they were set during planning but declared as being + // ephemeral. + // + // To reduce the disruption to existing code caused by this language + // experiment the following is implemented by lightly misusing some + // existing functions that were designed for interpreting variable values + // during the planning phase. If we move forward with something like this + // design for ephemeral input variables then we should consider revisiting + // this to see if we can share the relevant parts of this logic in a less + // clunky way. + + // As a way to trick the functions we built for plan-time variable + // processing into dealing with apply-time variables, we'll construct + // a copy of the variable configurations map with only the needed + // variables in it. + filteredDecls := make(map[string]*configs.Variable, len(decls)) + for name, config := range decls { + if needVars.Has(name) { + filteredDecls[name] = config + } + } + ret, diags := backendrun.ParseDeclaredVariableValues(given, filteredDecls) + undeclared, _ := backendrun.ParseUndeclaredVariableValues(given, filteredDecls) + // The diagnostics returned by ParseUndeclaredVariableValues are written + // to make sense for the plan phase, so we'll ignore them and produce + // our own diagnostics here. + for name, defn := range undeclared { + // Something can get in here either by being not declared at all, + // by being a non-ephemeral variable which should therefore have been + // set during the planning phase, or by being an ephemeral value that + // wasn't set during planning and must therefore stay unset during + // apply. We'll distinguish those cases below. + decl, declared := decls[name] + if !declared { + // FIXME: Ideally we should treat this situation similarly to how + // we would during planning, raising an error if defined in an + // "explicit-ish" way but a warning if set in an ambient way such + // as an environment variable. But for now we'll just ignore + // undeclared input variables in all cases for simplicity's sake. + continue + } + + var rng *hcl.Range + if defn.HasSourceRange() { + rng = defn.SourceRange.ToHCL().Ptr() + } + + if decl.Ephemeral { + // An ephemeral variable that appears as "undeclared" is one that + // wasn't set during planning and must therefore remain unset + // during apply. + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Ephemeral variable was not set during planning", + Detail: fmt.Sprintf( + "The ephemeral input variable %q was not set during the planning phase, and so must remain unset during the apply phase.", + name, + ), + Subject: rng, + }) + } else { + // TODO: We should probably actually tolerate this if the new + // value is equal to the value that was saved in the plan, since + // that'd make it possible to, for example, reuse a .tfvars file + // containing a mixture of ephemeral and non-ephemeral definitions + // during the apply phase, rather than having to split ephemeral + // and non-ephemeral definitions into separate files. For initial + // experiment we'll keep things a little simpler, though, and + // just skip this check if we're doing a combined plan/apply where + // the apply phase will therefore always have exactly the same + // inputs as the plan phase. + if !ignoreExtras { + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Cannot change value for non-ephemeral variable", + Detail: fmt.Sprintf( + "Input variable %q is non-ephemeral, so its value was decided during the planning phase and cannot be reset for the apply phase.", + name, + ), + Subject: rng, + }) + } + } + } + + // We should now have a non-null value for each of the variables in needVars + for _, name := range needVars.Elems() { + val := cty.NullVal(cty.DynamicPseudoType) + if defn, ok := ret[name]; ok { + val = defn.Value + } + if val.IsNull() { + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Ephemeral variable must be set for apply", + Detail: fmt.Sprintf( + "The ephemeral input variable %q was set during the planning phase, and so must be set again during the apply phase.", + name, + ), + }) + } + } + + return ret, diags +} + const stateWriteBackedUpError = `The error shown above has prevented Terraform from writing the updated state to the configured backend. To allow for recovery, the state has been written to the file "errored.tfstate" in the current working directory. Running "terraform apply" again at this point will create a forked state, making it harder to recover. From 9dd16a7fba091404f097830d9a055165a13941d9 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Tue, 7 May 2024 16:33:35 -0700 Subject: [PATCH 155/161] command: "terraform apply" accepts variable values with saved plan To support ephemeral values we need a more complicated set of rules about what input variables can and must be set when applying a saved plan. The command itself does not have enough information to implement those rules itself, so we'll let them pass through and check this in the local backend's apply phase instead. The local backend's apply phase already had basic support for dealing with apply-time variable values, but it'll now also be responsible for rejecting attempts to set variables when the experiment isn't enabled, to keep all of this logic in roughly the same place. --- internal/backend/local/backend_apply.go | 28 +++++++++++++++++++++++++ internal/command/apply.go | 11 ---------- internal/command/apply_test.go | 10 +++++++++ 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/internal/backend/local/backend_apply.go b/internal/backend/local/backend_apply.go index 5e18009059..e1549356a2 100644 --- a/internal/backend/local/backend_apply.go +++ b/internal/backend/local/backend_apply.go @@ -258,6 +258,34 @@ func (b *Local) opApply( applyOpts = &terraform.ApplyOpts{ SetVariables: applyTimeValues, } + } else { + // When the ephemeral values experiment isn't enabled, no variables + // may be _explicitly_ set during the apply phase at all, but it's + // valid for variable to show up from more implicit locations like + // environment variables and .auto.tfvars files. + if len(op.Variables) != 0 && !combinedPlanApply { + for _, rawV := range op.Variables { + // We're "parsing" only to get the resulting value's SourceType, + // so we'll use configs.VariableParseLiteral just because it's + // the most liberal interpretation and so least likely to + // fail with an unrelated error. + v, _ := rawV.ParseVariableValue(configs.VariableParseLiteral) + if v == nil { + // We'll ignore any that don't parse at all, because + // they'll fail elsewhere in this process anyway. + continue + } + if v.SourceType == terraform.ValueFromCLIArg || v.SourceType == terraform.ValueFromNamedFile { + diags = diags.Append(tfdiags.Sourceless( + tfdiags.Error, + "Can't set variables when applying a saved plan", + "The -var and -var-file options cannot be used when applying a saved plan file, because a saved plan includes the variable values that were set when it was created.", + )) + op.ReportResult(runningOp, diags) + return + } + } + } } // Start the apply in a goroutine so that we can be interrupted. diff --git a/internal/command/apply.go b/internal/command/apply.go index d9b412f90c..5f4ce3dd56 100644 --- a/internal/command/apply.go +++ b/internal/command/apply.go @@ -71,17 +71,6 @@ func (c *ApplyCommand) Run(rawArgs []string) int { return 1 } - // Check for invalid combination of plan file and variable overrides - if planFile != nil && !args.Vars.Empty() { - diags = diags.Append(tfdiags.Sourceless( - tfdiags.Error, - "Can't set variables when applying a saved plan", - "The -var and -var-file options cannot be used when applying a saved plan file, because a saved plan includes the variable values that were set when it was created.", - )) - view.Diagnostics(diags) - return 1 - } - // FIXME: the -input flag value is needed to initialize the backend and the // operation, but there is no clear path to pass this value down, so we // continue to mutate the Meta object state for now. diff --git a/internal/command/apply_test.go b/internal/command/apply_test.go index 22497a7b6b..2b3dd3a868 100644 --- a/internal/command/apply_test.go +++ b/internal/command/apply_test.go @@ -900,6 +900,16 @@ func TestApply_planWithVarFile(t *testing.T) { } func TestApply_planVars(t *testing.T) { + // This test ensures that it isn't allowed to set input variables + // when applying from a saved plan file, since in that case the + // variable values come from the saved plan file. + // + // This situation was originally checked by the apply command itself, + // and that's what this test was originally exercising. This rule + // is now enforced by the "local" backend instead, but this test + // is still valid since the command instance delegates to the + // local backend. + planPath := applyFixturePlanFile(t) statePath := testTempFile(t) From 7c928fc10b2f37370d6dbcc1f6e6015fc53e1606 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Fri, 31 May 2024 14:56:22 -0700 Subject: [PATCH 156/161] terraform: terraform.applying returns true during the apply phase This new symbol returns an ephemeral boolean flag that is true only during the apply phase and false otherwise. Since this involves an ephemeral value and those are still experimental, this symbol is also available only when opted in to the ephemeral_values experiment. The intended use for this is to configure a provider with a different (and probably more privileged) role or username during the apply phase when Terraform is actually trying to change infrastructure, so that planning can be done with a more limited level of access that might, for example, only allow _reading_ from the remote system. role_arn = ( terraform.applying ? local.write_role_arn : local.read_role_arn ) --- internal/terraform/context_apply2_test.go | 93 +++++++++++++++++++++++ internal/terraform/evaluate_data.go | 38 +++++++-- 2 files changed, 126 insertions(+), 5 deletions(-) diff --git a/internal/terraform/context_apply2_test.go b/internal/terraform/context_apply2_test.go index 8f107fcebe..647d315d16 100644 --- a/internal/terraform/context_apply2_test.go +++ b/internal/terraform/context_apply2_test.go @@ -2918,6 +2918,99 @@ resource "test_object" "obj" { assertNoErrors(t, diags) } +func TestContext2Apply_applyingFlag(t *testing.T) { + // This test is for references to the symbol "terraform.applying", which + // is an ephemeral value that's true during an apply phase but false in + // all other phases. + + m := testModuleInline(t, map[string]string{ + "main.tf": ` + terraform { + required_providers { + test = { + source = "terraform.io/builtin/test" + } + } + + # If this experimental feature becomes stablized and this test + # is still relevant, consider just removing this opt-in while + # retaining the rest. + experiments = [ephemeral_values] + } + + provider "test" { + applying = terraform.applying + } + + resource "test_thing" "placeholder" { + # This is here just to give Terraform a reason to configure + # the provider. + } + `, + }) + + p := new(testing_provider.MockProvider) + p.GetProviderSchemaResponse = &providers.GetProviderSchemaResponse{ + Provider: providers.Schema{ + Block: &configschema.Block{ + Attributes: map[string]*configschema.Attribute{ + "applying": { + Type: cty.Bool, + Required: true, + }, + }, + }, + }, + ResourceTypes: map[string]providers.Schema{ + "test_thing": { + Block: &configschema.Block{}, + }, + }, + } + + ctx := testContext2(t, &ContextOpts{ + Providers: map[addrs.Provider]providers.Factory{ + addrs.NewBuiltInProvider("test"): testProviderFuncFixed(p), + }, + }) + + plan, diags := ctx.Plan(m, states.NewState(), SimplePlanOpts(plans.NormalMode, testInputValuesUnset(m.Module.Variables))) + assertNoErrors(t, diags) + + if !p.ConfigureProviderCalled { + t.Fatalf("ConfigureProvider was not called during planning") + } + { + got := p.ConfigureProviderRequest.Config + want := cty.ObjectVal(map[string]cty.Value{ + "applying": cty.False, // false during the planning phase + }) + if diff := cmp.Diff(want, got, ctydebug.CmpOptions); diff != "" { + t.Errorf("wrong provider configuration during planning\n%s", diff) + } + } + + // reset the mock provider so we can check it again after apply + p.ConfigureProviderCalled = false + p.ConfigureProviderRequest = providers.ConfigureProviderRequest{} + + _, diags = ctx.Apply(plan, m, &ApplyOpts{}) + assertNoErrors(t, diags) + + if !p.ConfigureProviderCalled { + t.Fatalf("ConfigureProvider was not called while applying") + } + { + got := p.ConfigureProviderRequest.Config + want := cty.ObjectVal(map[string]cty.Value{ + "applying": cty.True, // now true during the apply phase + }) + if diff := cmp.Diff(want, got, ctydebug.CmpOptions); diff != "" { + t.Errorf("wrong provider configuration while applying\n%s", diff) + } + } +} + func TestContext2Apply_applyTimeVariables(t *testing.T) { m := testModuleInline(t, map[string]string{ "main.tf": ` diff --git a/internal/terraform/evaluate_data.go b/internal/terraform/evaluate_data.go index 8fd58d8dd9..1840b00189 100644 --- a/internal/terraform/evaluate_data.go +++ b/internal/terraform/evaluate_data.go @@ -13,6 +13,8 @@ import ( "github.com/hashicorp/terraform/internal/addrs" "github.com/hashicorp/terraform/internal/didyoumean" + "github.com/hashicorp/terraform/internal/experiments" + "github.com/hashicorp/terraform/internal/lang/marks" "github.com/hashicorp/terraform/internal/tfdiags" ) @@ -100,14 +102,40 @@ func (d *evaluationData) GetPathAttr(addr addrs.PathAttr, rng tfdiags.SourceRang func (d *evaluationData) GetTerraformAttr(addr addrs.TerraformAttr, rng tfdiags.SourceRange) (cty.Value, tfdiags.Diagnostics) { var diags tfdiags.Diagnostics + // terraform.applying is an ephemeral boolean value that's set to true + // during an apply walk or false in any other situation. This is + // intended to allow, for example, using a more privileged auth role + // in a provider configuration during the apply phase but a more + // constrained role for other situations. + // + // Since this produces an ephemeral value, and ephemeral values are + // currently experimental, this is available only in modules that + // have opted in to the experiment. If this experiment gets stabilized, + // it'll probably be best to incorporate this into the normal codepath + // below, but it's currently handled separately up here so it'll be easier + // to remove if the experiment is unsuccessful. + if addr.Name == "applying" { + modCfg := d.Evaluator.Config.Descendent(d.Module) + if modCfg != nil && modCfg.Module.ActiveExperiments.Has(experiments.EphemeralValues) { + return cty.BoolVal(d.Evaluator.Operation == walkApply).Mark(marks.Ephemeral), nil + } + // If the experiment isn't active then we just fall out to the other + // code below, which will treat this situation just like any other + // invalid attribute name. + // + // If you're here to stabilize the experiment, note also that some + // of the error messages below assume that terraform.workspace is + // the only currently-valid attribute and so will probably need revising + // once terraform.applying is also valid. + } + if d.Evaluator.Meta == nil || d.Evaluator.Meta.Env == "" { // The absense of an "env" (really: workspace) name suggests that // we're running in a non-workspace context, such as in a component - // of a stack. terraform.workspace -- and the terraform symbol in - // general -- is a legacy thing from workspaces mode that isn't - // carried forward to stacks, because stack configurations can instead - // vary their behavior based on input variables provided in the - // deployment configuration. + // of a stack. terraform.workspace is a legacy thing from workspaces + // mode that isn't carried forward to stacks, because stack + // configurations can instead vary their behavior based on input + // variables provided in the deployment configuration. switch addr.Name { case "workspace": diags = diags.Append(&hcl.Diagnostic{ From c823b26eb0b6a95e9ad2c55b1a6aac64d7872382 Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Wed, 5 Jun 2024 09:13:58 -0700 Subject: [PATCH 157/161] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64fe61ad2c..eb816c503f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ EXPERIMENTS: Experiments are only enabled in alpha releases of Terraform CLI. The following features are not yet available in stable releases. +* `ephemeral_values`: This [language experiment](https://developer.hashicorp.com/terraform/language/settings#experimental-language-features) introduces a new special kind of value which Terraform allows to change between the plan phase and the apply phase, and between plan/apply rounds. Ephemeral values are never persisted in saved plan files or state snapshots, and so can only be used in parts of the language that don't require values to persist in those artifacts. Ephemeral input values are the main initial example of this concept, allowing the use of input variables to provide dynamic credentials that must change between plan and apply. * `terraform test` accepts a new option `-junit-xml=FILENAME`. If specified, and if the test configuration is valid enough to begin executing, then Terraform writes a JUnit XML test result report to the given filename, describing similar information as included in the normal test output. ([#34291](https://github.com/hashicorp/terraform/issues/34291)) * The new command `terraform rpcapi` exposes some Terraform Core functionality through an RPC interface compatible with [`go-plugin`](https://github.com/hashicorp/go-plugin). The exact RPC API exposed here is currently subject to change at any time, because it's here primarily as a vehicle to support the [Terraform Stacks](https://www.hashicorp.com/blog/terraform-stacks-explained) private preview and so will be broken if necessary to respond to feedback from private preview participants, or possibly for other reasons. Do not use this mechanism yet outside of Terraform Stacks private preview. * The experimental "deferred actions" feature, enabled by passing the `-allow-deferral` option to `terraform plan`, permits `count` and `for_each` arguments in `module`, `resource`, and `data` blocks to have unknown values and allows providers to react more flexibly to unknown values. This experiment is under active development, and so it's not yet useful to participate in this experiment From aa680aad84ecef089b3177e39099ba47816fedbe Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Wed, 5 Jun 2024 09:16:14 -0700 Subject: [PATCH 158/161] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb816c503f..f33a23a9a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ Experiments are only enabled in alpha releases of Terraform CLI. The following f ## Previous Releases -For information on prior major and minor releases, see their changelogs: +For information on prior major and minor releases, refer to their changelogs: * [v1.9](https://github.com/hashicorp/terraform/blob/v1.9/CHANGELOG.md) * [v1.8](https://github.com/hashicorp/terraform/blob/v1.8/CHANGELOG.md) From fc390038f3f9453e4fa0995b5891044ae60d39a0 Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Thu, 6 Jun 2024 13:36:57 +0200 Subject: [PATCH 159/161] stacks: add tests for and refactor steps when a provider can't be configured (#35294) --- internal/stacks/stackruntime/helper_test.go | 47 +++++++ .../internal/stackeval/provider_instance.go | 39 +++--- .../stackeval/provider_instance_test.go | 6 + .../stubs/{configured.go => errored.go} | 132 +++++------------- internal/stacks/stackruntime/plan_test.go | 64 +++++++++ .../test/multiple-providers/main.tf | 10 ++ .../test/multiple-providers/main.tfstack.hcl | 22 +++ .../stacks/stackruntime/testing/provider.go | 22 +++ 8 files changed, 226 insertions(+), 116 deletions(-) rename internal/stacks/stackruntime/internal/stackeval/stubs/{configured.go => errored.go} (50%) create mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/multiple-providers/main.tf create mode 100644 internal/stacks/stackruntime/testdata/mainbundle/test/multiple-providers/main.tfstack.hcl diff --git a/internal/stacks/stackruntime/helper_test.go b/internal/stacks/stackruntime/helper_test.go index 99a5d55723..05840694ab 100644 --- a/internal/stacks/stackruntime/helper_test.go +++ b/internal/stacks/stackruntime/helper_test.go @@ -72,6 +72,53 @@ func loadMainBundleConfigForTest(t *testing.T, dirName string) *stackconfig.Conf return loadConfigForTest(t, "./testdata/mainbundle", fullSourceAddr) } +type expectedDiagnostic struct { + severity tfdiags.Severity + summary string + detail string +} + +func expectDiagnostic(severity tfdiags.Severity, summary, detail string) expectedDiagnostic { + return expectedDiagnostic{ + severity: severity, + summary: summary, + detail: detail, + } +} + +func expectDiagnosticsForTest(t *testing.T, actual tfdiags.Diagnostics, expected ...expectedDiagnostic) { + t.Helper() + + max := len(expected) + if len(actual) < max { + max = len(actual) + } + + for ix := 0; ix < max; ix++ { + if ix >= len(expected) { + t.Errorf("unexpected diagnostic [%d]: %s - %s", ix, actual[ix].Description().Summary, actual[ix].Description().Detail) + continue + } + + if ix >= len(actual) { + t.Errorf("missing diagnostic [%d]: %s - %s", ix, expected[ix].summary, expected[ix].detail) + continue + } + + if actual[ix].Severity() != expected[ix].severity { + t.Errorf("diagnostic [%d] has wrong severity: %s (expected %s)", ix, actual[ix].Severity(), expected[ix].severity) + } + + if actual[ix].Description().Summary != expected[ix].summary { + t.Errorf("diagnostic [%d] has wrong summary: %s (expected %s)", ix, actual[ix].Description().Summary, expected[ix].summary) + } + + if actual[ix].Description().Detail != expected[ix].detail { + t.Errorf("diagnostic [%d] has wrong detail: %s (expected %s)", ix, actual[ix].Description().Detail, expected[ix].detail) + } + } +} + // reportDiagnosticsForTest creates a test log entry for every diagnostic in // the given diags, and halts the test if any of them are error diagnostics. func reportDiagnosticsForTest(t *testing.T, diags tfdiags.Diagnostics) { diff --git a/internal/stacks/stackruntime/internal/stackeval/provider_instance.go b/internal/stacks/stackruntime/internal/stackeval/provider_instance.go index cb0f3b8bf7..5b8a2bee1f 100644 --- a/internal/stacks/stackruntime/internal/stackeval/provider_instance.go +++ b/internal/stacks/stackruntime/internal/stackeval/provider_instance.go @@ -168,26 +168,15 @@ func (p *ProviderInstance) CheckClient(ctx context.Context, phase EvalPhase) (pr var diags tfdiags.Diagnostics if p.repetition.EachKey != cty.NilVal && !p.repetition.EachKey.IsKnown() { - // If we're a placeholder standing in for all instances of - // a provider block whose for_each is unknown then we - // can't configure. - return stubs.ConfiguredProvider{Unknown: true}, diags + // We should have triggered and returned a stub.UnknownProvider + // in this case, so there's a bug somewhere in Terraform if + // this happens. + panic("provider instance with unknown for_each key") } if p.repetition.CountIndex != cty.NilVal && !p.repetition.CountIndex.IsKnown() { - // If we're a placeholder standing in for all instances of - // a provider block whose count is unknown then we - // can't configure. - return stubs.ConfiguredProvider{Unknown: true}, diags - } - - args := p.ProviderArgs(ctx, phase) - if !args.IsKnown() { - // If we don't know the provider configuration at all then - // we'll just immediately return a stub client, since - // no provider can accept a wholly-unknown configuration. - // (Known objects with unknown attribute values inside are - // okay to try and so don't return immediately here.) - return stubs.ConfiguredProvider{Unknown: true}, diags + // Providers don't even support the count index argument, so + // something crazy is happening if we get here. + panic("provider instance with unknown count index") } providerType := p.ProviderType(ctx) @@ -204,7 +193,7 @@ func (p *ProviderInstance) CheckClient(ctx context.Context, phase EvalPhase) (pr ), Subject: decl.DeclRange.ToHCL().Ptr(), }) - return stubs.ConfiguredProvider{Unknown: false}, diags + return &stubs.ErroredProvider{}, diags } // If the context we recieved gets cancelled then we want providers @@ -244,6 +233,11 @@ func (p *ProviderInstance) CheckClient(ctx context.Context, phase EvalPhase) (pr return diags }) + allowUnknowns := true + if p.main.Planning() { + allowUnknowns = p.main.PlanningOpts().DeferralAllowed + } + // TODO: Some providers will malfunction if the caller doesn't // fetch their schema at least once before use. That's not something // the provider protocol promises but it's an implementation @@ -257,10 +251,13 @@ func (p *ProviderInstance) CheckClient(ctx context.Context, phase EvalPhase) (pr // We unmark the config before making the RPC call, as marks cannot // be serialized. - unmarkedArgs, _ := args.UnmarkDeep() + unmarkedArgs, _ := p.ProviderArgs(ctx, phase).UnmarkDeep() resp := client.ConfigureProvider(providers.ConfigureProviderRequest{ TerraformVersion: version.SemVer.String(), Config: unmarkedArgs, + ClientCapabilities: providers.ClientCapabilities{ + DeferralAllowed: allowUnknowns, + }, }) diags = diags.Append(resp.Diagnostics) if resp.Diagnostics.HasErrors() { @@ -269,7 +266,7 @@ func (p *ProviderInstance) CheckClient(ctx context.Context, phase EvalPhase) (pr // stub instead. (The real provider stays running until it // gets cleaned up by the cleanup function above, despite being // inaccessible to the caller.) - return stubs.ConfiguredProvider{Unknown: false}, diags + return &stubs.ErroredProvider{}, diags } return providerClose{ diff --git a/internal/stacks/stackruntime/internal/stackeval/provider_instance_test.go b/internal/stacks/stackruntime/internal/stackeval/provider_instance_test.go index 255d1839c0..049191ef4f 100644 --- a/internal/stacks/stackruntime/internal/stackeval/provider_instance_test.go +++ b/internal/stacks/stackruntime/internal/stackeval/provider_instance_test.go @@ -383,6 +383,9 @@ func TestProviderInstanceCheckClient(t *testing.T) { Config: cty.ObjectVal(map[string]cty.Value{ "test": cty.StringVal("yep"), }), + ClientCapabilities: providers.ClientCapabilities{ + DeferralAllowed: true, + }, } if diff := cmp.Diff(want, got, ctydebug.CmpOptions); diff != "" { t.Errorf("wrong request\n%s", diff) @@ -422,6 +425,9 @@ func TestProviderInstanceCheckClient(t *testing.T) { Config: cty.ObjectVal(map[string]cty.Value{ "test": cty.StringVal("yep"), }), + ClientCapabilities: providers.ClientCapabilities{ + DeferralAllowed: true, + }, } if diff := cmp.Diff(want, got, ctydebug.CmpOptions); diff != "" { t.Errorf("wrong request\n%s", diff) diff --git a/internal/stacks/stackruntime/internal/stackeval/stubs/configured.go b/internal/stacks/stackruntime/internal/stackeval/stubs/errored.go similarity index 50% rename from internal/stacks/stackruntime/internal/stackeval/stubs/configured.go rename to internal/stacks/stackruntime/internal/stackeval/stubs/errored.go index fcfa9d3230..fe29c229e0 100644 --- a/internal/stacks/stackruntime/internal/stackeval/stubs/configured.go +++ b/internal/stacks/stackruntime/internal/stackeval/stubs/errored.go @@ -4,48 +4,22 @@ package stubs import ( - "github.com/zclconf/go-cty/cty" - "github.com/hashicorp/terraform/internal/providers" "github.com/hashicorp/terraform/internal/tfdiags" ) -// ConfiguredProvider is a placeholder provider used when ConfigureProvider -// on a real provider fails, so that callers can still receieve a usable client -// that will just produce placeholder values from its operations. -// -// This is essentially the cty.DynamicVal equivalent for providers.Interface, -// allowing us to follow our usual pattern that only one return path carries -// diagnostics up to the caller and all other codepaths just do their best -// to unwind with placeholder values. It's intended only for use in situations -// that would expect an already-configured provider, so it's incorrect to call -// [ConfigureProvider] on a value of this type. -// -// Some methods of this type explicitly return errors saying that the provider -// configuration was invalid, while others just optimistically do nothing at -// all. The general rule is that anything that would for a normal provider -// be expected to perform externally-visible side effects must return an error -// to be explicit that those side effects did not occur, but we can silently -// skip anything that is a Terraform-only detail. -// -// As usual with provider calls, the returned diagnostics must be annotated -// using [tfdiags.Diagnostics.InConfigBody] with the relevant configuration body -// so that they can be attributed to the appropriate configuration element. -type ConfiguredProvider struct { - // If unknown is true then the implementation will assume it's acting - // as a placeholder for a provider whose configuration isn't yet - // sufficiently known to be properly instantiated, which means that - // plan-time operations will return totally-unknown values. - // Otherwise any operation that is supposed to perform a side-effect - // will fail with an error saying that the provider configuration - // is invalid. - Unknown bool +// ErroredProvider is a stub provider that is used in place of a provider that +// failed the configuration step. This provider will return an error for all +// operations that would have otherwise caused side-effects or modified the +// plan. +type ErroredProvider struct { + failedProvider providers.Interface } -var _ providers.Interface = ConfiguredProvider{} +var _ providers.Interface = &ErroredProvider{} // ApplyResourceChange implements providers.Interface. -func (ConfiguredProvider) ApplyResourceChange(req providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse { +func (p *ErroredProvider) ApplyResourceChange(req providers.ApplyResourceChangeRequest) providers.ApplyResourceChangeResponse { var diags tfdiags.Diagnostics diags = diags.Append(tfdiags.AttributeValue( tfdiags.Error, @@ -58,17 +32,19 @@ func (ConfiguredProvider) ApplyResourceChange(req providers.ApplyResourceChangeR } } -func (ConfiguredProvider) CallFunction(providers.CallFunctionRequest) providers.CallFunctionResponse { - panic("can't call functions on the stub provider") +func (p *ErroredProvider) CallFunction(request providers.CallFunctionRequest) providers.CallFunctionResponse { + // this is an offline operation, so we can just use the unconfigured + // provider. + return p.failedProvider.CallFunction(request) } // Close implements providers.Interface. -func (ConfiguredProvider) Close() error { +func (p *ErroredProvider) Close() error { return nil } // ConfigureProvider implements providers.Interface. -func (ConfiguredProvider) ConfigureProvider(req providers.ConfigureProviderRequest) providers.ConfigureProviderResponse { +func (p *ErroredProvider) ConfigureProvider(req providers.ConfigureProviderRequest) providers.ConfigureProviderResponse { // This provider is used only in situations where ConfigureProvider on // a real provider fails and the recipient was expecting a configured // provider, so it doesn't make sense to configure it. @@ -76,63 +52,40 @@ func (ConfiguredProvider) ConfigureProvider(req providers.ConfigureProviderReque } // GetProviderSchema implements providers.Interface. -func (ConfiguredProvider) GetProviderSchema() providers.GetProviderSchemaResponse { +func (p *ErroredProvider) GetProviderSchema() providers.GetProviderSchemaResponse { return providers.GetProviderSchemaResponse{} } // ImportResourceState implements providers.Interface. -func (p ConfiguredProvider) ImportResourceState(req providers.ImportResourceStateRequest) providers.ImportResourceStateResponse { +func (p *ErroredProvider) ImportResourceState(req providers.ImportResourceStateRequest) providers.ImportResourceStateResponse { var diags tfdiags.Diagnostics - if p.Unknown { - diags = diags.Append(tfdiags.AttributeValue( - tfdiags.Error, - "Provider configuration is deferred", - "Cannot import an existing object into this resource because its associated provider configuration is deferred to a later operation due to unknown expansion.", - nil, // nil attribute path means the overall configuration block - )) - } else { - diags = diags.Append(tfdiags.AttributeValue( - tfdiags.Error, - "Provider configuration is invalid", - "Cannot import an existing object into this resource because its associated provider configuration is invalid.", - nil, // nil attribute path means the overall configuration block - )) - } + diags = diags.Append(tfdiags.AttributeValue( + tfdiags.Error, + "Provider configuration is invalid", + "Cannot import an existing object into this resource because its associated provider configuration is invalid.", + nil, // nil attribute path means the overall configuration block + )) return providers.ImportResourceStateResponse{ Diagnostics: diags, } } // MoveResourceState implements providers.Interface. -func (p ConfiguredProvider) MoveResourceState(req providers.MoveResourceStateRequest) providers.MoveResourceStateResponse { +func (p *ErroredProvider) MoveResourceState(req providers.MoveResourceStateRequest) providers.MoveResourceStateResponse { var diags tfdiags.Diagnostics - if p.Unknown { - diags = diags.Append(tfdiags.AttributeValue( - tfdiags.Error, - "Provider configuration is deferred", - "Cannot move an existing object to this resource because its associated provider configuration is deferred to a later operation due to unknown expansion.", - nil, // nil attribute path means the overall configuration block - )) - } else { - diags = diags.Append(tfdiags.AttributeValue( - tfdiags.Error, - "Provider configuration is invalid", - "Cannot move an existing object to this resource because its associated provider configuration is invalid.", - nil, // nil attribute path means the overall configuration block - )) - } + diags = diags.Append(tfdiags.AttributeValue( + tfdiags.Error, + "Provider configuration is invalid", + "Cannot move an existing object to this resource because its associated provider configuration is invalid.", + nil, // nil attribute path means the overall configuration block + )) return providers.MoveResourceStateResponse{ Diagnostics: diags, } } // PlanResourceChange implements providers.Interface. -func (p ConfiguredProvider) PlanResourceChange(req providers.PlanResourceChangeRequest) providers.PlanResourceChangeResponse { - if p.Unknown { - return providers.PlanResourceChangeResponse{ - PlannedState: cty.DynamicVal, - } - } +func (p *ErroredProvider) PlanResourceChange(req providers.PlanResourceChangeRequest) providers.PlanResourceChangeResponse { var diags tfdiags.Diagnostics diags = diags.Append(tfdiags.AttributeValue( tfdiags.Error, @@ -146,12 +99,7 @@ func (p ConfiguredProvider) PlanResourceChange(req providers.PlanResourceChangeR } // ReadDataSource implements providers.Interface. -func (p ConfiguredProvider) ReadDataSource(req providers.ReadDataSourceRequest) providers.ReadDataSourceResponse { - if p.Unknown { - return providers.ReadDataSourceResponse{ - State: cty.DynamicVal, - } - } +func (p *ErroredProvider) ReadDataSource(req providers.ReadDataSourceRequest) providers.ReadDataSourceResponse { var diags tfdiags.Diagnostics diags = diags.Append(tfdiags.AttributeValue( tfdiags.Error, @@ -165,7 +113,7 @@ func (p ConfiguredProvider) ReadDataSource(req providers.ReadDataSourceRequest) } // ReadResource implements providers.Interface. -func (ConfiguredProvider) ReadResource(req providers.ReadResourceRequest) providers.ReadResourceResponse { +func (p *ErroredProvider) ReadResource(req providers.ReadResourceRequest) providers.ReadResourceResponse { // For this one we'll just optimistically assume that the remote object // hasn't changed. In many cases we'll fail calling PlanResourceChange // right afterwards anyway, and even if not we'll get another opportunity @@ -177,20 +125,14 @@ func (ConfiguredProvider) ReadResource(req providers.ReadResourceRequest) provid } // Stop implements providers.Interface. -func (ConfiguredProvider) Stop() error { +func (p *ErroredProvider) Stop() error { // This stub provider never actually does any real work, so there's nothing // for us to stop. return nil } // UpgradeResourceState implements providers.Interface. -func (p ConfiguredProvider) UpgradeResourceState(req providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse { - if p.Unknown { - return providers.UpgradeResourceStateResponse{ - UpgradedState: cty.DynamicVal, - } - } - +func (p *ErroredProvider) UpgradeResourceState(req providers.UpgradeResourceStateRequest) providers.UpgradeResourceStateResponse { // Ideally we'd just skip this altogether and echo back what the caller // provided, but the request is in a different serialization format than // the response and so only the real provider can deal with this one. @@ -207,7 +149,7 @@ func (p ConfiguredProvider) UpgradeResourceState(req providers.UpgradeResourceSt } // ValidateDataResourceConfig implements providers.Interface. -func (ConfiguredProvider) ValidateDataResourceConfig(req providers.ValidateDataResourceConfigRequest) providers.ValidateDataResourceConfigResponse { +func (p *ErroredProvider) ValidateDataResourceConfig(req providers.ValidateDataResourceConfigRequest) providers.ValidateDataResourceConfigResponse { // We'll just optimistically assume the configuration is valid, so that // we can progress to planning and return an error there instead. return providers.ValidateDataResourceConfigResponse{ @@ -216,7 +158,7 @@ func (ConfiguredProvider) ValidateDataResourceConfig(req providers.ValidateDataR } // ValidateProviderConfig implements providers.Interface. -func (ConfiguredProvider) ValidateProviderConfig(req providers.ValidateProviderConfigRequest) providers.ValidateProviderConfigResponse { +func (p *ErroredProvider) ValidateProviderConfig(req providers.ValidateProviderConfigRequest) providers.ValidateProviderConfigResponse { // It doesn't make sense to call this one on stubProvider, because // we only use stubProvider for situations where ConfigureProvider failed // on a real provider and we should already have called @@ -228,7 +170,7 @@ func (ConfiguredProvider) ValidateProviderConfig(req providers.ValidateProviderC } // ValidateResourceConfig implements providers.Interface. -func (ConfiguredProvider) ValidateResourceConfig(req providers.ValidateResourceConfigRequest) providers.ValidateResourceConfigResponse { +func (p *ErroredProvider) ValidateResourceConfig(req providers.ValidateResourceConfigRequest) providers.ValidateResourceConfigResponse { // We'll just optimistically assume the configuration is valid, so that // we can progress to reading and return an error there instead. return providers.ValidateResourceConfigResponse{ diff --git a/internal/stacks/stackruntime/plan_test.go b/internal/stacks/stackruntime/plan_test.go index 0f5f3cfca7..f4861b7a63 100644 --- a/internal/stacks/stackruntime/plan_test.go +++ b/internal/stacks/stackruntime/plan_test.go @@ -6,6 +6,7 @@ package stackruntime import ( "context" "encoding/json" + "errors" "fmt" "path" "sort" @@ -2727,6 +2728,69 @@ func TestPlanWithDeferredProviderForEach(t *testing.T) { } } +func TestPlanInvalidProvidersFailGracefully(t *testing.T) { + ctx := context.Background() + cfg := loadMainBundleConfigForTest(t, path.Join("multiple-providers")) + + fakePlanTimestamp, err := time.Parse(time.RFC3339, "1991-08-25T20:57:08Z") + if err != nil { + t.Fatal(err) + } + + changesCh := make(chan stackplan.PlannedChange) + diagsCh := make(chan tfdiags.Diagnostic) + req := PlanRequest{ + Config: cfg, + ProviderFactories: map[addrs.Provider]providers.Factory{ + addrs.NewDefaultProvider("invalid"): func() (providers.Interface, error) { + return nil, errors.New("provider not found") + }, + addrs.NewDefaultProvider("testing"): func() (providers.Interface, error) { + return stacks_testing_provider.NewProvider(), nil + }, + }, + ForcePlanTimestamp: &fakePlanTimestamp, + } + resp := PlanResponse{ + PlannedChanges: changesCh, + Diagnostics: diagsCh, + } + go Plan(ctx, &req, &resp) + changes, diags := collectPlanOutput(changesCh, diagsCh) + + expectDiagnosticsForTest(t, diags, + expectDiagnostic(tfdiags.Error, "invalid configuration", "configure_error attribute was set"), + expectDiagnostic(tfdiags.Error, "Provider configuration is invalid", "Cannot plan changes for this resource because its associated provider configuration is invalid.")) + + sort.SliceStable(changes, func(i, j int) bool { + return plannedChangeSortKey(changes[i]) < plannedChangeSortKey(changes[j]) + }) + + wantChanges := []stackplan.PlannedChange{ + &stackplan.PlannedChangeApplyable{}, + &stackplan.PlannedChangeComponentInstance{ + Addr: stackaddrs.Absolute( + stackaddrs.RootStackInstance, + stackaddrs.ComponentInstance{ + Component: stackaddrs.Component{Name: "self"}, + }, + ), + Action: plans.Create, + PlanTimestamp: fakePlanTimestamp, + PlannedInputValues: make(map[string]plans.DynamicValue), + PlannedOutputValues: make(map[string]cty.Value), + PlannedCheckResults: &states.CheckResults{}, + }, + &stackplan.PlannedChangeHeader{ + TerraformVersion: version.SemVer, + }, + } + + if diff := cmp.Diff(wantChanges, changes, ctydebug.CmpOptions, cmpCollectionsSet); diff != "" { + t.Errorf("wrong changes\n%s", diff) + } +} + // collectPlanOutput consumes the two output channels emitting results from // a call to [Plan], and collects all of the data written to them before // returning once changesCh has been closed by the sender to indicate that diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/multiple-providers/main.tf b/internal/stacks/stackruntime/testdata/mainbundle/test/multiple-providers/main.tf new file mode 100644 index 0000000000..6bb2a0f28b --- /dev/null +++ b/internal/stacks/stackruntime/testdata/mainbundle/test/multiple-providers/main.tf @@ -0,0 +1,10 @@ +terraform { + required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } + } +} + +resource "testing_resource" "data" {} diff --git a/internal/stacks/stackruntime/testdata/mainbundle/test/multiple-providers/main.tfstack.hcl b/internal/stacks/stackruntime/testdata/mainbundle/test/multiple-providers/main.tfstack.hcl new file mode 100644 index 0000000000..1699a617bf --- /dev/null +++ b/internal/stacks/stackruntime/testdata/mainbundle/test/multiple-providers/main.tfstack.hcl @@ -0,0 +1,22 @@ +required_providers { + testing = { + source = "hashicorp/testing" + version = "0.1.0" + } +} + +provider "testing" "default" { + config { + // This provider is going to fail to configure. + configure_error = "invalid configuration" + } +} + + +component "self" { + source = "./" + + providers = { + testing = provider.testing.default + } +} diff --git a/internal/stacks/stackruntime/testing/provider.go b/internal/stacks/stackruntime/testing/provider.go index 7d11dca069..883b533158 100644 --- a/internal/stacks/stackruntime/testing/provider.go +++ b/internal/stacks/stackruntime/testing/provider.go @@ -57,6 +57,16 @@ func NewProviderWithData(store *ResourceStore) *MockProvider { return &MockProvider{ MockProvider: &testing_provider.MockProvider{ GetProviderSchemaResponse: &providers.GetProviderSchemaResponse{ + Provider: providers.Schema{ + Block: &configschema.Block{ + Attributes: map[string]*configschema.Attribute{ + "configure_error": { + Type: cty.String, + Optional: true, + }, + }, + }, + }, ResourceTypes: map[string]providers.Schema{ "testing_resource": { Block: TestingResourceSchema, @@ -71,6 +81,18 @@ func NewProviderWithData(store *ResourceStore) *MockProvider { }, }, }, + ConfigureProviderFn: func(request providers.ConfigureProviderRequest) providers.ConfigureProviderResponse { + // If configure_error is set, return an error. + err := request.Config.GetAttr("configure_error") + if !err.IsNull() { + return providers.ConfigureProviderResponse{ + Diagnostics: tfdiags.Diagnostics{ + tfdiags.AttributeValue(tfdiags.Error, err.AsString(), "configure_error attribute was set", cty.GetAttrPath("configure_error")), + }, + } + } + return providers.ConfigureProviderResponse{} + }, PlanResourceChangeFn: func(request providers.PlanResourceChangeRequest) providers.PlanResourceChangeResponse { if request.ProposedNewState.IsNull() { // Deleting, so just return the proposed change. From 1d1e979e4682349f66ebe7506296e9a41df6adfa Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Thu, 6 Jun 2024 18:53:59 +0200 Subject: [PATCH 160/161] prepare for v1.10.0-alpha20240606 release --- CHANGELOG.md | 2 +- version/VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f33a23a9a0..03e594f9a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## 1.10.0 (Unreleased) +## 1.10.0-alpha20240606 (June 6, 2024) EXPERIMENTS: diff --git a/version/VERSION b/version/VERSION index 81c871de46..fe96e1e2a1 100644 --- a/version/VERSION +++ b/version/VERSION @@ -1 +1 @@ -1.10.0 +1.10.0-alpha20240606 From 8e4d4663fe37bbae3c0dc1c0bb20b6bcb17b637c Mon Sep 17 00:00:00 2001 From: Liam Cervante Date: Thu, 6 Jun 2024 18:59:34 +0200 Subject: [PATCH 161/161] cleanup after 1.10.0-alpha20240606 release --- CHANGELOG.md | 2 +- version/VERSION | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03e594f9a1..f33a23a9a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## 1.10.0-alpha20240606 (June 6, 2024) +## 1.10.0 (Unreleased) EXPERIMENTS: diff --git a/version/VERSION b/version/VERSION index fe96e1e2a1..81c871de46 100644 --- a/version/VERSION +++ b/version/VERSION @@ -1 +1 @@ -1.10.0-alpha20240606 +1.10.0