From 3c3e4a6d5ffb696033183b06a45370b85fa5ce58 Mon Sep 17 00:00:00 2001 From: Justin Chadwell Date: Thu, 1 Jun 2023 00:33:37 +0200 Subject: [PATCH 1/5] controller: refactor build inputs to external struct This patch continues the move to attempt to merge the build.Options struct into the controllerapi.Options message. To do this, we extract all the input parameters into a dedicated message (adding the missing ones, except for the InStream parameter which will require some additional fiddling around). We also rework the NamedContexts to allow containing States (by transmitting them as DefinitionOps), and adding a Linked field to the common options. Signed-off-by: CrazyMax --- commands/build.go | 77 +++-- controller/build/build.go | 131 +++++--- controller/pb/controller.pb.go | 572 +++++++++++++++++++++------------ controller/pb/controller.proto | 81 +++-- controller/pb/path.go | 99 +++--- controller/pb/path_test.go | 90 ++++-- util/buildflags/context.go | 7 +- 7 files changed, 662 insertions(+), 395 deletions(-) diff --git a/commands/build.go b/commands/build.go index 97b863d2bb70..0a19b1c85ee2 100644 --- a/commands/build.go +++ b/commands/build.go @@ -86,38 +86,38 @@ type buildOptions struct { progress string quiet bool - builder string - metadataFile string - noCache bool - pull bool - exportPush bool - exportLoad bool - + controllerapi.CommonOptions control.ControlOptions } func (o *buildOptions) toControllerOptions() (*controllerapi.BuildOptions, error) { var err error - opts := controllerapi.BuildOptions{ - Allow: o.allow, - BuildArgs: listToMap(o.buildArgs, true), - CgroupParent: o.cgroupParent, + + inputs := controllerapi.Inputs{ ContextPath: o.contextPath, DockerfileName: o.dockerfileName, - ExtraHosts: o.extraHosts, - Labels: listToMap(o.labels, false), - NetworkMode: o.networkMode, - NoCacheFilter: o.noCacheFilter, - Platforms: o.platforms, - ShmSize: int64(o.shmSize), - Tags: o.tags, - Target: o.target, - Ulimits: dockerUlimitToControllerUlimit(o.ulimits), - Builder: o.builder, - NoCache: o.noCache, - Pull: o.pull, - ExportPush: o.exportPush, - ExportLoad: o.exportLoad, + } + inputs.NamedContexts, err = buildflags.ParseContextNames(o.contexts) + if err != nil { + return nil, err + } + + opts := controllerapi.BuildOptions{ + Inputs: &inputs, + Opts: &o.CommonOptions, + + Allow: o.allow, + BuildArgs: listToMap(o.buildArgs, true), + CgroupParent: o.cgroupParent, + ExtraHosts: o.extraHosts, + Labels: listToMap(o.labels, false), + NetworkMode: o.networkMode, + NoCacheFilter: o.noCacheFilter, + Platforms: o.platforms, + ShmSize: int64(o.shmSize), + Tags: o.tags, + Target: o.target, + Ulimits: dockerUlimitToControllerUlimit(o.ulimits), } // TODO: extract env var parsing to a method easily usable by library consumers @@ -144,11 +144,6 @@ func (o *buildOptions) toControllerOptions() (*controllerapi.BuildOptions, error return nil, err } - opts.NamedContexts, err = buildflags.ParseContextNames(o.contexts) - if err != nil { - return nil, err - } - opts.Exports, err = buildflags.ParseExports(o.outputs) if err != nil { return nil, err @@ -228,7 +223,7 @@ func runBuild(dockerCli command.Cli, options buildOptions) (err error) { contextPathHash = absContextPath } b, err := builder.New(dockerCli, - builder.WithName(options.builder), + builder.WithName(options.Builder), builder.WithContextPathHash(contextPathHash), ) if err != nil { @@ -289,8 +284,8 @@ func runBuild(dockerCli command.Cli, options buildOptions) (err error) { return errors.Wrap(err, "writing image ID file") } } - if options.metadataFile != "" { - if err := writeMetadataFile(options.metadataFile, decodeExporterResponse(resp.ExporterResponse)); err != nil { + if options.MetadataFile != "" { + if err := writeMetadataFile(options.MetadataFile, decodeExporterResponse(resp.ExporterResponse)); err != nil { return err } } @@ -418,15 +413,15 @@ func buildCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command { Args: cli.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { options.contextPath = args[0] - options.builder = rootOpts.builder - options.metadataFile = cFlags.metadataFile - options.noCache = false + options.Builder = rootOpts.builder + options.MetadataFile = cFlags.metadataFile + options.NoCache = false if cFlags.noCache != nil { - options.noCache = *cFlags.noCache + options.NoCache = *cFlags.noCache } - options.pull = false + options.Pull = false if cFlags.pull != nil { - options.pull = *cFlags.pull + options.Pull = *cFlags.pull } options.progress = cFlags.progress cmd.Flags().VisitAll(checkWarnedFlags) @@ -476,7 +471,7 @@ func buildCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command { flags.StringArrayVar(&options.labels, "label", []string{}, "Set metadata for an image") - flags.BoolVar(&options.exportLoad, "load", false, `Shorthand for "--output=type=docker"`) + flags.BoolVar(&options.ExportLoad, "load", false, `Shorthand for "--output=type=docker"`) flags.StringVar(&options.networkMode, "network", "default", `Set the networking mode for the "RUN" instructions during build`) @@ -490,7 +485,7 @@ func buildCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command { flags.StringVar(&options.printFunc, "print", "", "Print result of information request (e.g., outline, targets) [experimental]") } - flags.BoolVar(&options.exportPush, "push", false, `Shorthand for "--output=type=registry"`) + flags.BoolVar(&options.ExportPush, "push", false, `Shorthand for "--output=type=registry"`) flags.BoolVarP(&options.quiet, "quiet", "q", false, "Suppress the build output and print image ID on success") diff --git a/controller/build/build.go b/controller/build/build.go index 64069d782ed2..c262f455c1a1 100644 --- a/controller/build/build.go +++ b/controller/build/build.go @@ -23,6 +23,7 @@ import ( dockeropts "github.com/docker/cli/opts" "github.com/docker/go-units" "github.com/moby/buildkit/client" + "github.com/moby/buildkit/client/llb" "github.com/moby/buildkit/session/auth/authprovider" "github.com/moby/buildkit/util/grpcerrors" "github.com/pkg/errors" @@ -37,29 +38,85 @@ const defaultTargetName = "default" // this function returns it in addition to the error (i.e. it does "return nil, res, err"). The caller can // inspect the result and debug the cause of that error. func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.BuildOptions, inStream io.Reader, progress progress.Writer, generateResult bool) (*client.SolveResponse, *build.ResultHandle, error) { - if in.NoCache && len(in.NoCacheFilter) > 0 { - return nil, nil, errors.Errorf("--no-cache and --no-cache-filter cannot currently be used together") + opts, err := ToBuildOpts(in, inStream) + if err != nil { + return nil, nil, err + } + + // key string used for kubernetes "sticky" mode + contextPathHash, err := filepath.Abs(in.Inputs.ContextPath) + if err != nil { + contextPathHash = in.Inputs.ContextPath + } + + b, err := builder.New(dockerCli, + builder.WithName(in.Opts.Builder), + builder.WithContextPathHash(contextPathHash), + ) + if err != nil { + return nil, nil, err + } + if err = updateLastActivity(dockerCli, b.NodeGroup); err != nil { + return nil, nil, errors.Wrapf(err, "failed to update builder last activity time") + } + nodes, err := b.LoadNodes(ctx, false) + if err != nil { + return nil, nil, err + } + + resp, res, err := buildTargets(ctx, dockerCli, b.NodeGroup, nodes, map[string]build.Options{defaultTargetName: *opts}, progress, generateResult) + err = wrapBuildError(err, false) + if err != nil { + return nil, nil, err + } + return resp, res, nil +} + +func ToBuildOpts(in controllerapi.BuildOptions, inStream io.Reader) (*build.Options, error) { + if in.Opts.NoCache && len(in.NoCacheFilter) > 0 { + return nil, errors.Errorf("--no-cache and --no-cache-filter cannot currently be used together") + } + + var ctxst *llb.State + if in.Inputs.ContextDefinition != nil { + defop, err := llb.NewDefinitionOp(in.Inputs.ContextDefinition) + if err != nil { + return nil, err + } + st := llb.NewState(defop) + ctxst = &st } contexts := map[string]build.NamedContext{} - for name, path := range in.NamedContexts { - contexts[name] = build.NamedContext{Path: path} + for name, nctx := range in.Inputs.NamedContexts { + if nctx.Definition != nil { + defop, err := llb.NewDefinitionOp(nctx.Definition) + if err != nil { + return nil, err + } + st := llb.NewState(defop) + contexts[name] = build.NamedContext{State: &st} + } else { + contexts[name] = build.NamedContext{Path: nctx.Path} + } } opts := build.Options{ Inputs: build.Inputs{ - ContextPath: in.ContextPath, - DockerfilePath: in.DockerfileName, - InStream: inStream, - NamedContexts: contexts, + ContextPath: in.Inputs.ContextPath, + DockerfilePath: in.Inputs.DockerfileName, + DockerfileInline: in.Inputs.DockerfileInline, + ContextState: ctxst, + InStream: inStream, + NamedContexts: contexts, }, BuildArgs: in.BuildArgs, ExtraHosts: in.ExtraHosts, Labels: in.Labels, NetworkMode: in.NetworkMode, - NoCache: in.NoCache, + NoCache: in.Opts.NoCache, NoCacheFilter: in.NoCacheFilter, - Pull: in.Pull, + Pull: in.Opts.Pull, ShmSize: dockeropts.MemBytes(in.ShmSize), Tags: in.Tags, Target: in.Target, @@ -68,7 +125,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build platforms, err := platformutil.Parse(in.Platforms) if err != nil { - return nil, nil, err + return nil, err } opts.Platforms = platforms @@ -77,27 +134,27 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build secrets, err := controllerapi.CreateSecrets(in.Secrets) if err != nil { - return nil, nil, err + return nil, err } opts.Session = append(opts.Session, secrets) sshSpecs := in.SSH - if len(sshSpecs) == 0 && buildflags.IsGitSSH(in.ContextPath) { + if len(sshSpecs) == 0 && buildflags.IsGitSSH(in.Inputs.ContextPath) { sshSpecs = append(sshSpecs, &controllerapi.SSH{ID: "default"}) } ssh, err := controllerapi.CreateSSH(sshSpecs) if err != nil { - return nil, nil, err + return nil, err } opts.Session = append(opts.Session, ssh) outputs, err := controllerapi.CreateExports(in.Exports) if err != nil { - return nil, nil, err + return nil, err } - if in.ExportPush { - if in.ExportLoad { - return nil, nil, errors.Errorf("push and load may not be set together at the moment") + if in.Opts.ExportPush { + if in.Opts.ExportLoad { + return nil, errors.Errorf("push and load may not be set together at the moment") } if len(outputs) == 0 { outputs = []client.ExportEntry{{ @@ -111,11 +168,11 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build case "image": outputs[0].Attrs["push"] = "true" default: - return nil, nil, errors.Errorf("push and %q output can't be used together", outputs[0].Type) + return nil, errors.Errorf("push and %q output can't be used together", outputs[0].Type) } } } - if in.ExportLoad { + if in.Opts.ExportLoad { if len(outputs) == 0 { outputs = []client.ExportEntry{{ Type: "docker", @@ -125,7 +182,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build switch outputs[0].Type { case "docker": default: - return nil, nil, errors.Errorf("load and %q output can't be used together", outputs[0].Type) + return nil, errors.Errorf("load and %q output can't be used together", outputs[0].Type) } } } @@ -140,7 +197,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build allow, err := buildflags.ParseEntitlements(in.Allow) if err != nil { - return nil, nil, err + return nil, err } opts.Allow = allow @@ -151,35 +208,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build } } - // key string used for kubernetes "sticky" mode - contextPathHash, err := filepath.Abs(in.ContextPath) - if err != nil { - contextPathHash = in.ContextPath - } - - // TODO: this should not be loaded this side of the controller api - b, err := builder.New(dockerCli, - builder.WithName(in.Builder), - builder.WithContextPathHash(contextPathHash), - ) - if err != nil { - return nil, nil, err - } - if err = updateLastActivity(dockerCli, b.NodeGroup); err != nil { - return nil, nil, errors.Wrapf(err, "failed to update builder last activity time") - } - nodes, err := b.LoadNodes(ctx, false) - if err != nil { - return nil, nil, err - } - - resp, res, err := buildTargets(ctx, dockerCli, b.NodeGroup, nodes, map[string]build.Options{defaultTargetName: opts}, progress, generateResult) - err = wrapBuildError(err, false) - if err != nil { - // NOTE: buildTargets can return *build.ResultHandle even on error. - return nil, res, err - } - return resp, res, nil + return &opts, nil } // buildTargets runs the specified build and returns the result. diff --git a/controller/pb/controller.pb.go b/controller/pb/controller.pb.go index 03194937aae9..b679db32ced9 100644 --- a/controller/pb/controller.pb.go +++ b/controller/pb/controller.pb.go @@ -8,7 +8,8 @@ import ( fmt "fmt" proto "github.com/gogo/protobuf/proto" control "github.com/moby/buildkit/api/services/control" - pb "github.com/moby/buildkit/sourcepolicy/pb" + pb "github.com/moby/buildkit/solver/pb" + pb1 "github.com/moby/buildkit/sourcepolicy/pb" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -270,35 +271,99 @@ func (m *BuildRequest) GetOptions() *BuildOptions { return nil } +type Inputs struct { + ContextPath string `protobuf:"bytes,1,opt,name=ContextPath,proto3" json:"ContextPath,omitempty"` + DockerfileName string `protobuf:"bytes,2,opt,name=DockerfileName,proto3" json:"DockerfileName,omitempty"` + DockerfileInline string `protobuf:"bytes,3,opt,name=DockerfileInline,proto3" json:"DockerfileInline,omitempty"` + ContextDefinition *pb.Definition `protobuf:"bytes,4,opt,name=ContextDefinition,proto3" json:"ContextDefinition,omitempty"` + NamedContexts map[string]*NamedContext `protobuf:"bytes,5,rep,name=NamedContexts,proto3" json:"NamedContexts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Inputs) Reset() { *m = Inputs{} } +func (m *Inputs) String() string { return proto.CompactTextString(m) } +func (*Inputs) ProtoMessage() {} +func (*Inputs) Descriptor() ([]byte, []int) { + return fileDescriptor_ed7f10298fa1d90f, []int{6} +} +func (m *Inputs) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Inputs.Unmarshal(m, b) +} +func (m *Inputs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Inputs.Marshal(b, m, deterministic) +} +func (m *Inputs) XXX_Merge(src proto.Message) { + xxx_messageInfo_Inputs.Merge(m, src) +} +func (m *Inputs) XXX_Size() int { + return xxx_messageInfo_Inputs.Size(m) +} +func (m *Inputs) XXX_DiscardUnknown() { + xxx_messageInfo_Inputs.DiscardUnknown(m) +} + +var xxx_messageInfo_Inputs proto.InternalMessageInfo + +func (m *Inputs) GetContextPath() string { + if m != nil { + return m.ContextPath + } + return "" +} + +func (m *Inputs) GetDockerfileName() string { + if m != nil { + return m.DockerfileName + } + return "" +} + +func (m *Inputs) GetDockerfileInline() string { + if m != nil { + return m.DockerfileInline + } + return "" +} + +func (m *Inputs) GetContextDefinition() *pb.Definition { + if m != nil { + return m.ContextDefinition + } + return nil +} + +func (m *Inputs) GetNamedContexts() map[string]*NamedContext { + if m != nil { + return m.NamedContexts + } + return nil +} + type BuildOptions struct { - ContextPath string `protobuf:"bytes,1,opt,name=ContextPath,proto3" json:"ContextPath,omitempty"` - DockerfileName string `protobuf:"bytes,2,opt,name=DockerfileName,proto3" json:"DockerfileName,omitempty"` - PrintFunc *PrintFunc `protobuf:"bytes,3,opt,name=PrintFunc,proto3" json:"PrintFunc,omitempty"` - NamedContexts map[string]string `protobuf:"bytes,4,rep,name=NamedContexts,proto3" json:"NamedContexts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Allow []string `protobuf:"bytes,5,rep,name=Allow,proto3" json:"Allow,omitempty"` - Attests []*Attest `protobuf:"bytes,6,rep,name=Attests,proto3" json:"Attests,omitempty"` - BuildArgs map[string]string `protobuf:"bytes,7,rep,name=BuildArgs,proto3" json:"BuildArgs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - CacheFrom []*CacheOptionsEntry `protobuf:"bytes,8,rep,name=CacheFrom,proto3" json:"CacheFrom,omitempty"` - CacheTo []*CacheOptionsEntry `protobuf:"bytes,9,rep,name=CacheTo,proto3" json:"CacheTo,omitempty"` - CgroupParent string `protobuf:"bytes,10,opt,name=CgroupParent,proto3" json:"CgroupParent,omitempty"` - Exports []*ExportEntry `protobuf:"bytes,11,rep,name=Exports,proto3" json:"Exports,omitempty"` - ExtraHosts []string `protobuf:"bytes,12,rep,name=ExtraHosts,proto3" json:"ExtraHosts,omitempty"` - Labels map[string]string `protobuf:"bytes,13,rep,name=Labels,proto3" json:"Labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - NetworkMode string `protobuf:"bytes,14,opt,name=NetworkMode,proto3" json:"NetworkMode,omitempty"` - NoCacheFilter []string `protobuf:"bytes,15,rep,name=NoCacheFilter,proto3" json:"NoCacheFilter,omitempty"` - Platforms []string `protobuf:"bytes,16,rep,name=Platforms,proto3" json:"Platforms,omitempty"` - Secrets []*Secret `protobuf:"bytes,17,rep,name=Secrets,proto3" json:"Secrets,omitempty"` - ShmSize int64 `protobuf:"varint,18,opt,name=ShmSize,proto3" json:"ShmSize,omitempty"` - SSH []*SSH `protobuf:"bytes,19,rep,name=SSH,proto3" json:"SSH,omitempty"` - Tags []string `protobuf:"bytes,20,rep,name=Tags,proto3" json:"Tags,omitempty"` - Target string `protobuf:"bytes,21,opt,name=Target,proto3" json:"Target,omitempty"` - Ulimits *UlimitOpt `protobuf:"bytes,22,opt,name=Ulimits,proto3" json:"Ulimits,omitempty"` - Builder string `protobuf:"bytes,23,opt,name=Builder,proto3" json:"Builder,omitempty"` - NoCache bool `protobuf:"varint,24,opt,name=NoCache,proto3" json:"NoCache,omitempty"` - Pull bool `protobuf:"varint,25,opt,name=Pull,proto3" json:"Pull,omitempty"` - ExportPush bool `protobuf:"varint,26,opt,name=ExportPush,proto3" json:"ExportPush,omitempty"` - ExportLoad bool `protobuf:"varint,27,opt,name=ExportLoad,proto3" json:"ExportLoad,omitempty"` - SourcePolicy *pb.Policy `protobuf:"bytes,28,opt,name=SourcePolicy,proto3" json:"SourcePolicy,omitempty"` + Inputs *Inputs `protobuf:"bytes,1,opt,name=Inputs,proto3" json:"Inputs,omitempty"` + PrintFunc *PrintFunc `protobuf:"bytes,2,opt,name=PrintFunc,proto3" json:"PrintFunc,omitempty"` + Opts *CommonOptions `protobuf:"bytes,3,opt,name=Opts,proto3" json:"Opts,omitempty"` + Allow []string `protobuf:"bytes,4,rep,name=Allow,proto3" json:"Allow,omitempty"` + Attests []*Attest `protobuf:"bytes,5,rep,name=Attests,proto3" json:"Attests,omitempty"` + BuildArgs map[string]string `protobuf:"bytes,6,rep,name=BuildArgs,proto3" json:"BuildArgs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + CacheFrom []*CacheOptionsEntry `protobuf:"bytes,7,rep,name=CacheFrom,proto3" json:"CacheFrom,omitempty"` + CacheTo []*CacheOptionsEntry `protobuf:"bytes,8,rep,name=CacheTo,proto3" json:"CacheTo,omitempty"` + CgroupParent string `protobuf:"bytes,9,opt,name=CgroupParent,proto3" json:"CgroupParent,omitempty"` + Exports []*ExportEntry `protobuf:"bytes,10,rep,name=Exports,proto3" json:"Exports,omitempty"` + ExtraHosts []string `protobuf:"bytes,11,rep,name=ExtraHosts,proto3" json:"ExtraHosts,omitempty"` + Labels map[string]string `protobuf:"bytes,12,rep,name=Labels,proto3" json:"Labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NetworkMode string `protobuf:"bytes,13,opt,name=NetworkMode,proto3" json:"NetworkMode,omitempty"` + NoCacheFilter []string `protobuf:"bytes,14,rep,name=NoCacheFilter,proto3" json:"NoCacheFilter,omitempty"` + Platforms []string `protobuf:"bytes,15,rep,name=Platforms,proto3" json:"Platforms,omitempty"` + Secrets []*Secret `protobuf:"bytes,16,rep,name=Secrets,proto3" json:"Secrets,omitempty"` + ShmSize int64 `protobuf:"varint,17,opt,name=ShmSize,proto3" json:"ShmSize,omitempty"` + SSH []*SSH `protobuf:"bytes,18,rep,name=SSH,proto3" json:"SSH,omitempty"` + Tags []string `protobuf:"bytes,19,rep,name=Tags,proto3" json:"Tags,omitempty"` + Target string `protobuf:"bytes,20,opt,name=Target,proto3" json:"Target,omitempty"` + Ulimits *UlimitOpt `protobuf:"bytes,21,opt,name=Ulimits,proto3" json:"Ulimits,omitempty"` + SourcePolicy *pb1.Policy `protobuf:"bytes,22,opt,name=SourcePolicy,proto3" json:"SourcePolicy,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -308,7 +373,7 @@ func (m *BuildOptions) Reset() { *m = BuildOptions{} } func (m *BuildOptions) String() string { return proto.CompactTextString(m) } func (*BuildOptions) ProtoMessage() {} func (*BuildOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{6} + return fileDescriptor_ed7f10298fa1d90f, []int{7} } func (m *BuildOptions) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BuildOptions.Unmarshal(m, b) @@ -328,18 +393,11 @@ func (m *BuildOptions) XXX_DiscardUnknown() { var xxx_messageInfo_BuildOptions proto.InternalMessageInfo -func (m *BuildOptions) GetContextPath() string { +func (m *BuildOptions) GetInputs() *Inputs { if m != nil { - return m.ContextPath + return m.Inputs } - return "" -} - -func (m *BuildOptions) GetDockerfileName() string { - if m != nil { - return m.DockerfileName - } - return "" + return nil } func (m *BuildOptions) GetPrintFunc() *PrintFunc { @@ -349,9 +407,9 @@ func (m *BuildOptions) GetPrintFunc() *PrintFunc { return nil } -func (m *BuildOptions) GetNamedContexts() map[string]string { +func (m *BuildOptions) GetOpts() *CommonOptions { if m != nil { - return m.NamedContexts + return m.Opts } return nil } @@ -482,46 +540,148 @@ func (m *BuildOptions) GetUlimits() *UlimitOpt { return nil } -func (m *BuildOptions) GetBuilder() string { +func (m *BuildOptions) GetSourcePolicy() *pb1.Policy { + if m != nil { + return m.SourcePolicy + } + return nil +} + +type NamedContext struct { + Path string `protobuf:"bytes,1,opt,name=Path,proto3" json:"Path,omitempty"` + Definition *pb.Definition `protobuf:"bytes,2,opt,name=Definition,proto3" json:"Definition,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NamedContext) Reset() { *m = NamedContext{} } +func (m *NamedContext) String() string { return proto.CompactTextString(m) } +func (*NamedContext) ProtoMessage() {} +func (*NamedContext) Descriptor() ([]byte, []int) { + return fileDescriptor_ed7f10298fa1d90f, []int{8} +} +func (m *NamedContext) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NamedContext.Unmarshal(m, b) +} +func (m *NamedContext) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NamedContext.Marshal(b, m, deterministic) +} +func (m *NamedContext) XXX_Merge(src proto.Message) { + xxx_messageInfo_NamedContext.Merge(m, src) +} +func (m *NamedContext) XXX_Size() int { + return xxx_messageInfo_NamedContext.Size(m) +} +func (m *NamedContext) XXX_DiscardUnknown() { + xxx_messageInfo_NamedContext.DiscardUnknown(m) +} + +var xxx_messageInfo_NamedContext proto.InternalMessageInfo + +func (m *NamedContext) GetPath() string { + if m != nil { + return m.Path + } + return "" +} + +func (m *NamedContext) GetDefinition() *pb.Definition { + if m != nil { + return m.Definition + } + return nil +} + +type CommonOptions struct { + Builder string `protobuf:"bytes,1,opt,name=Builder,proto3" json:"Builder,omitempty"` + MetadataFile string `protobuf:"bytes,2,opt,name=MetadataFile,proto3" json:"MetadataFile,omitempty"` + NoCache bool `protobuf:"varint,3,opt,name=NoCache,proto3" json:"NoCache,omitempty"` + // string Progress: no progress view on server side + Pull bool `protobuf:"varint,4,opt,name=Pull,proto3" json:"Pull,omitempty"` + ExportPush bool `protobuf:"varint,5,opt,name=ExportPush,proto3" json:"ExportPush,omitempty"` + ExportLoad bool `protobuf:"varint,6,opt,name=ExportLoad,proto3" json:"ExportLoad,omitempty"` + // TODO: we should remove Linked from the controllerapi, it's only used to + // produce a single warning. To allow this, we need to move the default + // export detection out from the controller server, as well as load the + // driver on the controller client. + Linked bool `protobuf:"varint,7,opt,name=Linked,proto3" json:"Linked,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CommonOptions) Reset() { *m = CommonOptions{} } +func (m *CommonOptions) String() string { return proto.CompactTextString(m) } +func (*CommonOptions) ProtoMessage() {} +func (*CommonOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_ed7f10298fa1d90f, []int{9} +} +func (m *CommonOptions) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CommonOptions.Unmarshal(m, b) +} +func (m *CommonOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CommonOptions.Marshal(b, m, deterministic) +} +func (m *CommonOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_CommonOptions.Merge(m, src) +} +func (m *CommonOptions) XXX_Size() int { + return xxx_messageInfo_CommonOptions.Size(m) +} +func (m *CommonOptions) XXX_DiscardUnknown() { + xxx_messageInfo_CommonOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_CommonOptions proto.InternalMessageInfo + +func (m *CommonOptions) GetBuilder() string { if m != nil { return m.Builder } return "" } -func (m *BuildOptions) GetNoCache() bool { +func (m *CommonOptions) GetMetadataFile() string { + if m != nil { + return m.MetadataFile + } + return "" +} + +func (m *CommonOptions) GetNoCache() bool { if m != nil { return m.NoCache } return false } -func (m *BuildOptions) GetPull() bool { +func (m *CommonOptions) GetPull() bool { if m != nil { return m.Pull } return false } -func (m *BuildOptions) GetExportPush() bool { +func (m *CommonOptions) GetExportPush() bool { if m != nil { return m.ExportPush } return false } -func (m *BuildOptions) GetExportLoad() bool { +func (m *CommonOptions) GetExportLoad() bool { if m != nil { return m.ExportLoad } return false } -func (m *BuildOptions) GetSourcePolicy() *pb.Policy { +func (m *CommonOptions) GetLinked() bool { if m != nil { - return m.SourcePolicy + return m.Linked } - return nil + return false } type ExportEntry struct { @@ -537,7 +697,7 @@ func (m *ExportEntry) Reset() { *m = ExportEntry{} } func (m *ExportEntry) String() string { return proto.CompactTextString(m) } func (*ExportEntry) ProtoMessage() {} func (*ExportEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{7} + return fileDescriptor_ed7f10298fa1d90f, []int{10} } func (m *ExportEntry) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExportEntry.Unmarshal(m, b) @@ -590,7 +750,7 @@ func (m *CacheOptionsEntry) Reset() { *m = CacheOptionsEntry{} } func (m *CacheOptionsEntry) String() string { return proto.CompactTextString(m) } func (*CacheOptionsEntry) ProtoMessage() {} func (*CacheOptionsEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{8} + return fileDescriptor_ed7f10298fa1d90f, []int{11} } func (m *CacheOptionsEntry) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CacheOptionsEntry.Unmarshal(m, b) @@ -637,7 +797,7 @@ func (m *Attest) Reset() { *m = Attest{} } func (m *Attest) String() string { return proto.CompactTextString(m) } func (*Attest) ProtoMessage() {} func (*Attest) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{9} + return fileDescriptor_ed7f10298fa1d90f, []int{12} } func (m *Attest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Attest.Unmarshal(m, b) @@ -690,7 +850,7 @@ func (m *SSH) Reset() { *m = SSH{} } func (m *SSH) String() string { return proto.CompactTextString(m) } func (*SSH) ProtoMessage() {} func (*SSH) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{10} + return fileDescriptor_ed7f10298fa1d90f, []int{13} } func (m *SSH) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SSH.Unmarshal(m, b) @@ -737,7 +897,7 @@ func (m *Secret) Reset() { *m = Secret{} } func (m *Secret) String() string { return proto.CompactTextString(m) } func (*Secret) ProtoMessage() {} func (*Secret) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{11} + return fileDescriptor_ed7f10298fa1d90f, []int{14} } func (m *Secret) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Secret.Unmarshal(m, b) @@ -790,7 +950,7 @@ func (m *PrintFunc) Reset() { *m = PrintFunc{} } func (m *PrintFunc) String() string { return proto.CompactTextString(m) } func (*PrintFunc) ProtoMessage() {} func (*PrintFunc) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{12} + return fileDescriptor_ed7f10298fa1d90f, []int{15} } func (m *PrintFunc) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PrintFunc.Unmarshal(m, b) @@ -835,7 +995,7 @@ func (m *InspectRequest) Reset() { *m = InspectRequest{} } func (m *InspectRequest) String() string { return proto.CompactTextString(m) } func (*InspectRequest) ProtoMessage() {} func (*InspectRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{13} + return fileDescriptor_ed7f10298fa1d90f, []int{16} } func (m *InspectRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InspectRequest.Unmarshal(m, b) @@ -873,7 +1033,7 @@ func (m *InspectResponse) Reset() { *m = InspectResponse{} } func (m *InspectResponse) String() string { return proto.CompactTextString(m) } func (*InspectResponse) ProtoMessage() {} func (*InspectResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{14} + return fileDescriptor_ed7f10298fa1d90f, []int{17} } func (m *InspectResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InspectResponse.Unmarshal(m, b) @@ -911,7 +1071,7 @@ func (m *UlimitOpt) Reset() { *m = UlimitOpt{} } func (m *UlimitOpt) String() string { return proto.CompactTextString(m) } func (*UlimitOpt) ProtoMessage() {} func (*UlimitOpt) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{15} + return fileDescriptor_ed7f10298fa1d90f, []int{18} } func (m *UlimitOpt) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UlimitOpt.Unmarshal(m, b) @@ -951,7 +1111,7 @@ func (m *Ulimit) Reset() { *m = Ulimit{} } func (m *Ulimit) String() string { return proto.CompactTextString(m) } func (*Ulimit) ProtoMessage() {} func (*Ulimit) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{16} + return fileDescriptor_ed7f10298fa1d90f, []int{19} } func (m *Ulimit) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Ulimit.Unmarshal(m, b) @@ -1003,7 +1163,7 @@ func (m *BuildResponse) Reset() { *m = BuildResponse{} } func (m *BuildResponse) String() string { return proto.CompactTextString(m) } func (*BuildResponse) ProtoMessage() {} func (*BuildResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{17} + return fileDescriptor_ed7f10298fa1d90f, []int{20} } func (m *BuildResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BuildResponse.Unmarshal(m, b) @@ -1041,7 +1201,7 @@ func (m *DisconnectRequest) Reset() { *m = DisconnectRequest{} } func (m *DisconnectRequest) String() string { return proto.CompactTextString(m) } func (*DisconnectRequest) ProtoMessage() {} func (*DisconnectRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{18} + return fileDescriptor_ed7f10298fa1d90f, []int{21} } func (m *DisconnectRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DisconnectRequest.Unmarshal(m, b) @@ -1078,7 +1238,7 @@ func (m *DisconnectResponse) Reset() { *m = DisconnectResponse{} } func (m *DisconnectResponse) String() string { return proto.CompactTextString(m) } func (*DisconnectResponse) ProtoMessage() {} func (*DisconnectResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{19} + return fileDescriptor_ed7f10298fa1d90f, []int{22} } func (m *DisconnectResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DisconnectResponse.Unmarshal(m, b) @@ -1109,7 +1269,7 @@ func (m *ListRequest) Reset() { *m = ListRequest{} } func (m *ListRequest) String() string { return proto.CompactTextString(m) } func (*ListRequest) ProtoMessage() {} func (*ListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{20} + return fileDescriptor_ed7f10298fa1d90f, []int{23} } func (m *ListRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListRequest.Unmarshal(m, b) @@ -1147,7 +1307,7 @@ func (m *ListResponse) Reset() { *m = ListResponse{} } func (m *ListResponse) String() string { return proto.CompactTextString(m) } func (*ListResponse) ProtoMessage() {} func (*ListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{21} + return fileDescriptor_ed7f10298fa1d90f, []int{24} } func (m *ListResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListResponse.Unmarshal(m, b) @@ -1188,7 +1348,7 @@ func (m *InputMessage) Reset() { *m = InputMessage{} } func (m *InputMessage) String() string { return proto.CompactTextString(m) } func (*InputMessage) ProtoMessage() {} func (*InputMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{22} + return fileDescriptor_ed7f10298fa1d90f, []int{25} } func (m *InputMessage) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InputMessage.Unmarshal(m, b) @@ -1262,7 +1422,7 @@ func (m *InputInitMessage) Reset() { *m = InputInitMessage{} } func (m *InputInitMessage) String() string { return proto.CompactTextString(m) } func (*InputInitMessage) ProtoMessage() {} func (*InputInitMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{23} + return fileDescriptor_ed7f10298fa1d90f, []int{26} } func (m *InputInitMessage) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InputInitMessage.Unmarshal(m, b) @@ -1301,7 +1461,7 @@ func (m *DataMessage) Reset() { *m = DataMessage{} } func (m *DataMessage) String() string { return proto.CompactTextString(m) } func (*DataMessage) ProtoMessage() {} func (*DataMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{24} + return fileDescriptor_ed7f10298fa1d90f, []int{27} } func (m *DataMessage) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DataMessage.Unmarshal(m, b) @@ -1345,7 +1505,7 @@ func (m *InputResponse) Reset() { *m = InputResponse{} } func (m *InputResponse) String() string { return proto.CompactTextString(m) } func (*InputResponse) ProtoMessage() {} func (*InputResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{25} + return fileDescriptor_ed7f10298fa1d90f, []int{28} } func (m *InputResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InputResponse.Unmarshal(m, b) @@ -1381,7 +1541,7 @@ func (m *Message) Reset() { *m = Message{} } func (m *Message) String() string { return proto.CompactTextString(m) } func (*Message) ProtoMessage() {} func (*Message) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{26} + return fileDescriptor_ed7f10298fa1d90f, []int{29} } func (m *Message) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Message.Unmarshal(m, b) @@ -1483,7 +1643,7 @@ func (m *InitMessage) Reset() { *m = InitMessage{} } func (m *InitMessage) String() string { return proto.CompactTextString(m) } func (*InitMessage) ProtoMessage() {} func (*InitMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{27} + return fileDescriptor_ed7f10298fa1d90f, []int{30} } func (m *InitMessage) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InitMessage.Unmarshal(m, b) @@ -1544,7 +1704,7 @@ func (m *InvokeConfig) Reset() { *m = InvokeConfig{} } func (m *InvokeConfig) String() string { return proto.CompactTextString(m) } func (*InvokeConfig) ProtoMessage() {} func (*InvokeConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{28} + return fileDescriptor_ed7f10298fa1d90f, []int{31} } func (m *InvokeConfig) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InvokeConfig.Unmarshal(m, b) @@ -1647,7 +1807,7 @@ func (m *FdMessage) Reset() { *m = FdMessage{} } func (m *FdMessage) String() string { return proto.CompactTextString(m) } func (*FdMessage) ProtoMessage() {} func (*FdMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{29} + return fileDescriptor_ed7f10298fa1d90f, []int{32} } func (m *FdMessage) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_FdMessage.Unmarshal(m, b) @@ -1700,7 +1860,7 @@ func (m *ResizeMessage) Reset() { *m = ResizeMessage{} } func (m *ResizeMessage) String() string { return proto.CompactTextString(m) } func (*ResizeMessage) ProtoMessage() {} func (*ResizeMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{30} + return fileDescriptor_ed7f10298fa1d90f, []int{33} } func (m *ResizeMessage) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ResizeMessage.Unmarshal(m, b) @@ -1747,7 +1907,7 @@ func (m *SignalMessage) Reset() { *m = SignalMessage{} } func (m *SignalMessage) String() string { return proto.CompactTextString(m) } func (*SignalMessage) ProtoMessage() {} func (*SignalMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{31} + return fileDescriptor_ed7f10298fa1d90f, []int{34} } func (m *SignalMessage) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SignalMessage.Unmarshal(m, b) @@ -1785,7 +1945,7 @@ func (m *StatusRequest) Reset() { *m = StatusRequest{} } func (m *StatusRequest) String() string { return proto.CompactTextString(m) } func (*StatusRequest) ProtoMessage() {} func (*StatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{32} + return fileDescriptor_ed7f10298fa1d90f, []int{35} } func (m *StatusRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StatusRequest.Unmarshal(m, b) @@ -1826,7 +1986,7 @@ func (m *StatusResponse) Reset() { *m = StatusResponse{} } func (m *StatusResponse) String() string { return proto.CompactTextString(m) } func (*StatusResponse) ProtoMessage() {} func (*StatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{33} + return fileDescriptor_ed7f10298fa1d90f, []int{36} } func (m *StatusResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StatusResponse.Unmarshal(m, b) @@ -1884,7 +2044,7 @@ func (m *InfoRequest) Reset() { *m = InfoRequest{} } func (m *InfoRequest) String() string { return proto.CompactTextString(m) } func (*InfoRequest) ProtoMessage() {} func (*InfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{34} + return fileDescriptor_ed7f10298fa1d90f, []int{37} } func (m *InfoRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InfoRequest.Unmarshal(m, b) @@ -1915,7 +2075,7 @@ func (m *InfoResponse) Reset() { *m = InfoResponse{} } func (m *InfoResponse) String() string { return proto.CompactTextString(m) } func (*InfoResponse) ProtoMessage() {} func (*InfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{35} + return fileDescriptor_ed7f10298fa1d90f, []int{38} } func (m *InfoResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InfoResponse.Unmarshal(m, b) @@ -1955,7 +2115,7 @@ func (m *BuildxVersion) Reset() { *m = BuildxVersion{} } func (m *BuildxVersion) String() string { return proto.CompactTextString(m) } func (*BuildxVersion) ProtoMessage() {} func (*BuildxVersion) Descriptor() ([]byte, []int) { - return fileDescriptor_ed7f10298fa1d90f, []int{36} + return fileDescriptor_ed7f10298fa1d90f, []int{39} } func (m *BuildxVersion) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BuildxVersion.Unmarshal(m, b) @@ -2003,10 +2163,13 @@ func init() { proto.RegisterType((*DisconnectProcessRequest)(nil), "buildx.controller.v1.DisconnectProcessRequest") proto.RegisterType((*DisconnectProcessResponse)(nil), "buildx.controller.v1.DisconnectProcessResponse") proto.RegisterType((*BuildRequest)(nil), "buildx.controller.v1.BuildRequest") + proto.RegisterType((*Inputs)(nil), "buildx.controller.v1.Inputs") + proto.RegisterMapType((map[string]*NamedContext)(nil), "buildx.controller.v1.Inputs.NamedContextsEntry") proto.RegisterType((*BuildOptions)(nil), "buildx.controller.v1.BuildOptions") proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.BuildOptions.BuildArgsEntry") proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.BuildOptions.LabelsEntry") - proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.BuildOptions.NamedContextsEntry") + proto.RegisterType((*NamedContext)(nil), "buildx.controller.v1.NamedContext") + proto.RegisterType((*CommonOptions)(nil), "buildx.controller.v1.CommonOptions") proto.RegisterType((*ExportEntry)(nil), "buildx.controller.v1.ExportEntry") proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.ExportEntry.AttrsEntry") proto.RegisterType((*CacheOptionsEntry)(nil), "buildx.controller.v1.CacheOptionsEntry") @@ -2046,125 +2209,134 @@ func init() { func init() { proto.RegisterFile("controller.proto", fileDescriptor_ed7f10298fa1d90f) } var fileDescriptor_ed7f10298fa1d90f = []byte{ - // 1881 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0x5f, 0x6f, 0xdb, 0xc8, - 0x11, 0x2f, 0x25, 0x59, 0x7f, 0x46, 0x96, 0xe3, 0x6c, 0x9d, 0x74, 0xc3, 0xa4, 0x17, 0x87, 0x49, - 0xae, 0x42, 0x53, 0x48, 0x77, 0xbe, 0xa6, 0xbe, 0x5c, 0xee, 0x80, 0xda, 0xb2, 0x05, 0xfb, 0x90, - 0xd8, 0xc6, 0xca, 0xc9, 0xa1, 0x2d, 0xd0, 0x80, 0x92, 0xd6, 0x32, 0x21, 0x8a, 0xab, 0x72, 0x57, - 0xb6, 0xd5, 0xa7, 0xbe, 0xf4, 0xad, 0xe8, 0xf7, 0x28, 0xfa, 0x11, 0xfa, 0xd2, 0x7e, 0xa1, 0xa2, - 0x1f, 0xa1, 0xd8, 0x3f, 0xa4, 0x48, 0x4b, 0x94, 0xed, 0xf6, 0x49, 0x3b, 0xc3, 0xdf, 0x6f, 0x76, - 0x67, 0x38, 0x3b, 0x33, 0x14, 0xac, 0xf7, 0x58, 0x20, 0x42, 0xe6, 0xfb, 0x34, 0x6c, 0x8c, 0x43, - 0x26, 0x18, 0xda, 0xe8, 0x4e, 0x3c, 0xbf, 0x7f, 0xd5, 0x48, 0x3c, 0xb8, 0xf8, 0xd2, 0x7e, 0x3b, - 0xf0, 0xc4, 0xf9, 0xa4, 0xdb, 0xe8, 0xb1, 0x51, 0x73, 0xc4, 0xba, 0xd3, 0xa6, 0x42, 0x0d, 0x3d, - 0xd1, 0x74, 0xc7, 0x5e, 0x93, 0xd3, 0xf0, 0xc2, 0xeb, 0x51, 0xde, 0x34, 0xa4, 0xe8, 0x57, 0x9b, - 0xb4, 0x5f, 0x67, 0x92, 0x39, 0x9b, 0x84, 0x3d, 0x3a, 0x66, 0xbe, 0xd7, 0x9b, 0x36, 0xc7, 0xdd, - 0xa6, 0x5e, 0x69, 0x9a, 0x53, 0x87, 0x8d, 0x77, 0x1e, 0x17, 0x27, 0x21, 0xeb, 0x51, 0xce, 0x29, - 0x27, 0xf4, 0x0f, 0x13, 0xca, 0x05, 0x5a, 0x87, 0x3c, 0xa1, 0x67, 0xd8, 0xda, 0xb4, 0xea, 0x15, - 0x22, 0x97, 0xce, 0x09, 0x3c, 0xb8, 0x86, 0xe4, 0x63, 0x16, 0x70, 0x8a, 0xb6, 0x61, 0xe5, 0x30, - 0x38, 0x63, 0x1c, 0x5b, 0x9b, 0xf9, 0x7a, 0x75, 0xeb, 0x59, 0x63, 0x91, 0x73, 0x0d, 0xc3, 0x93, - 0x48, 0xa2, 0xf1, 0x0e, 0x87, 0x6a, 0x42, 0x8b, 0x9e, 0x40, 0x25, 0x12, 0xf7, 0xcc, 0xc6, 0x33, - 0x05, 0x6a, 0xc3, 0xea, 0x61, 0x70, 0xc1, 0x86, 0xb4, 0xc5, 0x82, 0x33, 0x6f, 0x80, 0x73, 0x9b, - 0x56, 0xbd, 0xba, 0xe5, 0x2c, 0xde, 0x2c, 0x89, 0x24, 0x29, 0x9e, 0xf3, 0x3d, 0xe0, 0x3d, 0x8f, - 0xf7, 0x58, 0x10, 0xd0, 0x5e, 0xe4, 0x4c, 0xa6, 0xd3, 0xe9, 0x33, 0xe5, 0xae, 0x9d, 0xc9, 0x79, - 0x0c, 0x8f, 0x16, 0xd8, 0xd2, 0x61, 0x71, 0x7e, 0x0f, 0xab, 0xbb, 0xf2, 0x6c, 0xd9, 0xc6, 0xbf, - 0x85, 0xd2, 0xf1, 0x58, 0x78, 0x2c, 0xe0, 0xcb, 0xbd, 0x51, 0x66, 0x0c, 0x92, 0x44, 0x14, 0xe7, - 0x9f, 0x55, 0xb3, 0x81, 0x51, 0xa0, 0x4d, 0xa8, 0xb6, 0x58, 0x20, 0xe8, 0x95, 0x38, 0x71, 0xc5, - 0xb9, 0xd9, 0x28, 0xa9, 0x42, 0x9f, 0xc3, 0xda, 0x1e, 0xeb, 0x0d, 0x69, 0x78, 0xe6, 0xf9, 0xf4, - 0xc8, 0x1d, 0x51, 0xe3, 0xd2, 0x35, 0x2d, 0xfa, 0x4e, 0x7a, 0xed, 0x05, 0xa2, 0x3d, 0x09, 0x7a, - 0x38, 0xaf, 0x8e, 0xf6, 0x34, 0xeb, 0xad, 0x1a, 0x18, 0x99, 0x31, 0xd0, 0xef, 0xa0, 0x26, 0xcd, - 0xf4, 0xcd, 0xd6, 0x1c, 0x17, 0x54, 0x62, 0xbc, 0xbe, 0xd9, 0xbb, 0x46, 0x8a, 0xb7, 0x1f, 0x88, - 0x70, 0x4a, 0xd2, 0xb6, 0xd0, 0x06, 0xac, 0xec, 0xf8, 0x3e, 0xbb, 0xc4, 0x2b, 0x9b, 0xf9, 0x7a, - 0x85, 0x68, 0x01, 0xfd, 0x0a, 0x4a, 0x3b, 0x42, 0x50, 0x2e, 0x38, 0x2e, 0xaa, 0xcd, 0x9e, 0x2c, - 0xde, 0x4c, 0x83, 0x48, 0x04, 0x46, 0xc7, 0x50, 0x51, 0xfb, 0xef, 0x84, 0x03, 0x8e, 0x4b, 0x8a, - 0xf9, 0xe5, 0x2d, 0x8e, 0x19, 0x73, 0xf4, 0x11, 0x67, 0x36, 0xd0, 0x3e, 0x54, 0x5a, 0x6e, 0xef, - 0x9c, 0xb6, 0x43, 0x36, 0xc2, 0x65, 0x65, 0xf0, 0x67, 0x8b, 0x0d, 0x2a, 0x98, 0x31, 0x68, 0xcc, - 0xc4, 0x4c, 0xb4, 0x03, 0x25, 0x25, 0x9c, 0x32, 0x5c, 0xb9, 0x9b, 0x91, 0x88, 0x87, 0x1c, 0x58, - 0x6d, 0x0d, 0x42, 0x36, 0x19, 0x9f, 0xb8, 0x21, 0x0d, 0x04, 0x06, 0xf5, 0xaa, 0x53, 0x3a, 0xf4, - 0x16, 0x4a, 0xfb, 0x57, 0x63, 0x16, 0x0a, 0x8e, 0xab, 0xcb, 0x2e, 0xaf, 0x06, 0x99, 0x0d, 0x0c, - 0x03, 0x7d, 0x06, 0xb0, 0x7f, 0x25, 0x42, 0xf7, 0x80, 0xc9, 0xb0, 0xaf, 0xaa, 0xd7, 0x91, 0xd0, - 0xa0, 0x36, 0x14, 0xdf, 0xb9, 0x5d, 0xea, 0x73, 0x5c, 0x53, 0xb6, 0x1b, 0xb7, 0x08, 0xac, 0x26, - 0xe8, 0x8d, 0x0c, 0x5b, 0xe6, 0xf5, 0x11, 0x15, 0x97, 0x2c, 0x1c, 0xbe, 0x67, 0x7d, 0x8a, 0xd7, - 0x74, 0x5e, 0x27, 0x54, 0xe8, 0x05, 0xd4, 0x8e, 0x98, 0x0e, 0x9e, 0xe7, 0x0b, 0x1a, 0xe2, 0x7b, - 0xea, 0x30, 0x69, 0xa5, 0xba, 0xcb, 0xbe, 0x2b, 0xce, 0x58, 0x38, 0xe2, 0x78, 0x5d, 0x21, 0x66, - 0x0a, 0x99, 0x41, 0x1d, 0xda, 0x0b, 0xa9, 0xe0, 0xf8, 0xfe, 0xb2, 0x0c, 0xd2, 0x20, 0x12, 0x81, - 0x11, 0x86, 0x52, 0xe7, 0x7c, 0xd4, 0xf1, 0xfe, 0x48, 0x31, 0xda, 0xb4, 0xea, 0x79, 0x12, 0x89, - 0xe8, 0x15, 0xe4, 0x3b, 0x9d, 0x03, 0xfc, 0x63, 0x65, 0xed, 0x51, 0x86, 0xb5, 0xce, 0x01, 0x91, - 0x28, 0x84, 0xa0, 0x70, 0xea, 0x0e, 0x38, 0xde, 0x50, 0xe7, 0x52, 0x6b, 0xf4, 0x10, 0x8a, 0xa7, - 0x6e, 0x38, 0xa0, 0x02, 0x3f, 0x50, 0x3e, 0x1b, 0x09, 0xbd, 0x81, 0xd2, 0x07, 0xdf, 0x1b, 0x79, - 0x82, 0xe3, 0x87, 0xcb, 0x2e, 0xa7, 0x06, 0x1d, 0x8f, 0x05, 0x89, 0xf0, 0xf2, 0xb4, 0x2a, 0xde, - 0x34, 0xc4, 0x3f, 0x51, 0x36, 0x23, 0x51, 0x3e, 0x31, 0xe1, 0xc2, 0x78, 0xd3, 0xaa, 0x97, 0x49, - 0x24, 0xca, 0xa3, 0x9d, 0x4c, 0x7c, 0x1f, 0x3f, 0x52, 0x6a, 0xb5, 0xd6, 0xef, 0x5e, 0xa6, 0xc1, - 0xc9, 0x84, 0x9f, 0x63, 0x5b, 0x3d, 0x49, 0x68, 0x66, 0xcf, 0xdf, 0x31, 0xb7, 0x8f, 0x1f, 0x27, - 0x9f, 0x4b, 0x0d, 0x3a, 0x84, 0xd5, 0x8e, 0x6a, 0x4b, 0x27, 0xaa, 0x19, 0xe1, 0x27, 0xca, 0x8f, - 0x97, 0x0d, 0xd9, 0xb9, 0x1a, 0x51, 0xe7, 0x92, 0x3e, 0x24, 0x9b, 0x57, 0x43, 0x83, 0x49, 0x8a, - 0x6a, 0xff, 0x1a, 0xd0, 0x7c, 0xd5, 0x90, 0xd5, 0x76, 0x48, 0xa7, 0x51, 0xb5, 0x1d, 0xd2, 0xa9, - 0x2c, 0x1c, 0x17, 0xae, 0x3f, 0x89, 0x6a, 0x9e, 0x16, 0xbe, 0xc9, 0x7d, 0x6d, 0xd9, 0xdf, 0xc2, - 0x5a, 0xfa, 0x42, 0xdf, 0x89, 0xfd, 0x06, 0xaa, 0x89, 0xac, 0xbd, 0x0b, 0xd5, 0xf9, 0x97, 0x05, - 0xd5, 0xc4, 0xd5, 0x52, 0x49, 0x30, 0x1d, 0x53, 0x43, 0x56, 0x6b, 0xb4, 0x0b, 0x2b, 0x3b, 0x42, - 0x84, 0xb2, 0x45, 0xc8, 0x3c, 0xfa, 0xc5, 0x8d, 0x17, 0xb4, 0xa1, 0xe0, 0xfa, 0x0a, 0x69, 0xaa, - 0xbc, 0x41, 0x7b, 0x94, 0x0b, 0x2f, 0x70, 0xe5, 0x2d, 0x53, 0x15, 0xbd, 0x42, 0x92, 0x2a, 0xfb, - 0x6b, 0x80, 0x19, 0xed, 0x4e, 0x3e, 0xfc, 0xdd, 0x82, 0xfb, 0x73, 0x55, 0x68, 0xa1, 0x27, 0x07, - 0x69, 0x4f, 0xb6, 0x6e, 0x59, 0xd1, 0xe6, 0xfd, 0xf9, 0x3f, 0x4e, 0x7b, 0x04, 0x45, 0x5d, 0xfa, - 0x17, 0x9e, 0xd0, 0x86, 0xf2, 0x9e, 0xc7, 0xdd, 0xae, 0x4f, 0xfb, 0x8a, 0x5a, 0x26, 0xb1, 0xac, - 0xfa, 0x8e, 0x3a, 0xbd, 0x8e, 0x9e, 0x16, 0x1c, 0x7d, 0xc7, 0xd1, 0x1a, 0xe4, 0xe2, 0x99, 0x25, - 0x77, 0xb8, 0x27, 0xc1, 0xb2, 0xe1, 0x6a, 0x57, 0x2b, 0x44, 0x0b, 0x4e, 0x1b, 0x8a, 0xba, 0x6a, - 0xcc, 0xe1, 0x6d, 0x28, 0xb7, 0x3d, 0x9f, 0xaa, 0xbe, 0xad, 0xcf, 0x1c, 0xcb, 0xd2, 0xbd, 0xfd, - 0xe0, 0xc2, 0x6c, 0x2b, 0x97, 0xce, 0x76, 0xa2, 0x3d, 0x4b, 0x3f, 0x54, 0x27, 0x37, 0x7e, 0xa8, - 0xfe, 0xfd, 0x10, 0x8a, 0x6d, 0x16, 0x8e, 0x5c, 0x61, 0x8c, 0x19, 0xc9, 0x71, 0x60, 0xed, 0x30, - 0xe0, 0x63, 0xda, 0x13, 0xd9, 0x63, 0xde, 0x31, 0xdc, 0x8b, 0x31, 0x66, 0xc0, 0x4b, 0xcc, 0x29, - 0xd6, 0xdd, 0xe7, 0x94, 0xbf, 0x59, 0x50, 0x89, 0x2b, 0x11, 0x6a, 0x41, 0x51, 0xbd, 0x8d, 0x68, - 0x5a, 0x7c, 0x75, 0x43, 0xe9, 0x6a, 0x7c, 0x54, 0x68, 0xd3, 0x11, 0x34, 0xd5, 0xfe, 0x01, 0xaa, - 0x09, 0xf5, 0x82, 0x04, 0xd8, 0x4a, 0x26, 0x40, 0x66, 0x29, 0xd7, 0x9b, 0x24, 0xd3, 0x63, 0x0f, - 0x8a, 0x5a, 0xb9, 0x30, 0xac, 0x08, 0x0a, 0x07, 0x6e, 0xa8, 0x53, 0x23, 0x4f, 0xd4, 0x5a, 0xea, - 0x3a, 0xec, 0x4c, 0xa8, 0xd7, 0x93, 0x27, 0x6a, 0xed, 0xfc, 0xc3, 0x82, 0x9a, 0x19, 0xfd, 0x4c, - 0x04, 0x29, 0xac, 0xeb, 0x1b, 0x4a, 0xc3, 0x48, 0x67, 0xfc, 0x7f, 0xb3, 0x24, 0x94, 0x11, 0xb4, - 0x71, 0x9d, 0xab, 0xa3, 0x31, 0x67, 0xd2, 0x6e, 0xc1, 0x83, 0x85, 0xd0, 0x3b, 0x5d, 0x91, 0x97, - 0x70, 0x7f, 0x36, 0xd4, 0x66, 0xe7, 0xc9, 0x06, 0xa0, 0x24, 0xcc, 0x0c, 0xbd, 0x4f, 0xa1, 0x2a, - 0x3f, 0x12, 0xb2, 0x69, 0x0e, 0xac, 0x6a, 0x80, 0x89, 0x0c, 0x82, 0xc2, 0x90, 0x4e, 0x75, 0x36, - 0x54, 0x88, 0x5a, 0x3b, 0x7f, 0xb5, 0xe4, 0xac, 0x3f, 0x9e, 0x88, 0xf7, 0x94, 0x73, 0x77, 0x20, - 0x13, 0xb0, 0x70, 0x18, 0x78, 0xc2, 0x64, 0xdf, 0xe7, 0x59, 0x33, 0xff, 0x78, 0x22, 0x24, 0xcc, - 0xb0, 0x0e, 0x7e, 0x44, 0x14, 0x0b, 0x6d, 0x43, 0x61, 0xcf, 0x15, 0xae, 0xc9, 0x85, 0x8c, 0x09, - 0x47, 0x22, 0x12, 0x44, 0x29, 0xee, 0x96, 0xe4, 0x87, 0xcd, 0x78, 0x22, 0x9c, 0x17, 0xb0, 0x7e, - 0xdd, 0xfa, 0x02, 0xd7, 0xbe, 0x82, 0x6a, 0xc2, 0x8a, 0xba, 0xb7, 0xc7, 0x6d, 0x05, 0x28, 0x13, - 0xb9, 0x94, 0xbe, 0xc6, 0x07, 0x59, 0xd5, 0x7b, 0x38, 0xf7, 0xa0, 0xa6, 0x4c, 0xc7, 0x11, 0xfc, - 0x53, 0x0e, 0x4a, 0x91, 0x89, 0xed, 0x94, 0xdf, 0xcf, 0xb2, 0xfc, 0x9e, 0x77, 0xf9, 0x35, 0x14, - 0x64, 0xfd, 0x30, 0x2e, 0x67, 0x8c, 0x07, 0xed, 0x7e, 0x82, 0x26, 0xe1, 0xe8, 0x3b, 0x28, 0x12, - 0xca, 0xe5, 0x28, 0xa3, 0x87, 0xfe, 0xe7, 0x8b, 0x89, 0x1a, 0x33, 0x23, 0x1b, 0x92, 0xa4, 0x77, - 0xbc, 0x41, 0xe0, 0xfa, 0xb8, 0xb0, 0x8c, 0xae, 0x31, 0x09, 0xba, 0x56, 0xcc, 0xc2, 0xfd, 0x67, - 0x0b, 0xaa, 0x4b, 0x43, 0xbd, 0xfc, 0xb3, 0x6c, 0xee, 0x53, 0x31, 0xff, 0x3f, 0x7e, 0x2a, 0xfe, - 0xdb, 0x4a, 0x1b, 0x52, 0x53, 0x8d, 0xbc, 0x4f, 0x63, 0xe6, 0x05, 0xc2, 0xa4, 0x6c, 0x42, 0x23, - 0x0f, 0xda, 0x1a, 0xf5, 0x4d, 0xd1, 0x97, 0xcb, 0x59, 0xf1, 0xce, 0x9b, 0xe2, 0x2d, 0x93, 0xe0, - 0x03, 0xa7, 0xa1, 0x0a, 0x51, 0x85, 0xa8, 0xb5, 0xac, 0xd7, 0x47, 0x4c, 0x69, 0x57, 0x54, 0xb6, - 0x18, 0x49, 0xd9, 0xbb, 0xec, 0xe3, 0xa2, 0x76, 0xbc, 0x75, 0xa9, 0xba, 0xd0, 0x11, 0x93, 0xba, - 0x92, 0x02, 0x6a, 0x41, 0xe2, 0x4e, 0xc5, 0x14, 0x97, 0x75, 0xaa, 0x9d, 0x8a, 0xa9, 0x6c, 0x28, - 0x84, 0xf9, 0x7e, 0xd7, 0xed, 0x0d, 0x71, 0x45, 0x77, 0xb2, 0x48, 0x96, 0x93, 0x9e, 0x8c, 0xae, - 0xe7, 0xfa, 0xea, 0x9b, 0xa0, 0x4c, 0x22, 0xd1, 0xd9, 0x81, 0x4a, 0x9c, 0x14, 0xb2, 0x47, 0xb5, - 0xfb, 0x2a, 0xe8, 0x35, 0x92, 0x6b, 0xf7, 0xa3, 0x7c, 0xce, 0xcd, 0xe7, 0x73, 0x3e, 0x91, 0xcf, - 0xdb, 0x50, 0x4b, 0xa5, 0x87, 0x04, 0x11, 0x76, 0xc9, 0x8d, 0x21, 0xb5, 0x96, 0xba, 0x16, 0xf3, - 0xf5, 0x57, 0x6f, 0x8d, 0xa8, 0xb5, 0xf3, 0x1c, 0x6a, 0xa9, 0xc4, 0x58, 0x54, 0x81, 0x9d, 0x67, - 0x50, 0xeb, 0x08, 0x57, 0x4c, 0x96, 0xfc, 0x4d, 0xf1, 0x1f, 0x0b, 0xd6, 0x22, 0x8c, 0xa9, 0x31, - 0xbf, 0x84, 0xf2, 0x05, 0x0d, 0x05, 0xbd, 0x8a, 0xbb, 0x0e, 0x9e, 0x1f, 0x34, 0x3f, 0x2a, 0x04, - 0x89, 0x91, 0xe8, 0x1b, 0x28, 0x73, 0x65, 0x87, 0x46, 0x13, 0xcb, 0x67, 0x59, 0x2c, 0xb3, 0x5f, - 0x8c, 0x47, 0x4d, 0x28, 0xf8, 0x6c, 0xc0, 0xd5, 0x7b, 0xaf, 0x6e, 0x3d, 0xce, 0xe2, 0xbd, 0x63, - 0x03, 0xa2, 0x80, 0xe8, 0x2d, 0x94, 0x2f, 0xdd, 0x30, 0xf0, 0x82, 0x41, 0xf4, 0xb5, 0xfc, 0x34, - 0x8b, 0xf4, 0x83, 0xc6, 0x91, 0x98, 0xe0, 0xd4, 0xe4, 0x75, 0x39, 0x63, 0x26, 0x26, 0xce, 0x6f, - 0x64, 0xd6, 0x4a, 0xd1, 0xb8, 0x7f, 0x08, 0x35, 0x9d, 0xf9, 0x1f, 0x69, 0xc8, 0xe5, 0xfc, 0x67, - 0x2d, 0xbb, 0x9d, 0xbb, 0x49, 0x28, 0x49, 0x33, 0x9d, 0x4f, 0xa6, 0xb1, 0x45, 0x0a, 0x99, 0x4b, - 0x63, 0xb7, 0x37, 0x74, 0x07, 0xd1, 0x7b, 0x8a, 0x44, 0xf9, 0xe4, 0xc2, 0xec, 0xa7, 0x2f, 0x68, - 0x24, 0xca, 0xdc, 0x0c, 0xe9, 0x85, 0xc7, 0x67, 0xa3, 0x68, 0x2c, 0x6f, 0xfd, 0xa5, 0x04, 0xd0, - 0x8a, 0xcf, 0x83, 0x4e, 0x60, 0x45, 0xed, 0x87, 0x9c, 0xa5, 0x6d, 0x52, 0xf9, 0x6d, 0x3f, 0xbf, - 0x45, 0x2b, 0x45, 0x1f, 0x65, 0xf2, 0xab, 0xf1, 0x06, 0xbd, 0xc8, 0x2a, 0x08, 0xc9, 0x09, 0xc9, - 0x7e, 0x79, 0x03, 0xca, 0xd8, 0xfd, 0x00, 0x45, 0x9d, 0x05, 0x28, 0xab, 0xea, 0x25, 0xf3, 0xd6, - 0x7e, 0xb1, 0x1c, 0xa4, 0x8d, 0x7e, 0x61, 0x21, 0x62, 0x6a, 0x22, 0x72, 0x96, 0x34, 0x3d, 0x73, - 0x63, 0xb2, 0x02, 0x90, 0xea, 0x2f, 0x75, 0x0b, 0x7d, 0x0f, 0x45, 0x5d, 0xd5, 0xd0, 0x4f, 0x17, - 0x13, 0x22, 0x7b, 0xcb, 0x1f, 0xd7, 0xad, 0x2f, 0x2c, 0xf4, 0x1e, 0x0a, 0xb2, 0x9d, 0xa3, 0x8c, - 0xde, 0x94, 0x98, 0x05, 0x6c, 0x67, 0x19, 0xc4, 0x44, 0xf1, 0x13, 0xc0, 0x6c, 0xa8, 0x40, 0x19, - 0xff, 0x79, 0xcc, 0x4d, 0x27, 0x76, 0xfd, 0x66, 0xa0, 0xd9, 0xe0, 0xbd, 0xec, 0xa8, 0x67, 0x0c, - 0x65, 0xf6, 0xd2, 0xf8, 0x1a, 0xd9, 0xce, 0x32, 0x88, 0x31, 0x77, 0x0e, 0xb5, 0xd4, 0x7f, 0xa2, - 0xe8, 0xe7, 0xd9, 0x4e, 0x5e, 0xff, 0x8b, 0xd5, 0x7e, 0x75, 0x2b, 0xac, 0xd9, 0x49, 0x24, 0xa7, - 0x32, 0xf3, 0x18, 0x35, 0x6e, 0xf2, 0x3b, 0xfd, 0xff, 0xa6, 0xdd, 0xbc, 0x35, 0x5e, 0xef, 0xba, - 0x5b, 0xf8, 0x6d, 0x6e, 0xdc, 0xed, 0x16, 0xd5, 0x5f, 0xc5, 0x5f, 0xfd, 0x37, 0x00, 0x00, 0xff, - 0xff, 0xc1, 0x4b, 0x2d, 0x65, 0xc8, 0x16, 0x00, 0x00, + // 2030 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xdd, 0x72, 0xdb, 0xc6, + 0x15, 0x2e, 0x48, 0x8a, 0x3f, 0x87, 0xa2, 0x2c, 0x6f, 0x65, 0x0f, 0x82, 0xb8, 0x89, 0x0c, 0xdb, + 0xa9, 0x26, 0xce, 0x80, 0x89, 0x92, 0xd4, 0x76, 0xec, 0x5c, 0x48, 0x94, 0x38, 0x52, 0x46, 0x7f, + 0xb3, 0x94, 0x9d, 0x69, 0x2f, 0x9a, 0x01, 0xc9, 0x15, 0x85, 0x21, 0x88, 0x45, 0xb1, 0x4b, 0xfd, + 0xf4, 0xaa, 0x37, 0xbd, 0xeb, 0xf4, 0x3d, 0x3a, 0x7d, 0x84, 0xce, 0x74, 0xa6, 0xcf, 0xd0, 0xf7, + 0xe8, 0xf4, 0xb6, 0x77, 0x9d, 0xfd, 0x01, 0x08, 0x88, 0x04, 0x24, 0xb5, 0x57, 0xdc, 0x3d, 0xf8, + 0xbe, 0xb3, 0x7b, 0xce, 0x9e, 0x3d, 0xe7, 0x2c, 0x61, 0x75, 0x40, 0x03, 0x1e, 0x51, 0xdf, 0x27, + 0x91, 0x13, 0x46, 0x94, 0x53, 0xb4, 0xd6, 0x9f, 0x7a, 0xfe, 0xf0, 0xca, 0x49, 0x7d, 0xb8, 0xf8, + 0xca, 0x7a, 0x3b, 0xf2, 0xf8, 0xf9, 0xb4, 0xef, 0x0c, 0xe8, 0xa4, 0x3d, 0xa1, 0xfd, 0xeb, 0xb6, + 0x44, 0x8d, 0x3d, 0xde, 0x76, 0x43, 0xaf, 0xcd, 0x48, 0x74, 0xe1, 0x0d, 0x08, 0x6b, 0x6b, 0x52, + 0xfc, 0xab, 0x54, 0x5a, 0xdf, 0xe6, 0x92, 0x19, 0x9d, 0x46, 0x03, 0x12, 0x52, 0xdf, 0x1b, 0x5c, + 0xb7, 0xc3, 0x7e, 0x5b, 0x8d, 0x34, 0xed, 0x8b, 0x02, 0x9a, 0x7f, 0x41, 0x22, 0x41, 0xa0, 0x21, + 0x53, 0x68, 0x7b, 0x03, 0xd6, 0x0e, 0x3c, 0xc6, 0x4f, 0x22, 0x3a, 0x20, 0x8c, 0x11, 0x86, 0xc9, + 0xef, 0xa6, 0x84, 0x71, 0xb4, 0x0a, 0x65, 0x4c, 0xce, 0x4c, 0x63, 0xdd, 0xd8, 0x68, 0x60, 0x31, + 0xb4, 0x4f, 0xe0, 0xd1, 0x0d, 0x24, 0x0b, 0x69, 0xc0, 0x08, 0x7a, 0x05, 0x4b, 0xfb, 0xc1, 0x19, + 0x65, 0xa6, 0xb1, 0x5e, 0xde, 0x68, 0x6e, 0x3e, 0x75, 0x16, 0xb9, 0xc2, 0xd1, 0x3c, 0x81, 0xc4, + 0x0a, 0x6f, 0x33, 0x68, 0xa6, 0xa4, 0xe8, 0x09, 0x34, 0xe2, 0xe9, 0x8e, 0x5e, 0x78, 0x26, 0x40, + 0x5d, 0x58, 0xde, 0x0f, 0x2e, 0xe8, 0x98, 0x74, 0x68, 0x70, 0xe6, 0x8d, 0xcc, 0xd2, 0xba, 0xb1, + 0xd1, 0xdc, 0xb4, 0x17, 0x2f, 0x96, 0x46, 0xe2, 0x0c, 0xcf, 0xfe, 0x01, 0xcc, 0x1d, 0x8f, 0x0d, + 0x68, 0x10, 0x90, 0x41, 0x6c, 0x4c, 0xae, 0xd1, 0xd9, 0x3d, 0x95, 0x6e, 0xec, 0xc9, 0xfe, 0x18, + 0x3e, 0x5a, 0xa0, 0x4b, 0xb9, 0xc5, 0xfe, 0x2d, 0x2c, 0x6f, 0x8b, 0xbd, 0xe5, 0x2b, 0x7f, 0x07, + 0xb5, 0xe3, 0x90, 0x7b, 0x34, 0x60, 0xc5, 0xd6, 0x48, 0x35, 0x1a, 0x89, 0x63, 0x8a, 0xfd, 0x9f, + 0x12, 0x54, 0xf7, 0x83, 0x70, 0xca, 0x19, 0x5a, 0x87, 0x66, 0x87, 0x06, 0x9c, 0x5c, 0xf1, 0x13, + 0x97, 0x9f, 0xeb, 0x25, 0xd2, 0x22, 0xf4, 0x19, 0xac, 0xec, 0xd0, 0xc1, 0x98, 0x44, 0x67, 0x9e, + 0x4f, 0x8e, 0xdc, 0x09, 0xd1, 0xc6, 0xdc, 0x90, 0xa2, 0xcf, 0x61, 0x75, 0x26, 0xd9, 0x0f, 0x7c, + 0x2f, 0x20, 0x66, 0x59, 0x22, 0xe7, 0xe4, 0xe8, 0x1d, 0x3c, 0xd4, 0x4b, 0xec, 0x90, 0x33, 0x2f, + 0xf0, 0xc4, 0xb6, 0xcc, 0x8a, 0x34, 0x64, 0xc5, 0x09, 0xfb, 0xce, 0x4c, 0x8a, 0xe7, 0x81, 0xe8, + 0x3d, 0xb4, 0xc4, 0x8a, 0x43, 0xfd, 0x85, 0x99, 0x4b, 0x32, 0x7a, 0xda, 0x79, 0x07, 0x2a, 0x0c, + 0x75, 0x32, 0x8c, 0xdd, 0x80, 0x47, 0xd7, 0x38, 0xab, 0xc5, 0x1a, 0x02, 0x9a, 0x07, 0x09, 0xdf, + 0x8f, 0xc9, 0x75, 0xec, 0xfb, 0x31, 0xb9, 0x46, 0xaf, 0x61, 0xe9, 0xc2, 0xf5, 0xa7, 0xa4, 0xd8, + 0xf3, 0x69, 0x55, 0x58, 0x11, 0xbe, 0x2b, 0xbd, 0x36, 0xec, 0xbf, 0x37, 0xf4, 0xe1, 0xea, 0xc3, + 0x40, 0xdf, 0xc4, 0x67, 0x21, 0xd7, 0x68, 0x6e, 0x3e, 0x29, 0x32, 0x03, 0xc7, 0xe7, 0xf6, 0xbd, + 0x88, 0x2e, 0x2f, 0xe0, 0xdd, 0x69, 0x30, 0xd0, 0x1b, 0xf9, 0x34, 0xef, 0xf6, 0x68, 0x18, 0x9e, + 0x31, 0xd0, 0x2b, 0xa8, 0x1c, 0x87, 0x9c, 0xc9, 0x03, 0x6a, 0x6e, 0x3e, 0x5b, 0xcc, 0xec, 0xd0, + 0xc9, 0x84, 0x06, 0x71, 0xf4, 0x48, 0x02, 0x5a, 0x83, 0xa5, 0x2d, 0xdf, 0xa7, 0x97, 0x66, 0x65, + 0xbd, 0xbc, 0xd1, 0xc0, 0x6a, 0x82, 0x7e, 0x05, 0xb5, 0x2d, 0xce, 0x09, 0x4b, 0xce, 0x22, 0xc7, + 0x08, 0x05, 0xc2, 0x31, 0x18, 0x1d, 0x43, 0x43, 0xfa, 0x62, 0x2b, 0x1a, 0x31, 0xb3, 0x2a, 0x99, + 0x5f, 0xdd, 0x1e, 0xc8, 0x4e, 0xc2, 0x51, 0xe7, 0x38, 0xd3, 0x81, 0x76, 0xa1, 0xd1, 0x71, 0x07, + 0xe7, 0xa4, 0x1b, 0xd1, 0x89, 0x59, 0x93, 0x0a, 0x7f, 0x99, 0x63, 0x9c, 0x80, 0x69, 0x85, 0x5a, + 0x4d, 0xc2, 0x44, 0x5b, 0x50, 0x93, 0x93, 0x53, 0x6a, 0xd6, 0xef, 0xa7, 0x24, 0xe6, 0x21, 0x1b, + 0x96, 0x3b, 0xa3, 0x88, 0x4e, 0xc3, 0x13, 0x37, 0x22, 0x01, 0x37, 0x1b, 0x32, 0x80, 0x32, 0x32, + 0xf4, 0x16, 0x6a, 0xbb, 0x57, 0x21, 0x8d, 0x38, 0x33, 0xa1, 0x28, 0x01, 0x2a, 0x90, 0x5e, 0x40, + 0x33, 0xd0, 0x27, 0x00, 0xbb, 0x57, 0x3c, 0x72, 0xf7, 0xa8, 0x70, 0x7b, 0x53, 0x1e, 0x47, 0x4a, + 0x82, 0xba, 0x50, 0x3d, 0x70, 0xfb, 0xc4, 0x67, 0xe6, 0xb2, 0xd4, 0xed, 0xdc, 0xc1, 0xb1, 0x8a, + 0xa0, 0x16, 0xd2, 0x6c, 0x91, 0x21, 0x8e, 0x08, 0xbf, 0xa4, 0xd1, 0xf8, 0x90, 0x0e, 0x89, 0xd9, + 0x52, 0x19, 0x22, 0x25, 0x42, 0xcf, 0xa1, 0x75, 0x44, 0x95, 0xf3, 0x3c, 0x9f, 0x93, 0xc8, 0x5c, + 0x91, 0x9b, 0xc9, 0x0a, 0x65, 0x3e, 0xf4, 0x5d, 0x7e, 0x46, 0xa3, 0x09, 0x33, 0x1f, 0x48, 0xc4, + 0x4c, 0x20, 0x22, 0xa8, 0x47, 0x06, 0x11, 0xe1, 0xcc, 0x5c, 0x2d, 0x8a, 0x20, 0x05, 0xc2, 0x31, + 0x18, 0x99, 0x50, 0xeb, 0x9d, 0x4f, 0x7a, 0xde, 0xef, 0x89, 0xf9, 0x70, 0xdd, 0xd8, 0x28, 0xe3, + 0x78, 0x8a, 0x5e, 0x42, 0xb9, 0xd7, 0xdb, 0x33, 0x91, 0xd4, 0xf6, 0x51, 0x8e, 0xb6, 0xde, 0x1e, + 0x16, 0x28, 0x84, 0xa0, 0x72, 0xea, 0x8e, 0x98, 0xf9, 0x73, 0xb9, 0x2f, 0x39, 0x46, 0x8f, 0xa1, + 0x7a, 0xea, 0x46, 0x23, 0xc2, 0xcd, 0x35, 0x69, 0xb3, 0x9e, 0xa1, 0x37, 0x50, 0x7b, 0xef, 0x7b, + 0x13, 0x8f, 0x33, 0xf3, 0x51, 0xd1, 0xc5, 0x53, 0xa0, 0xe3, 0x90, 0xe3, 0x18, 0x8f, 0xf6, 0x61, + 0xb9, 0x27, 0x0b, 0xf0, 0x89, 0x2c, 0xbb, 0xe6, 0x63, 0xc9, 0x7f, 0xe1, 0x88, 0x62, 0xeb, 0xc4, + 0xc5, 0x56, 0x70, 0xd3, 0x65, 0xda, 0x51, 0x60, 0x9c, 0xa1, 0x5a, 0xef, 0x60, 0x25, 0x7b, 0x0d, + 0x16, 0x64, 0xaa, 0xb5, 0x74, 0xa6, 0x6a, 0xa4, 0xb2, 0x90, 0xf5, 0x06, 0x9a, 0xa9, 0xb3, 0xbe, + 0x0f, 0xd5, 0xc6, 0xb0, 0x9c, 0xce, 0x6d, 0xc2, 0x75, 0xa9, 0xd2, 0x21, 0xc7, 0xc8, 0x01, 0x48, + 0x25, 0xf6, 0xd2, 0xc2, 0xc4, 0x9e, 0x42, 0xd8, 0xff, 0x34, 0xa0, 0x95, 0xc9, 0x36, 0xe2, 0x5c, + 0xa5, 0x79, 0x24, 0xd2, 0x8a, 0xe3, 0xa9, 0xb8, 0x58, 0x87, 0x84, 0xbb, 0x43, 0x97, 0xbb, 0x5d, + 0xcf, 0x8f, 0x37, 0x98, 0x91, 0x09, 0xb6, 0x0e, 0x3e, 0x99, 0xe1, 0xea, 0x38, 0x9e, 0xca, 0xdd, + 0x4e, 0x7d, 0x5f, 0x16, 0x9b, 0x3a, 0x96, 0x63, 0x75, 0x93, 0xc4, 0xa5, 0x3a, 0x99, 0xb2, 0x73, + 0x73, 0x49, 0x7e, 0x49, 0x49, 0x66, 0xdf, 0x0f, 0xa8, 0x3b, 0x34, 0xab, 0xe9, 0xef, 0x42, 0x22, + 0x02, 0xe5, 0xc0, 0x0b, 0xc6, 0x64, 0x68, 0xd6, 0xe4, 0x37, 0x3d, 0xb3, 0xff, 0x61, 0x40, 0x33, + 0x75, 0x75, 0x65, 0x90, 0x5d, 0x87, 0x24, 0xf6, 0x94, 0x18, 0xa3, 0x6d, 0x58, 0xda, 0xe2, 0x3c, + 0x12, 0x65, 0x5c, 0xc4, 0xe9, 0x17, 0xb7, 0x26, 0x00, 0x47, 0xc2, 0xd5, 0x15, 0x55, 0x54, 0x71, + 0x43, 0x77, 0x08, 0xe3, 0x5e, 0xe0, 0x4a, 0x77, 0xab, 0xa2, 0x9b, 0x16, 0x59, 0xaf, 0x01, 0x66, + 0xb4, 0x7b, 0x9d, 0xf6, 0x5f, 0x0d, 0x78, 0x38, 0x97, 0xe5, 0x16, 0x5a, 0xb2, 0x97, 0xb5, 0x64, + 0xf3, 0x8e, 0x19, 0x73, 0xde, 0x9e, 0xff, 0x63, 0xb7, 0x47, 0x50, 0x55, 0xa5, 0x65, 0xe1, 0x0e, + 0x2d, 0xa8, 0xef, 0x78, 0xcc, 0xed, 0xfb, 0x64, 0x28, 0xa9, 0x75, 0x9c, 0xcc, 0x65, 0x5d, 0x93, + 0xbb, 0x57, 0xde, 0x53, 0x13, 0x5b, 0xe5, 0x10, 0xb4, 0x02, 0xa5, 0xa4, 0xaf, 0x2c, 0xed, 0xef, + 0x08, 0xb0, 0x08, 0x73, 0x65, 0x6a, 0x03, 0xab, 0x89, 0xdd, 0x85, 0xaa, 0xca, 0x4a, 0x73, 0x78, + 0x0b, 0xea, 0x22, 0x2c, 0xe5, 0x35, 0x51, 0x7b, 0x4e, 0xe6, 0xc2, 0xbc, 0xdd, 0xe0, 0x42, 0x2f, + 0x2b, 0x86, 0xf6, 0xab, 0x54, 0x69, 0x17, 0x76, 0xc8, 0x9e, 0x4b, 0xdb, 0x21, 0x3b, 0xad, 0xc7, + 0x50, 0xed, 0xd2, 0x68, 0xe2, 0x72, 0xad, 0x4c, 0xcf, 0x6c, 0x1b, 0x56, 0xf6, 0x03, 0x16, 0x92, + 0x01, 0xcf, 0x6f, 0xc5, 0x8f, 0xe1, 0x41, 0x82, 0xd1, 0x4d, 0x78, 0xaa, 0x97, 0x34, 0xee, 0xdf, + 0x4b, 0xfe, 0xc5, 0x80, 0x46, 0x92, 0xe9, 0x50, 0x07, 0xaa, 0xf2, 0x34, 0xe2, 0x8e, 0xfe, 0xe5, + 0x2d, 0xa9, 0xd1, 0xf9, 0x20, 0xd1, 0xba, 0xe2, 0x28, 0xaa, 0xf5, 0x23, 0x34, 0x53, 0xe2, 0x05, + 0x01, 0xb0, 0x99, 0xed, 0xc0, 0x9e, 0x14, 0x2d, 0x92, 0x0e, 0x8f, 0x1d, 0xa8, 0x2a, 0xe1, 0x42, + 0xb7, 0x22, 0xa8, 0xec, 0xb9, 0x91, 0x0a, 0x8d, 0x32, 0x96, 0x63, 0x21, 0xeb, 0xd1, 0x33, 0x2e, + 0x8f, 0xa7, 0x8c, 0xe5, 0xd8, 0xfe, 0x9b, 0x01, 0x2d, 0xdd, 0x9e, 0x6b, 0x0f, 0x12, 0x58, 0x55, + 0x37, 0x94, 0x44, 0xb1, 0x4c, 0xdb, 0xff, 0xa6, 0xc0, 0x95, 0x31, 0xd4, 0xb9, 0xc9, 0x55, 0xde, + 0x98, 0x53, 0x69, 0x75, 0xe0, 0xd1, 0x42, 0xe8, 0xbd, 0xae, 0xc8, 0x0b, 0x78, 0x38, 0x7b, 0x78, + 0xe4, 0xc7, 0xc9, 0x1a, 0xa0, 0x34, 0x4c, 0x3f, 0x4c, 0x3e, 0x85, 0xa6, 0x78, 0xc8, 0xe5, 0xd3, + 0x6c, 0x58, 0x56, 0x00, 0xed, 0x19, 0x04, 0x95, 0x31, 0xb9, 0x56, 0xd1, 0xd0, 0xc0, 0x72, 0x6c, + 0xff, 0xd9, 0x10, 0xef, 0xb1, 0x70, 0xca, 0x0f, 0x09, 0x63, 0xee, 0x48, 0x04, 0x60, 0x65, 0x3f, + 0xf0, 0xb8, 0x8e, 0xbe, 0xcf, 0x0a, 0xfa, 0x5f, 0x01, 0xd3, 0xac, 0xbd, 0x9f, 0x61, 0xc9, 0x12, + 0xad, 0xec, 0x8e, 0xcb, 0x5d, 0x1d, 0x0b, 0x39, 0x1d, 0x94, 0x40, 0xa4, 0x88, 0x62, 0xba, 0x5d, + 0x13, 0x8f, 0xcf, 0x70, 0xca, 0xed, 0xe7, 0xb0, 0x7a, 0x53, 0xfb, 0x02, 0xd3, 0xbe, 0x86, 0x66, + 0x4a, 0x8b, 0xbc, 0xb7, 0xc7, 0x5d, 0x09, 0xa8, 0x63, 0x31, 0x14, 0xb6, 0x26, 0x1b, 0x59, 0x56, + 0x6b, 0xd8, 0x0f, 0xa0, 0x25, 0x55, 0x27, 0x1e, 0xfc, 0x43, 0x09, 0x6a, 0xb1, 0x8a, 0x57, 0x19, + 0xbb, 0x9f, 0xe6, 0xd9, 0x3d, 0x6f, 0xf2, 0xb7, 0x50, 0x49, 0x4a, 0x5f, 0x6e, 0xfb, 0xd1, 0x1d, + 0xa6, 0x68, 0xb2, 0x2a, 0x7e, 0x0f, 0x55, 0x4c, 0x98, 0x68, 0x95, 0x0a, 0xdb, 0x7e, 0x85, 0x99, + 0x91, 0x35, 0x49, 0xd0, 0x7b, 0xde, 0x28, 0x70, 0x7d, 0xfd, 0x52, 0xcb, 0xa1, 0x2b, 0x4c, 0x8a, + 0xae, 0x04, 0x33, 0x77, 0xff, 0xd1, 0x80, 0x66, 0xa1, 0xab, 0x8b, 0x9f, 0xce, 0x73, 0xcf, 0xf9, + 0xf2, 0xff, 0xf8, 0x9c, 0xff, 0x97, 0x91, 0x55, 0x24, 0xeb, 0xbc, 0xb8, 0x4f, 0x21, 0xf5, 0x02, + 0xae, 0x43, 0x36, 0x25, 0x11, 0x1b, 0xed, 0x4c, 0x86, 0x3a, 0xe9, 0x8b, 0xe1, 0x2c, 0x79, 0x97, + 0x75, 0xf2, 0x16, 0x41, 0xf0, 0x9e, 0x91, 0x48, 0xba, 0xa8, 0x81, 0xe5, 0x58, 0xe4, 0xeb, 0x23, + 0x2a, 0xa5, 0xaa, 0xb7, 0xd0, 0x33, 0xa9, 0xef, 0x52, 0x35, 0x14, 0x42, 0xdf, 0xa5, 0xac, 0x42, + 0x47, 0x54, 0xc8, 0x54, 0x23, 0xa1, 0x26, 0x02, 0x77, 0xca, 0xaf, 0xcd, 0xba, 0x0a, 0xb5, 0x53, + 0x7e, 0x2d, 0x0a, 0x0a, 0xa6, 0xbe, 0xdf, 0x77, 0x07, 0x63, 0xf9, 0xb0, 0xa8, 0xe3, 0x64, 0x2e, + 0x7a, 0x1f, 0xe1, 0x5d, 0xcf, 0xf5, 0x4d, 0x50, 0xbd, 0x8f, 0x9e, 0xda, 0x5b, 0xd0, 0x48, 0x82, + 0x42, 0xd4, 0xa8, 0xee, 0x50, 0x3a, 0xbd, 0x85, 0x4b, 0xdd, 0x61, 0x1c, 0xcf, 0xa5, 0xf9, 0x78, + 0x2e, 0xa7, 0xe2, 0xf9, 0x15, 0xb4, 0x32, 0xe1, 0x21, 0x40, 0x98, 0x5e, 0x32, 0xad, 0x48, 0x8e, + 0x85, 0xac, 0x43, 0x7d, 0xf5, 0xcf, 0x44, 0x0b, 0xcb, 0xb1, 0xfd, 0x0c, 0x5a, 0x99, 0xc0, 0x58, + 0x94, 0x81, 0xed, 0xa7, 0xd0, 0xea, 0x71, 0x97, 0x4f, 0x0b, 0xfe, 0x4a, 0xfa, 0xb7, 0x01, 0x2b, + 0x31, 0x46, 0xe7, 0x98, 0x6f, 0xa0, 0x7e, 0x41, 0x22, 0x4e, 0xae, 0x92, 0xaa, 0x63, 0xce, 0x37, + 0xd4, 0x1f, 0x24, 0x02, 0x27, 0x48, 0xf4, 0x1d, 0xd4, 0x99, 0xd4, 0x43, 0xe2, 0x8e, 0xe5, 0x93, + 0x3c, 0x96, 0x5e, 0x2f, 0xc1, 0xa3, 0x36, 0x54, 0x7c, 0x3a, 0x62, 0xf2, 0xdc, 0x9b, 0x9b, 0x1f, + 0xe7, 0xf1, 0x0e, 0xe8, 0x08, 0x4b, 0x20, 0x7a, 0x0b, 0xf5, 0x4b, 0x37, 0x0a, 0xbc, 0x60, 0xc4, + 0xe4, 0xc3, 0x59, 0x5c, 0xda, 0x1c, 0xd2, 0x8f, 0x0a, 0x87, 0x13, 0x82, 0xdd, 0x12, 0xd7, 0xe5, + 0x8c, 0x6a, 0x9f, 0xd8, 0xbf, 0x16, 0x51, 0x2b, 0xa6, 0xda, 0xfc, 0x7d, 0x68, 0xa9, 0xc8, 0xff, + 0x40, 0x22, 0x26, 0xfa, 0x3f, 0xa3, 0xe8, 0x76, 0x6e, 0xa7, 0xa1, 0x38, 0xcb, 0xb4, 0x7f, 0xd2, + 0x85, 0x2d, 0x16, 0x88, 0x58, 0x0a, 0xdd, 0xc1, 0xd8, 0x1d, 0xc5, 0xe7, 0x14, 0x4f, 0xc5, 0x97, + 0x0b, 0xbd, 0x9e, 0xba, 0xa0, 0xf1, 0x54, 0xc4, 0x66, 0x44, 0x2e, 0x3c, 0x36, 0x6b, 0x45, 0x93, + 0xf9, 0xe6, 0x9f, 0x6a, 0x00, 0x9d, 0x64, 0x3f, 0xe8, 0x04, 0x96, 0xe4, 0x7a, 0xc8, 0x2e, 0x2c, + 0x93, 0xd2, 0x6e, 0xeb, 0xd9, 0x1d, 0x4a, 0x29, 0xfa, 0x20, 0x82, 0x5f, 0xb6, 0x37, 0xe8, 0x79, + 0x5e, 0x42, 0x48, 0x77, 0x48, 0xd6, 0x8b, 0x5b, 0x50, 0x5a, 0xef, 0x7b, 0xa8, 0xaa, 0x28, 0x40, + 0x79, 0x59, 0x2f, 0x1d, 0xb7, 0xd6, 0xf3, 0x62, 0x90, 0x52, 0xfa, 0xa5, 0x81, 0xb0, 0xce, 0x89, + 0xc8, 0x2e, 0x28, 0x7a, 0xfa, 0xc6, 0xe4, 0x39, 0x20, 0x53, 0x5f, 0x36, 0x0c, 0xf4, 0x03, 0x54, + 0x55, 0x56, 0x43, 0xbf, 0x58, 0x4c, 0x88, 0xf5, 0x15, 0x7f, 0xde, 0x30, 0xbe, 0x34, 0xd0, 0x21, + 0x54, 0x44, 0x39, 0x47, 0x39, 0xb5, 0x29, 0xd5, 0x0b, 0x58, 0x76, 0x11, 0x44, 0x7b, 0xf1, 0x27, + 0x80, 0x59, 0x53, 0x81, 0x72, 0xfe, 0x53, 0x99, 0xeb, 0x4e, 0xac, 0x8d, 0xdb, 0x81, 0x7a, 0x81, + 0x43, 0x51, 0x51, 0xcf, 0x28, 0xca, 0xad, 0xa5, 0xc9, 0x35, 0xb2, 0xec, 0x22, 0x88, 0x56, 0x77, + 0x0e, 0xad, 0xcc, 0xff, 0xd6, 0xe8, 0xf3, 0x7c, 0x23, 0x6f, 0xfe, 0x0d, 0x6e, 0xbd, 0xbc, 0x13, + 0x56, 0xaf, 0xc4, 0xd3, 0x5d, 0x99, 0xfe, 0x8c, 0x9c, 0xdb, 0xec, 0xce, 0xfe, 0x07, 0x6d, 0xb5, + 0xef, 0x8c, 0x57, 0xab, 0x6e, 0x57, 0x7e, 0x53, 0x0a, 0xfb, 0xfd, 0xaa, 0xfc, 0x3b, 0xff, 0xeb, + 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x09, 0xb4, 0x4e, 0xa7, 0x9a, 0x18, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/controller/pb/controller.proto b/controller/pb/controller.proto index 2300b7edb170..6156e4ddf5ba 100644 --- a/controller/pb/controller.proto +++ b/controller/pb/controller.proto @@ -4,6 +4,7 @@ package buildx.controller.v1; import "github.com/moby/buildkit/api/services/control/control.proto"; import "github.com/moby/buildkit/sourcepolicy/pb/policy.proto"; +import "github.com/moby/buildkit/solver/pb/ops.proto"; option go_package = "pb"; @@ -46,37 +47,59 @@ message BuildRequest { BuildOptions Options = 2; } -message BuildOptions { +message Inputs { string ContextPath = 1; string DockerfileName = 2; - PrintFunc PrintFunc = 3; - map NamedContexts = 4; - - repeated string Allow = 5; - repeated Attest Attests = 6; - map BuildArgs = 7; - repeated CacheOptionsEntry CacheFrom = 8; - repeated CacheOptionsEntry CacheTo = 9; - string CgroupParent = 10; - repeated ExportEntry Exports = 11; - repeated string ExtraHosts = 12; - map Labels = 13; - string NetworkMode = 14; - repeated string NoCacheFilter = 15; - repeated string Platforms = 16; - repeated Secret Secrets = 17; - int64 ShmSize = 18; - repeated SSH SSH = 19; - repeated string Tags = 20; - string Target = 21; - UlimitOpt Ulimits = 22; - - string Builder = 23; - bool NoCache = 24; - bool Pull = 25; - bool ExportPush = 26; - bool ExportLoad = 27; - moby.buildkit.v1.sourcepolicy.Policy SourcePolicy = 28; + string DockerfileInline = 3; + pb.Definition ContextDefinition = 4; + map NamedContexts = 5; + // io.Reader InStream = ???; +} + +message BuildOptions { + Inputs Inputs = 1; + PrintFunc PrintFunc = 2; + CommonOptions Opts = 3; + + repeated string Allow = 4; + repeated Attest Attests = 5; + map BuildArgs = 6; + repeated CacheOptionsEntry CacheFrom = 7; + repeated CacheOptionsEntry CacheTo = 8; + string CgroupParent = 9; + repeated ExportEntry Exports = 10; + repeated string ExtraHosts = 11; + map Labels = 12; + string NetworkMode = 13; + repeated string NoCacheFilter = 14; + repeated string Platforms = 15; + repeated Secret Secrets = 16; + int64 ShmSize = 17; + repeated SSH SSH = 18; + repeated string Tags = 19; + string Target = 20; + UlimitOpt Ulimits = 21; + moby.buildkit.v1.sourcepolicy.Policy SourcePolicy = 22; +} + +message NamedContext { + string Path = 1; + pb.Definition Definition = 2; +} + +message CommonOptions { + string Builder = 1; + string MetadataFile = 2; + bool NoCache = 3; + // string Progress: no progress view on server side + bool Pull = 4; + bool ExportPush = 5; + bool ExportLoad = 6; + // TODO: we should remove Linked from the controllerapi, it's only used to + // produce a single warning. To allow this, we need to move the default + // export detection out from the controller server, as well as load the + // driver on the controller client. + bool Linked = 7; } message ExportEntry { diff --git a/controller/pb/path.go b/controller/pb/path.go index b2bbe0c71f61..daf967ead4b8 100644 --- a/controller/pb/path.go +++ b/controller/pb/path.go @@ -11,52 +11,6 @@ import ( // ResolveOptionPaths resolves all paths contained in BuildOptions // and replaces them to absolute paths. func ResolveOptionPaths(options *BuildOptions) (_ *BuildOptions, err error) { - localContext := false - if options.ContextPath != "" && options.ContextPath != "-" { - if !isRemoteURL(options.ContextPath) { - localContext = true - options.ContextPath, err = filepath.Abs(options.ContextPath) - if err != nil { - return nil, err - } - } - } - if options.DockerfileName != "" && options.DockerfileName != "-" { - if localContext && !urlutil.IsURL(options.DockerfileName) { - options.DockerfileName, err = filepath.Abs(options.DockerfileName) - if err != nil { - return nil, err - } - } - } - - var contexts map[string]string - for k, v := range options.NamedContexts { - if isRemoteURL(v) || strings.HasPrefix(v, "docker-image://") { - // url prefix, this is a remote path - } else if strings.HasPrefix(v, "oci-layout://") { - // oci layout prefix, this is a local path - p := strings.TrimPrefix(v, "oci-layout://") - p, err = filepath.Abs(p) - if err != nil { - return nil, err - } - v = "oci-layout://" + p - } else { - // no prefix, assume local path - v, err = filepath.Abs(v) - if err != nil { - return nil, err - } - } - - if contexts == nil { - contexts = make(map[string]string) - } - contexts[k] = v - } - options.NamedContexts = contexts - var cacheFrom []*CacheOptionsEntry for _, co := range options.CacheFrom { switch co.Type { @@ -161,6 +115,59 @@ func ResolveOptionPaths(options *BuildOptions) (_ *BuildOptions, err error) { } options.SSH = ssh + if options.Inputs == nil { + return options, nil + } + + localContext := false + if options.Inputs.ContextPath != "" && options.Inputs.ContextPath != "-" { + if !isRemoteURL(options.Inputs.ContextPath) { + localContext = true + options.Inputs.ContextPath, err = filepath.Abs(options.Inputs.ContextPath) + if err != nil { + return nil, err + } + } + } + if options.Inputs.DockerfileName != "" && options.Inputs.DockerfileName != "-" { + if localContext && !urlutil.IsURL(options.Inputs.DockerfileName) { + options.Inputs.DockerfileName, err = filepath.Abs(options.Inputs.DockerfileName) + if err != nil { + return nil, err + } + } + } + + var contexts map[string]*NamedContext + for k, v := range options.Inputs.NamedContexts { + v := *v + if v.Definition != nil { + // definition, no path + } else if urlutil.IsGitURL(v.Path) || urlutil.IsURL(v.Path) || strings.HasPrefix(v.Path, "docker-image://") { + // url prefix, this is a remote path + } else if strings.HasPrefix(v.Path, "oci-layout://") { + // oci layout prefix, this is a local path + p := strings.TrimPrefix(v.Path, "oci-layout://") + p, err = filepath.Abs(p) + if err != nil { + return nil, err + } + v.Path = "oci-layout://" + p + } else { + // no prefix, assume local path + v.Path, err = filepath.Abs(v.Path) + if err != nil { + return nil, err + } + } + + if contexts == nil { + contexts = make(map[string]*NamedContext) + } + contexts[k] = &v + } + options.Inputs.NamedContexts = contexts + return options, nil } diff --git a/controller/pb/path_test.go b/controller/pb/path_test.go index 33710069844b..f4cd802861eb 100644 --- a/controller/pb/path_test.go +++ b/controller/pb/path_test.go @@ -20,46 +20,86 @@ func TestResolvePaths(t *testing.T) { want BuildOptions }{ { - name: "contextpath", - options: BuildOptions{ContextPath: "test"}, - want: BuildOptions{ContextPath: filepath.Join(tmpwd, "test")}, + name: "contextpath", + options: BuildOptions{ + Inputs: &Inputs{ContextPath: "test"}, + }, + want: BuildOptions{ + Inputs: &Inputs{ContextPath: filepath.Join(tmpwd, "test")}, + }, }, { - name: "contextpath-cwd", - options: BuildOptions{ContextPath: "."}, - want: BuildOptions{ContextPath: tmpwd}, + name: "contextpath-cwd", + options: BuildOptions{ + Inputs: &Inputs{ContextPath: "."}, + }, + want: BuildOptions{ + Inputs: &Inputs{ContextPath: tmpwd}, + }, }, { - name: "contextpath-dash", - options: BuildOptions{ContextPath: "-"}, - want: BuildOptions{ContextPath: "-"}, + name: "contextpath-dash", + options: BuildOptions{ + Inputs: &Inputs{ContextPath: "-"}, + }, + want: BuildOptions{ + Inputs: &Inputs{ContextPath: "-"}, + }, }, { - name: "contextpath-ssh", - options: BuildOptions{ContextPath: "git@github.com:docker/buildx.git"}, - want: BuildOptions{ContextPath: "git@github.com:docker/buildx.git"}, + name: "contextpath-ssh", + options: BuildOptions{ + Inputs: &Inputs{ContextPath: "git@github.com:docker/buildx.git"}, + }, + want: BuildOptions{ + Inputs: &Inputs{ContextPath: "git@github.com:docker/buildx.git"}, + }, }, { - name: "dockerfilename", - options: BuildOptions{DockerfileName: "test", ContextPath: "."}, - want: BuildOptions{DockerfileName: filepath.Join(tmpwd, "test"), ContextPath: tmpwd}, + name: "dockerfilename", + options: BuildOptions{ + Inputs: &Inputs{DockerfileName: "test", ContextPath: "."}, + }, + want: BuildOptions{ + Inputs: &Inputs{DockerfileName: filepath.Join(tmpwd, "test"), ContextPath: tmpwd}, + }, }, { - name: "dockerfilename-dash", - options: BuildOptions{DockerfileName: "-", ContextPath: "."}, - want: BuildOptions{DockerfileName: "-", ContextPath: tmpwd}, + name: "dockerfilename-dash", + options: BuildOptions{ + Inputs: &Inputs{DockerfileName: "-", ContextPath: "."}, + }, + want: BuildOptions{ + Inputs: &Inputs{DockerfileName: "-", ContextPath: tmpwd}, + }, }, { - name: "dockerfilename-remote", - options: BuildOptions{DockerfileName: "test", ContextPath: "git@github.com:docker/buildx.git"}, - want: BuildOptions{DockerfileName: "test", ContextPath: "git@github.com:docker/buildx.git"}, + name: "dockerfilename-remote", + options: BuildOptions{ + Inputs: &Inputs{DockerfileName: "test", ContextPath: "git@github.com:docker/buildx.git"}, + }, + want: BuildOptions{ + Inputs: &Inputs{DockerfileName: "test", ContextPath: "git@github.com:docker/buildx.git"}, + }, }, { name: "contexts", - options: BuildOptions{NamedContexts: map[string]string{"a": "test1", "b": "test2", - "alpine": "docker-image://alpine@sha256:0123456789", "project": "https://github.com/myuser/project.git"}}, - want: BuildOptions{NamedContexts: map[string]string{"a": filepath.Join(tmpwd, "test1"), "b": filepath.Join(tmpwd, "test2"), - "alpine": "docker-image://alpine@sha256:0123456789", "project": "https://github.com/myuser/project.git"}}, + options: BuildOptions{ + Inputs: &Inputs{NamedContexts: map[string]*NamedContext{ + "a": {Path: "test1"}, + "b": {Path: "test2"}, + "alpine": {Path: "docker-image://alpine@sha256:0123456789"}, + "project": {Path: "https://github.com/myuser/project.git"}, + }, + }}, + want: BuildOptions{ + Inputs: &Inputs{NamedContexts: map[string]*NamedContext{ + "a": {Path: filepath.Join(tmpwd, "test1")}, + "b": {Path: filepath.Join(tmpwd, "test2")}, + "alpine": {Path: "docker-image://alpine@sha256:0123456789"}, + "project": {Path: "https://github.com/myuser/project.git"}, + }, + }}, }, { name: "cache-from", diff --git a/util/buildflags/context.go b/util/buildflags/context.go index e67fb97ce8e7..73d8c1c2abbc 100644 --- a/util/buildflags/context.go +++ b/util/buildflags/context.go @@ -3,15 +3,16 @@ package buildflags import ( "strings" + controllerapi "github.com/docker/buildx/controller/pb" "github.com/docker/distribution/reference" "github.com/pkg/errors" ) -func ParseContextNames(values []string) (map[string]string, error) { +func ParseContextNames(values []string) (map[string]*controllerapi.NamedContext, error) { if len(values) == 0 { return nil, nil } - result := make(map[string]string, len(values)) + result := make(map[string]*controllerapi.NamedContext, len(values)) for _, value := range values { kv := strings.SplitN(value, "=", 2) if len(kv) != 2 { @@ -22,7 +23,7 @@ func ParseContextNames(values []string) (map[string]string, error) { return nil, errors.Wrapf(err, "invalid context name %s", kv[0]) } name := strings.TrimSuffix(reference.FamiliarString(named), ":latest") - result[name] = kv[1] + result[name] = &controllerapi.NamedContext{Path: kv[1]} } return result, nil } From 938764067650f67514c391362896d9239ab88dae Mon Sep 17 00:00:00 2001 From: Justin Chadwell Date: Thu, 1 Jun 2023 10:36:04 +0200 Subject: [PATCH 2/5] bake: use controller build options as an intermediate stage With the previous changes to bring controllerapi.BuildOptions up to date with build.Options, we can have bake generate controllerapi.BuildOptions, and then convert those to build.Option using the controller/build package. This is an intermediate patch, designed to allow us to clean up some shared logic between both build and bake. The next step will be to modify bake to use the controller api, and completely skip the build.Options generation step. Signed-off-by: CrazyMax --- bake/bake.go | 124 +++++++++++++++++++++++---------------------------- 1 file changed, 55 insertions(+), 69 deletions(-) diff --git a/bake/bake.go b/bake/bake.go index 9a507cd6e832..22d31f9689ef 100644 --- a/bake/bake.go +++ b/bake/bake.go @@ -15,14 +15,11 @@ import ( composecli "github.com/compose-spec/compose-go/cli" "github.com/docker/buildx/bake/hclparser" "github.com/docker/buildx/build" + cbuild "github.com/docker/buildx/controller/build" controllerapi "github.com/docker/buildx/controller/pb" "github.com/docker/buildx/util/buildflags" - "github.com/docker/buildx/util/platformutil" - - "github.com/docker/cli/cli/config" hcl "github.com/hashicorp/hcl/v2" "github.com/moby/buildkit/client/llb" - "github.com/moby/buildkit/session/auth/authprovider" "github.com/pkg/errors" "github.com/zclconf/go-cty/cty" "github.com/zclconf/go-cty/cty/convert" @@ -914,7 +911,11 @@ func (t *Target) GetName(ectx *hcl.EvalContext, block *hcl.Block, loadDeps func( func TargetsToBuildOpt(m map[string]*Target, inp *Input) (map[string]build.Options, error) { m2 := make(map[string]build.Options, len(m)) for k, v := range m { - bo, err := toBuildOpt(v, inp) + opts, err := toControllerOpt(v, inp) + if err != nil { + return nil, err + } + bo, err := cbuild.ToBuildOpts(*opts, nil) if err != nil { return nil, err } @@ -923,14 +924,14 @@ func TargetsToBuildOpt(m map[string]*Target, inp *Input) (map[string]build.Optio return m2, nil } -func updateContext(t *build.Inputs, inp *Input) { +func updateContext(t *controllerapi.Inputs, inp *Input) error { if inp == nil || inp.State == nil { - return + return nil } for k, v := range t.NamedContexts { if v.Path == "." { - t.NamedContexts[k] = build.NamedContext{Path: inp.URL} + t.NamedContexts[k] = &controllerapi.NamedContext{Path: inp.URL} } if strings.HasPrefix(v.Path, "cwd://") || strings.HasPrefix(v.Path, "target:") || strings.HasPrefix(v.Path, "docker-image:") { continue @@ -939,18 +940,22 @@ func updateContext(t *build.Inputs, inp *Input) { continue } st := llb.Scratch().File(llb.Copy(*inp.State, v.Path, "/"), llb.WithCustomNamef("set context %s to %s", k, v.Path)) - t.NamedContexts[k] = build.NamedContext{State: &st} + def, err := st.Marshal(context.TODO()) + if err != nil { + return err + } + t.NamedContexts[k] = &controllerapi.NamedContext{Definition: def.ToPB()} } if t.ContextPath == "." { t.ContextPath = inp.URL - return + return nil } if strings.HasPrefix(t.ContextPath, "cwd://") { - return + return nil } if build.IsRemoteURL(t.ContextPath) { - return + return nil } st := llb.Scratch().File( llb.Copy(*inp.State, t.ContextPath, "/", &llb.CopyInfo{ @@ -958,13 +963,18 @@ func updateContext(t *build.Inputs, inp *Input) { }), llb.WithCustomNamef("set context to %s", t.ContextPath), ) - t.ContextState = &st + def, err := st.Marshal(context.TODO()) + if err != nil { + return err + } + t.ContextDefinition = def.ToPB() + return nil } // validateContextsEntitlements is a basic check to ensure contexts do not // escape local directories when loaded from remote sources. This is to be // replaced with proper entitlements support in the future. -func validateContextsEntitlements(t build.Inputs, inp *Input) error { +func validateContextsEntitlements(t controllerapi.Inputs, inp *Input) error { if inp == nil || inp.State == nil { return nil } @@ -973,13 +983,13 @@ func validateContextsEntitlements(t build.Inputs, inp *Input) error { return nil } } - if t.ContextState == nil { + if t.ContextDefinition == nil { if err := checkPath(t.ContextPath); err != nil { return err } } for _, v := range t.NamedContexts { - if v.State != nil { + if v.Definition != nil { continue } if err := checkPath(v.Path); err != nil { @@ -1019,7 +1029,9 @@ func checkPath(p string) error { return nil } -func toBuildOpt(t *Target, inp *Input) (*build.Options, error) { +func toControllerOpt(t *Target, inp *Input) (*controllerapi.BuildOptions, error) { + var err error + if v := t.Context; v != nil && *v == "-" { return nil, errors.Errorf("context from stdin not allowed in bake") } @@ -1039,24 +1051,24 @@ func toBuildOpt(t *Target, inp *Input) (*build.Options, error) { dockerfilePath = *t.Dockerfile } - bi := build.Inputs{ + bi := controllerapi.Inputs{ ContextPath: contextPath, - DockerfilePath: dockerfilePath, + DockerfileName: dockerfilePath, NamedContexts: toNamedContexts(t.Contexts), } if t.DockerfileInline != nil { bi.DockerfileInline = *t.DockerfileInline } updateContext(&bi, inp) - if !build.IsRemoteURL(bi.ContextPath) && bi.ContextState == nil && !path.IsAbs(bi.DockerfilePath) { - bi.DockerfilePath = path.Join(bi.ContextPath, bi.DockerfilePath) + if !build.IsRemoteURL(bi.ContextPath) && bi.ContextDefinition == nil && !path.IsAbs(bi.DockerfileName) { + bi.DockerfileName = path.Join(bi.ContextPath, bi.DockerfileName) } if strings.HasPrefix(bi.ContextPath, "cwd://") { bi.ContextPath = path.Clean(strings.TrimPrefix(bi.ContextPath, "cwd://")) } for k, v := range bi.NamedContexts { if strings.HasPrefix(v.Path, "cwd://") { - bi.NamedContexts[k] = build.NamedContext{Path: path.Clean(strings.TrimPrefix(v.Path, "cwd://"))} + bi.NamedContexts[k] = &controllerapi.NamedContext{Path: path.Clean(strings.TrimPrefix(v.Path, "cwd://"))} } } @@ -1095,87 +1107,61 @@ func toBuildOpt(t *Target, inp *Input) (*build.Options, error) { networkMode = *t.NetworkMode } - bo := &build.Options{ - Inputs: bi, + opts := &controllerapi.BuildOptions{ + Inputs: &bi, + Opts: &controllerapi.CommonOptions{ + NoCache: noCache, + Pull: pull, + Linked: t.linked, + }, Tags: t.Tags, BuildArgs: args, Labels: labels, - NoCache: noCache, NoCacheFilter: t.NoCacheFilter, - Pull: pull, NetworkMode: networkMode, - Linked: t.linked, + Platforms: t.Platforms, } - platforms, err := platformutil.Parse(t.Platforms) - if err != nil { - return nil, err + if t.Target != nil { + opts.Target = *t.Target } - bo.Platforms = platforms - dockerConfig := config.LoadDefaultConfigFile(os.Stderr) - bo.Session = append(bo.Session, authprovider.NewDockerAuthProvider(dockerConfig)) - - secrets, err := buildflags.ParseSecretSpecs(t.Secrets) - if err != nil { - return nil, err - } - secretAttachment, err := controllerapi.CreateSecrets(secrets) + opts.Secrets, err = buildflags.ParseSecretSpecs(t.Secrets) if err != nil { return nil, err } - bo.Session = append(bo.Session, secretAttachment) - sshSpecs, err := buildflags.ParseSSHSpecs(t.SSH) - if err != nil { - return nil, err - } - if len(sshSpecs) == 0 && (buildflags.IsGitSSH(bi.ContextPath) || (inp != nil && buildflags.IsGitSSH(inp.URL))) { - sshSpecs = append(sshSpecs, &controllerapi.SSH{ID: "default"}) - } - sshAttachment, err := controllerapi.CreateSSH(sshSpecs) + opts.SSH, err = buildflags.ParseSSHSpecs(t.SSH) if err != nil { return nil, err } - bo.Session = append(bo.Session, sshAttachment) - - if t.Target != nil { - bo.Target = *t.Target - } - cacheImports, err := buildflags.ParseCacheEntry(t.CacheFrom) + opts.CacheFrom, err = buildflags.ParseCacheEntry(t.CacheFrom) if err != nil { return nil, err } - bo.CacheFrom = controllerapi.CreateCaches(cacheImports) - cacheExports, err := buildflags.ParseCacheEntry(t.CacheTo) + opts.CacheTo, err = buildflags.ParseCacheEntry(t.CacheTo) if err != nil { return nil, err } - bo.CacheTo = controllerapi.CreateCaches(cacheExports) - outputs, err := buildflags.ParseExports(t.Outputs) - if err != nil { - return nil, err - } - bo.Exports, err = controllerapi.CreateExports(outputs) + opts.Exports, err = buildflags.ParseExports(t.Outputs) if err != nil { return nil, err } - attests, err := buildflags.ParseAttests(t.Attest) + opts.Attests, err = buildflags.ParseAttests(t.Attest) if err != nil { return nil, err } - bo.Attests = controllerapi.CreateAttestations(attests) - bo.SourcePolicy, err = build.ReadSourcePolicy() + opts.SourcePolicy, err = build.ReadSourcePolicy() if err != nil { return nil, err } - return bo, nil + return opts, nil } func defaultTarget() *Target { @@ -1264,10 +1250,10 @@ func sliceEqual(s1, s2 []string) bool { return true } -func toNamedContexts(m map[string]string) map[string]build.NamedContext { - m2 := make(map[string]build.NamedContext, len(m)) +func toNamedContexts(m map[string]string) map[string]*controllerapi.NamedContext { + m2 := make(map[string]*controllerapi.NamedContext, len(m)) for k, v := range m { - m2[k] = build.NamedContext{Path: v} + m2[k] = &controllerapi.NamedContext{Path: v} } return m2 } From 9df197046c9275ff716964560953f41935187a5f Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Thu, 1 Jun 2023 17:42:34 +0200 Subject: [PATCH 3/5] bake: use controller to build With this change we are now passing a list of controller options to run a build and returns a map of responses and result context as bake can handle a list of targets. Signed-off-by: CrazyMax --- bake/bake.go | 11 +- bake/bake_test.go | 44 ++++-- build/build.go | 4 +- commands/bake.go | 42 ++--- commands/build.go | 14 +- controller/build/build.go | 71 ++++++--- controller/pb/controller.pb.go | 271 +++++++++++++++++---------------- controller/pb/controller.proto | 9 +- 8 files changed, 264 insertions(+), 202 deletions(-) diff --git a/bake/bake.go b/bake/bake.go index 22d31f9689ef..82eaf68ebfa5 100644 --- a/bake/bake.go +++ b/bake/bake.go @@ -15,7 +15,6 @@ import ( composecli "github.com/compose-spec/compose-go/cli" "github.com/docker/buildx/bake/hclparser" "github.com/docker/buildx/build" - cbuild "github.com/docker/buildx/controller/build" controllerapi "github.com/docker/buildx/controller/pb" "github.com/docker/buildx/util/buildflags" hcl "github.com/hashicorp/hcl/v2" @@ -908,18 +907,14 @@ func (t *Target) GetName(ectx *hcl.EvalContext, block *hcl.Block, loadDeps func( return value.AsString(), nil } -func TargetsToBuildOpt(m map[string]*Target, inp *Input) (map[string]build.Options, error) { - m2 := make(map[string]build.Options, len(m)) +func TargetsToControllerOptions(m map[string]*Target, inp *Input) (map[string]controllerapi.BuildOptions, error) { + m2 := make(map[string]controllerapi.BuildOptions, len(m)) for k, v := range m { opts, err := toControllerOpt(v, inp) if err != nil { return nil, err } - bo, err := cbuild.ToBuildOpts(*opts, nil) - if err != nil { - return nil, err - } - m2[k] = *bo + m2[k] = *opts } return m2, nil } diff --git a/bake/bake_test.go b/bake/bake_test.go index f3341c06d7f9..f3874240e6ac 100644 --- a/bake/bake_test.go +++ b/bake/bake_test.go @@ -7,6 +7,7 @@ import ( "strings" "testing" + "github.com/docker/buildx/controller/pb" "github.com/stretchr/testify/require" ) @@ -390,7 +391,7 @@ func TestHCLCwdPrefix(t *testing.T) { _, ok := m["app"] require.True(t, ok) - _, err = TargetsToBuildOpt(m, &Input{}) + _, err = TargetsToControllerOptions(m, &Input{}) require.NoError(t, err) require.Equal(t, "test", *m["app"].Dockerfile) @@ -421,7 +422,7 @@ func TestOverrideMerge(t *testing.T) { _, ok := m["app"] require.True(t, ok) - _, err = TargetsToBuildOpt(m, &Input{}) + _, err = TargetsToControllerOptions(m, &Input{}) require.NoError(t, err) require.Equal(t, []string{"linux/arm", "linux/ppc64le"}, m["app"].Platforms) @@ -456,7 +457,7 @@ func TestReadContexts(t *testing.T) { _, ok := m["app"] require.True(t, ok) - bo, err := TargetsToBuildOpt(m, &Input{}) + bo, err := TargetsToControllerOptions(m, &Input{}) require.NoError(t, err) ctxs := bo["app"].Inputs.NamedContexts @@ -472,7 +473,7 @@ func TestReadContexts(t *testing.T) { _, ok = m["app"] require.True(t, ok) - bo, err = TargetsToBuildOpt(m, &Input{}) + bo, err = TargetsToControllerOptions(m, &Input{}) require.NoError(t, err) ctxs = bo["app"].Inputs.NamedContexts @@ -490,7 +491,7 @@ func TestReadContexts(t *testing.T) { _, ok = m["app"] require.True(t, ok) - bo, err = TargetsToBuildOpt(m, &Input{}) + bo, err = TargetsToControllerOptions(m, &Input{}) require.NoError(t, err) ctxs = bo["app"].Inputs.NamedContexts @@ -1325,7 +1326,7 @@ func TestHCLNullVars(t *testing.T) { _, ok := m["default"] require.True(t, ok) - _, err = TargetsToBuildOpt(m, &Input{}) + _, err = TargetsToControllerOptions(m, &Input{}) require.NoError(t, err) require.Equal(t, map[string]*string{"bar": ptrstr("baz")}, m["default"].Args) require.Equal(t, map[string]*string{"com.docker.app.baz": ptrstr("foo")}, m["default"].Labels) @@ -1360,7 +1361,7 @@ func TestJSONNullVars(t *testing.T) { _, ok := m["default"] require.True(t, ok) - _, err = TargetsToBuildOpt(m, &Input{}) + _, err = TargetsToControllerOptions(m, &Input{}) require.NoError(t, err) require.Equal(t, map[string]*string{"bar": ptrstr("baz")}, m["default"].Args) } @@ -1432,21 +1433,34 @@ func TestAttestDuplicates(t *testing.T) { require.Equal(t, []string{"type=sbom,foo=bar", "type=provenance,mode=max"}, m["default"].Attest) require.NoError(t, err) - opts, err := TargetsToBuildOpt(m, &Input{}) + opts, err := TargetsToControllerOptions(m, &Input{}) require.NoError(t, err) - require.Equal(t, map[string]*string{ - "sbom": ptrstr("type=sbom,foo=bar"), - "provenance": ptrstr("type=provenance,mode=max"), + require.Equal(t, []*pb.Attest{ + { + Type: "sbom", + Attrs: "type=sbom,foo=bar", + }, + { + Type: "provenance", + Attrs: "type=provenance,mode=max", + }, }, opts["default"].Attests) m, _, err = ReadTargets(ctx, []File{fp}, []string{"default"}, []string{"*.attest=type=sbom,disabled=true"}, nil) require.Equal(t, []string{"type=sbom,disabled=true", "type=provenance,mode=max"}, m["default"].Attest) require.NoError(t, err) - opts, err = TargetsToBuildOpt(m, &Input{}) + opts, err = TargetsToControllerOptions(m, &Input{}) require.NoError(t, err) - require.Equal(t, map[string]*string{ - "sbom": nil, - "provenance": ptrstr("type=provenance,mode=max"), + require.Equal(t, []*pb.Attest{ + { + Type: "sbom", + Disabled: true, + Attrs: "type=sbom,disabled=true", + }, + { + Type: "provenance", + Attrs: "type=provenance,mode=max", + }, }, opts["default"].Attests) } diff --git a/build/build.go b/build/build.go index 3b855ef14293..3bee2b11ed92 100644 --- a/build/build.go +++ b/build/build.go @@ -668,7 +668,7 @@ func Build(ctx context.Context, nodes []builder.Node, opt map[string]Options, do return BuildWithResultHandler(ctx, nodes, opt, docker, configDir, w, nil) } -func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[string]Options, docker *dockerutil.Client, configDir string, w progress.Writer, resultHandleFunc func(driverIndex int, rCtx *ResultHandle)) (resp map[string]*client.SolveResponse, err error) { +func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[string]Options, docker *dockerutil.Client, configDir string, w progress.Writer, resultHandleFunc func(target string, rCtx *ResultHandle)) (resp map[string]*client.SolveResponse, err error) { if len(nodes) == 0 { return nil, errors.Errorf("driver required for build") } @@ -938,7 +938,7 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s if resultHandleFunc != nil { var resultHandle *ResultHandle resultHandle, rr, err = NewResultHandle(ctx, cc, so, "buildx", buildFunc, ch) - resultHandleFunc(dp.driverIndex, resultHandle) + resultHandleFunc(k, resultHandle) } else { rr, err = c.Build(ctx, so, "buildx", buildFunc, ch) } diff --git a/commands/bake.go b/commands/bake.go index 8edd45e6f467..553fb09bdd73 100644 --- a/commands/bake.go +++ b/commands/bake.go @@ -11,11 +11,11 @@ import ( "github.com/docker/buildx/bake" "github.com/docker/buildx/build" "github.com/docker/buildx/builder" + cbuild "github.com/docker/buildx/controller/build" + controllerapi "github.com/docker/buildx/controller/pb" "github.com/docker/buildx/util/buildflags" "github.com/docker/buildx/util/cobrautil/completion" - "github.com/docker/buildx/util/confutil" "github.com/docker/buildx/util/desktop" - "github.com/docker/buildx/util/dockerutil" "github.com/docker/buildx/util/progress" "github.com/docker/buildx/util/tracing" "github.com/docker/cli/cli/command" @@ -31,10 +31,8 @@ type bakeOptions struct { sbom string provenance string - builder string - metadataFile string - exportPush bool - exportLoad bool + controllerapi.CommonOptions + //control.ControlOptions } func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags commonFlags) (err error) { @@ -69,12 +67,12 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com } overrides := in.overrides - if in.exportPush { - if in.exportLoad { + if in.ExportPush { + if in.ExportLoad { return errors.Errorf("push and load may not be set together at the moment") } overrides = append(overrides, "*.push=true") - } else if in.exportLoad { + } else if in.ExportLoad { overrides = append(overrides, "*.output=type=docker") } if cFlags.noCache != nil { @@ -102,7 +100,7 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com // instance only needed for reading remote bake files or building if url != "" || !in.printOnly { b, err := builder.New(dockerCli, - builder.WithName(in.builder), + builder.WithName(in.Builder), builder.WithContextPathHash(contextPathHash), ) if err != nil { @@ -176,11 +174,19 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com } // this function can update target context string from the input so call before printOnly check - bo, err := bake.TargetsToBuildOpt(tgts, inp) + opts, err := bake.TargetsToControllerOptions(tgts, inp) if err != nil { return err } + // set builder name and context hash for all targets + updatedOpts := make(map[string]controllerapi.BuildOptions, len(opts)) + for i, opt := range opts { + opt.Opts.Builder = in.Builder + opt.Inputs.ContextPathHash = contextPathHash + updatedOpts[i] = opt + } + if in.printOnly { dt, err := json.MarshalIndent(struct { Group map[string]*bake.Group `json:"group,omitempty"` @@ -201,17 +207,17 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com return nil } - resp, err := build.Build(ctx, nodes, bo, dockerutil.NewClient(dockerCli), confutil.ConfigDir(dockerCli), printer) + resp, _, err := cbuild.RunBuilds(ctx, dockerCli, updatedOpts, os.Stdin, printer, false) if err != nil { return wrapBuildError(err, true) } - if len(in.metadataFile) > 0 { + if len(in.MetadataFile) > 0 { dt := make(map[string]interface{}) for t, r := range resp { dt[t] = decodeExporterResponse(r.ExporterResponse) } - if err := writeMetadataFile(in.metadataFile, dt); err != nil { + if err := writeMetadataFile(in.MetadataFile, dt); err != nil { return err } } @@ -235,8 +241,8 @@ func bakeCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command { if !cmd.Flags().Lookup("pull").Changed { cFlags.pull = nil } - options.builder = rootOpts.builder - options.metadataFile = cFlags.metadataFile + options.Builder = rootOpts.builder + options.MetadataFile = cFlags.metadataFile // Other common flags (noCache, pull and progress) are processed in runBake function. return runBake(dockerCli, args, options, cFlags) }, @@ -246,9 +252,9 @@ func bakeCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command { flags := cmd.Flags() flags.StringArrayVarP(&options.files, "file", "f", []string{}, "Build definition file") - flags.BoolVar(&options.exportLoad, "load", false, `Shorthand for "--set=*.output=type=docker"`) + flags.BoolVar(&options.ExportLoad, "load", false, `Shorthand for "--set=*.output=type=docker"`) flags.BoolVar(&options.printOnly, "print", false, "Print the options without building") - flags.BoolVar(&options.exportPush, "push", false, `Shorthand for "--set=*.output=type=registry"`) + flags.BoolVar(&options.ExportPush, "push", false, `Shorthand for "--set=*.output=type=registry"`) flags.StringVar(&options.sbom, "sbom", "", `Shorthand for "--set=*.attest=type=sbom"`) flags.StringVar(&options.provenance, "provenance", "", `Shorthand for "--set=*.attest=type=provenance"`) flags.StringArrayVar(&options.overrides, "set", nil, `Override target value (e.g., "targetpattern.key=value")`) diff --git a/commands/build.go b/commands/build.go index 0a19b1c85ee2..227ab18a60a0 100644 --- a/commands/build.go +++ b/commands/build.go @@ -94,8 +94,12 @@ func (o *buildOptions) toControllerOptions() (*controllerapi.BuildOptions, error var err error inputs := controllerapi.Inputs{ - ContextPath: o.contextPath, - DockerfileName: o.dockerfileName, + ContextPath: o.contextPath, + ContextPathHash: o.contextPath, + DockerfileName: o.dockerfileName, + } + if absContextPath, err := filepath.Abs(inputs.ContextPathHash); err == nil { + inputs.ContextPathHash = absContextPath } inputs.NamedContexts, err = buildflags.ParseContextNames(o.contexts) if err != nil { @@ -218,13 +222,9 @@ func runBuild(dockerCli command.Cli, options buildOptions) (err error) { } } - contextPathHash := options.contextPath - if absContextPath, err := filepath.Abs(contextPathHash); err == nil { - contextPathHash = absContextPath - } b, err := builder.New(dockerCli, builder.WithName(options.Builder), - builder.WithContextPathHash(contextPathHash), + builder.WithContextPathHash(opts.Inputs.ContextPathHash), ) if err != nil { return err diff --git a/controller/build/build.go b/controller/build/build.go index c262f455c1a1..3b32eda7ed11 100644 --- a/controller/build/build.go +++ b/controller/build/build.go @@ -4,7 +4,6 @@ import ( "context" "io" "os" - "path/filepath" "strings" "sync" @@ -27,6 +26,7 @@ import ( "github.com/moby/buildkit/session/auth/authprovider" "github.com/moby/buildkit/util/grpcerrors" "github.com/pkg/errors" + "golang.org/x/sync/errgroup" "google.golang.org/grpc/codes" ) @@ -38,19 +38,56 @@ const defaultTargetName = "default" // this function returns it in addition to the error (i.e. it does "return nil, res, err"). The caller can // inspect the result and debug the cause of that error. func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.BuildOptions, inStream io.Reader, progress progress.Writer, generateResult bool) (*client.SolveResponse, *build.ResultHandle, error) { - opts, err := ToBuildOpts(in, inStream) - if err != nil { - return nil, nil, err + cResp, cRes, err := RunBuilds(ctx, dockerCli, map[string]controllerapi.BuildOptions{defaultTargetName: in}, inStream, progress, generateResult) + var resp *client.SolveResponse + if v, ok := cResp[defaultTargetName]; ok { + resp = v + } + var res *build.ResultHandle + if v, ok := cRes[defaultTargetName]; ok { + res = v } + return resp, res, err +} - // key string used for kubernetes "sticky" mode - contextPathHash, err := filepath.Abs(in.Inputs.ContextPath) - if err != nil { - contextPathHash = in.Inputs.ContextPath +// RunBuilds same as RunBuild but runs multiple builds. +func RunBuilds(ctx context.Context, dockerCli command.Cli, in map[string]controllerapi.BuildOptions, inStream io.Reader, progress progress.Writer, generateResult bool) (map[string]*client.SolveResponse, map[string]*build.ResultHandle, error) { + var err error + var builderName string + var contextPathHash string + + opts := make(map[string]build.Options, len(in)) + mu := sync.Mutex{} + eg, _ := errgroup.WithContext(ctx) + for t, o := range in { + func(t string, o controllerapi.BuildOptions) { + eg.Go(func() error { + opt, err := ToBuildOpts(o, inStream) + if err != nil { + return err + } + mu.Lock() + opts[t] = *opt + // we assume that all the targets are using the same builder and + // context path hash. This assumption is currently valid but, we + // may need to revisit this in the future. + if builderName == "" { + builderName = o.Opts.Builder + } + if contextPathHash == "" { + contextPathHash = o.Inputs.ContextPathHash + } + mu.Unlock() + return nil + }) + }(t, o) + } + if err := eg.Wait(); err != nil { + return nil, nil, err } b, err := builder.New(dockerCli, - builder.WithName(in.Opts.Builder), + builder.WithName(builderName), builder.WithContextPathHash(contextPathHash), ) if err != nil { @@ -64,7 +101,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build return nil, nil, err } - resp, res, err := buildTargets(ctx, dockerCli, b.NodeGroup, nodes, map[string]build.Options{defaultTargetName: *opts}, progress, generateResult) + resp, res, err := buildTargets(ctx, dockerCli, b.NodeGroup, nodes, opts, progress, generateResult) err = wrapBuildError(err, false) if err != nil { return nil, nil, err @@ -216,19 +253,19 @@ func ToBuildOpts(in controllerapi.BuildOptions, inStream io.Reader) (*build.Opti // NOTE: When an error happens during the build and this function acquires the debuggable *build.ResultHandle, // this function returns it in addition to the error (i.e. it does "return nil, res, err"). The caller can // inspect the result and debug the cause of that error. -func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGroup, nodes []builder.Node, opts map[string]build.Options, progress progress.Writer, generateResult bool) (*client.SolveResponse, *build.ResultHandle, error) { - var res *build.ResultHandle +func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGroup, nodes []builder.Node, opts map[string]build.Options, progress progress.Writer, generateResult bool) (map[string]*client.SolveResponse, map[string]*build.ResultHandle, error) { + var res map[string]*build.ResultHandle var resp map[string]*client.SolveResponse var err error if generateResult { var mu sync.Mutex - var idx int - resp, err = build.BuildWithResultHandler(ctx, nodes, opts, dockerutil.NewClient(dockerCli), confutil.ConfigDir(dockerCli), progress, func(driverIndex int, gotRes *build.ResultHandle) { + resp, err = build.BuildWithResultHandler(ctx, nodes, opts, dockerutil.NewClient(dockerCli), confutil.ConfigDir(dockerCli), progress, func(target string, gotRes *build.ResultHandle) { mu.Lock() defer mu.Unlock() - if res == nil || driverIndex < idx { - idx, res = driverIndex, gotRes + if res == nil { + res = make(map[string]*build.ResultHandle) } + res[target] = gotRes }) } else { resp, err = build.Build(ctx, nodes, opts, dockerutil.NewClient(dockerCli), confutil.ConfigDir(dockerCli), progress) @@ -236,7 +273,7 @@ func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGrou if err != nil { return nil, res, err } - return resp[defaultTargetName], res, err + return resp, res, err } func wrapBuildError(err error, bake bool) error { diff --git a/controller/pb/controller.pb.go b/controller/pb/controller.pb.go index b679db32ced9..65d48ef7e050 100644 --- a/controller/pb/controller.pb.go +++ b/controller/pb/controller.pb.go @@ -273,10 +273,11 @@ func (m *BuildRequest) GetOptions() *BuildOptions { type Inputs struct { ContextPath string `protobuf:"bytes,1,opt,name=ContextPath,proto3" json:"ContextPath,omitempty"` - DockerfileName string `protobuf:"bytes,2,opt,name=DockerfileName,proto3" json:"DockerfileName,omitempty"` - DockerfileInline string `protobuf:"bytes,3,opt,name=DockerfileInline,proto3" json:"DockerfileInline,omitempty"` - ContextDefinition *pb.Definition `protobuf:"bytes,4,opt,name=ContextDefinition,proto3" json:"ContextDefinition,omitempty"` - NamedContexts map[string]*NamedContext `protobuf:"bytes,5,rep,name=NamedContexts,proto3" json:"NamedContexts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ContextPathHash string `protobuf:"bytes,2,opt,name=ContextPathHash,proto3" json:"ContextPathHash,omitempty"` + DockerfileName string `protobuf:"bytes,3,opt,name=DockerfileName,proto3" json:"DockerfileName,omitempty"` + DockerfileInline string `protobuf:"bytes,4,opt,name=DockerfileInline,proto3" json:"DockerfileInline,omitempty"` + ContextDefinition *pb.Definition `protobuf:"bytes,5,opt,name=ContextDefinition,proto3" json:"ContextDefinition,omitempty"` + NamedContexts map[string]*NamedContext `protobuf:"bytes,6,rep,name=NamedContexts,proto3" json:"NamedContexts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -313,6 +314,13 @@ func (m *Inputs) GetContextPath() string { return "" } +func (m *Inputs) GetContextPathHash() string { + if m != nil { + return m.ContextPathHash + } + return "" +} + func (m *Inputs) GetDockerfileName() string { if m != nil { return m.DockerfileName @@ -2209,134 +2217,135 @@ func init() { func init() { proto.RegisterFile("controller.proto", fileDescriptor_ed7f10298fa1d90f) } var fileDescriptor_ed7f10298fa1d90f = []byte{ - // 2030 bytes of a gzipped FileDescriptorProto + // 2044 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xdd, 0x72, 0xdb, 0xc6, - 0x15, 0x2e, 0x48, 0x8a, 0x3f, 0x87, 0xa2, 0x2c, 0x6f, 0x65, 0x0f, 0x82, 0xb8, 0x89, 0x0c, 0xdb, - 0xa9, 0x26, 0xce, 0x80, 0x89, 0x92, 0xd4, 0x76, 0xec, 0x5c, 0x48, 0x94, 0x38, 0x52, 0x46, 0x7f, - 0xb3, 0x94, 0x9d, 0x69, 0x2f, 0x9a, 0x01, 0xc9, 0x15, 0x85, 0x21, 0x88, 0x45, 0xb1, 0x4b, 0xfd, - 0xf4, 0xaa, 0x37, 0xbd, 0xeb, 0xf4, 0x3d, 0x3a, 0x7d, 0x84, 0xce, 0x74, 0xa6, 0xcf, 0xd0, 0xf7, - 0xe8, 0xf4, 0xb6, 0x77, 0x9d, 0xfd, 0x01, 0x08, 0x88, 0x04, 0x24, 0xb5, 0x57, 0xdc, 0x3d, 0xf8, - 0xbe, 0xb3, 0x7b, 0xce, 0x9e, 0x3d, 0xe7, 0x2c, 0x61, 0x75, 0x40, 0x03, 0x1e, 0x51, 0xdf, 0x27, - 0x91, 0x13, 0x46, 0x94, 0x53, 0xb4, 0xd6, 0x9f, 0x7a, 0xfe, 0xf0, 0xca, 0x49, 0x7d, 0xb8, 0xf8, - 0xca, 0x7a, 0x3b, 0xf2, 0xf8, 0xf9, 0xb4, 0xef, 0x0c, 0xe8, 0xa4, 0x3d, 0xa1, 0xfd, 0xeb, 0xb6, - 0x44, 0x8d, 0x3d, 0xde, 0x76, 0x43, 0xaf, 0xcd, 0x48, 0x74, 0xe1, 0x0d, 0x08, 0x6b, 0x6b, 0x52, - 0xfc, 0xab, 0x54, 0x5a, 0xdf, 0xe6, 0x92, 0x19, 0x9d, 0x46, 0x03, 0x12, 0x52, 0xdf, 0x1b, 0x5c, - 0xb7, 0xc3, 0x7e, 0x5b, 0x8d, 0x34, 0xed, 0x8b, 0x02, 0x9a, 0x7f, 0x41, 0x22, 0x41, 0xa0, 0x21, - 0x53, 0x68, 0x7b, 0x03, 0xd6, 0x0e, 0x3c, 0xc6, 0x4f, 0x22, 0x3a, 0x20, 0x8c, 0x11, 0x86, 0xc9, - 0xef, 0xa6, 0x84, 0x71, 0xb4, 0x0a, 0x65, 0x4c, 0xce, 0x4c, 0x63, 0xdd, 0xd8, 0x68, 0x60, 0x31, - 0xb4, 0x4f, 0xe0, 0xd1, 0x0d, 0x24, 0x0b, 0x69, 0xc0, 0x08, 0x7a, 0x05, 0x4b, 0xfb, 0xc1, 0x19, - 0x65, 0xa6, 0xb1, 0x5e, 0xde, 0x68, 0x6e, 0x3e, 0x75, 0x16, 0xb9, 0xc2, 0xd1, 0x3c, 0x81, 0xc4, - 0x0a, 0x6f, 0x33, 0x68, 0xa6, 0xa4, 0xe8, 0x09, 0x34, 0xe2, 0xe9, 0x8e, 0x5e, 0x78, 0x26, 0x40, - 0x5d, 0x58, 0xde, 0x0f, 0x2e, 0xe8, 0x98, 0x74, 0x68, 0x70, 0xe6, 0x8d, 0xcc, 0xd2, 0xba, 0xb1, - 0xd1, 0xdc, 0xb4, 0x17, 0x2f, 0x96, 0x46, 0xe2, 0x0c, 0xcf, 0xfe, 0x01, 0xcc, 0x1d, 0x8f, 0x0d, - 0x68, 0x10, 0x90, 0x41, 0x6c, 0x4c, 0xae, 0xd1, 0xd9, 0x3d, 0x95, 0x6e, 0xec, 0xc9, 0xfe, 0x18, - 0x3e, 0x5a, 0xa0, 0x4b, 0xb9, 0xc5, 0xfe, 0x2d, 0x2c, 0x6f, 0x8b, 0xbd, 0xe5, 0x2b, 0x7f, 0x07, - 0xb5, 0xe3, 0x90, 0x7b, 0x34, 0x60, 0xc5, 0xd6, 0x48, 0x35, 0x1a, 0x89, 0x63, 0x8a, 0xfd, 0x9f, - 0x12, 0x54, 0xf7, 0x83, 0x70, 0xca, 0x19, 0x5a, 0x87, 0x66, 0x87, 0x06, 0x9c, 0x5c, 0xf1, 0x13, - 0x97, 0x9f, 0xeb, 0x25, 0xd2, 0x22, 0xf4, 0x19, 0xac, 0xec, 0xd0, 0xc1, 0x98, 0x44, 0x67, 0x9e, - 0x4f, 0x8e, 0xdc, 0x09, 0xd1, 0xc6, 0xdc, 0x90, 0xa2, 0xcf, 0x61, 0x75, 0x26, 0xd9, 0x0f, 0x7c, - 0x2f, 0x20, 0x66, 0x59, 0x22, 0xe7, 0xe4, 0xe8, 0x1d, 0x3c, 0xd4, 0x4b, 0xec, 0x90, 0x33, 0x2f, - 0xf0, 0xc4, 0xb6, 0xcc, 0x8a, 0x34, 0x64, 0xc5, 0x09, 0xfb, 0xce, 0x4c, 0x8a, 0xe7, 0x81, 0xe8, - 0x3d, 0xb4, 0xc4, 0x8a, 0x43, 0xfd, 0x85, 0x99, 0x4b, 0x32, 0x7a, 0xda, 0x79, 0x07, 0x2a, 0x0c, - 0x75, 0x32, 0x8c, 0xdd, 0x80, 0x47, 0xd7, 0x38, 0xab, 0xc5, 0x1a, 0x02, 0x9a, 0x07, 0x09, 0xdf, - 0x8f, 0xc9, 0x75, 0xec, 0xfb, 0x31, 0xb9, 0x46, 0xaf, 0x61, 0xe9, 0xc2, 0xf5, 0xa7, 0xa4, 0xd8, - 0xf3, 0x69, 0x55, 0x58, 0x11, 0xbe, 0x2b, 0xbd, 0x36, 0xec, 0xbf, 0x37, 0xf4, 0xe1, 0xea, 0xc3, - 0x40, 0xdf, 0xc4, 0x67, 0x21, 0xd7, 0x68, 0x6e, 0x3e, 0x29, 0x32, 0x03, 0xc7, 0xe7, 0xf6, 0xbd, - 0x88, 0x2e, 0x2f, 0xe0, 0xdd, 0x69, 0x30, 0xd0, 0x1b, 0xf9, 0x34, 0xef, 0xf6, 0x68, 0x18, 0x9e, - 0x31, 0xd0, 0x2b, 0xa8, 0x1c, 0x87, 0x9c, 0xc9, 0x03, 0x6a, 0x6e, 0x3e, 0x5b, 0xcc, 0xec, 0xd0, - 0xc9, 0x84, 0x06, 0x71, 0xf4, 0x48, 0x02, 0x5a, 0x83, 0xa5, 0x2d, 0xdf, 0xa7, 0x97, 0x66, 0x65, - 0xbd, 0xbc, 0xd1, 0xc0, 0x6a, 0x82, 0x7e, 0x05, 0xb5, 0x2d, 0xce, 0x09, 0x4b, 0xce, 0x22, 0xc7, - 0x08, 0x05, 0xc2, 0x31, 0x18, 0x1d, 0x43, 0x43, 0xfa, 0x62, 0x2b, 0x1a, 0x31, 0xb3, 0x2a, 0x99, - 0x5f, 0xdd, 0x1e, 0xc8, 0x4e, 0xc2, 0x51, 0xe7, 0x38, 0xd3, 0x81, 0x76, 0xa1, 0xd1, 0x71, 0x07, - 0xe7, 0xa4, 0x1b, 0xd1, 0x89, 0x59, 0x93, 0x0a, 0x7f, 0x99, 0x63, 0x9c, 0x80, 0x69, 0x85, 0x5a, - 0x4d, 0xc2, 0x44, 0x5b, 0x50, 0x93, 0x93, 0x53, 0x6a, 0xd6, 0xef, 0xa7, 0x24, 0xe6, 0x21, 0x1b, - 0x96, 0x3b, 0xa3, 0x88, 0x4e, 0xc3, 0x13, 0x37, 0x22, 0x01, 0x37, 0x1b, 0x32, 0x80, 0x32, 0x32, - 0xf4, 0x16, 0x6a, 0xbb, 0x57, 0x21, 0x8d, 0x38, 0x33, 0xa1, 0x28, 0x01, 0x2a, 0x90, 0x5e, 0x40, - 0x33, 0xd0, 0x27, 0x00, 0xbb, 0x57, 0x3c, 0x72, 0xf7, 0xa8, 0x70, 0x7b, 0x53, 0x1e, 0x47, 0x4a, - 0x82, 0xba, 0x50, 0x3d, 0x70, 0xfb, 0xc4, 0x67, 0xe6, 0xb2, 0xd4, 0xed, 0xdc, 0xc1, 0xb1, 0x8a, - 0xa0, 0x16, 0xd2, 0x6c, 0x91, 0x21, 0x8e, 0x08, 0xbf, 0xa4, 0xd1, 0xf8, 0x90, 0x0e, 0x89, 0xd9, - 0x52, 0x19, 0x22, 0x25, 0x42, 0xcf, 0xa1, 0x75, 0x44, 0x95, 0xf3, 0x3c, 0x9f, 0x93, 0xc8, 0x5c, - 0x91, 0x9b, 0xc9, 0x0a, 0x65, 0x3e, 0xf4, 0x5d, 0x7e, 0x46, 0xa3, 0x09, 0x33, 0x1f, 0x48, 0xc4, - 0x4c, 0x20, 0x22, 0xa8, 0x47, 0x06, 0x11, 0xe1, 0xcc, 0x5c, 0x2d, 0x8a, 0x20, 0x05, 0xc2, 0x31, - 0x18, 0x99, 0x50, 0xeb, 0x9d, 0x4f, 0x7a, 0xde, 0xef, 0x89, 0xf9, 0x70, 0xdd, 0xd8, 0x28, 0xe3, - 0x78, 0x8a, 0x5e, 0x42, 0xb9, 0xd7, 0xdb, 0x33, 0x91, 0xd4, 0xf6, 0x51, 0x8e, 0xb6, 0xde, 0x1e, - 0x16, 0x28, 0x84, 0xa0, 0x72, 0xea, 0x8e, 0x98, 0xf9, 0x73, 0xb9, 0x2f, 0x39, 0x46, 0x8f, 0xa1, - 0x7a, 0xea, 0x46, 0x23, 0xc2, 0xcd, 0x35, 0x69, 0xb3, 0x9e, 0xa1, 0x37, 0x50, 0x7b, 0xef, 0x7b, - 0x13, 0x8f, 0x33, 0xf3, 0x51, 0xd1, 0xc5, 0x53, 0xa0, 0xe3, 0x90, 0xe3, 0x18, 0x8f, 0xf6, 0x61, - 0xb9, 0x27, 0x0b, 0xf0, 0x89, 0x2c, 0xbb, 0xe6, 0x63, 0xc9, 0x7f, 0xe1, 0x88, 0x62, 0xeb, 0xc4, - 0xc5, 0x56, 0x70, 0xd3, 0x65, 0xda, 0x51, 0x60, 0x9c, 0xa1, 0x5a, 0xef, 0x60, 0x25, 0x7b, 0x0d, - 0x16, 0x64, 0xaa, 0xb5, 0x74, 0xa6, 0x6a, 0xa4, 0xb2, 0x90, 0xf5, 0x06, 0x9a, 0xa9, 0xb3, 0xbe, - 0x0f, 0xd5, 0xc6, 0xb0, 0x9c, 0xce, 0x6d, 0xc2, 0x75, 0xa9, 0xd2, 0x21, 0xc7, 0xc8, 0x01, 0x48, - 0x25, 0xf6, 0xd2, 0xc2, 0xc4, 0x9e, 0x42, 0xd8, 0xff, 0x34, 0xa0, 0x95, 0xc9, 0x36, 0xe2, 0x5c, - 0xa5, 0x79, 0x24, 0xd2, 0x8a, 0xe3, 0xa9, 0xb8, 0x58, 0x87, 0x84, 0xbb, 0x43, 0x97, 0xbb, 0x5d, - 0xcf, 0x8f, 0x37, 0x98, 0x91, 0x09, 0xb6, 0x0e, 0x3e, 0x99, 0xe1, 0xea, 0x38, 0x9e, 0xca, 0xdd, - 0x4e, 0x7d, 0x5f, 0x16, 0x9b, 0x3a, 0x96, 0x63, 0x75, 0x93, 0xc4, 0xa5, 0x3a, 0x99, 0xb2, 0x73, - 0x73, 0x49, 0x7e, 0x49, 0x49, 0x66, 0xdf, 0x0f, 0xa8, 0x3b, 0x34, 0xab, 0xe9, 0xef, 0x42, 0x22, - 0x02, 0xe5, 0xc0, 0x0b, 0xc6, 0x64, 0x68, 0xd6, 0xe4, 0x37, 0x3d, 0xb3, 0xff, 0x61, 0x40, 0x33, - 0x75, 0x75, 0x65, 0x90, 0x5d, 0x87, 0x24, 0xf6, 0x94, 0x18, 0xa3, 0x6d, 0x58, 0xda, 0xe2, 0x3c, - 0x12, 0x65, 0x5c, 0xc4, 0xe9, 0x17, 0xb7, 0x26, 0x00, 0x47, 0xc2, 0xd5, 0x15, 0x55, 0x54, 0x71, - 0x43, 0x77, 0x08, 0xe3, 0x5e, 0xe0, 0x4a, 0x77, 0xab, 0xa2, 0x9b, 0x16, 0x59, 0xaf, 0x01, 0x66, - 0xb4, 0x7b, 0x9d, 0xf6, 0x5f, 0x0d, 0x78, 0x38, 0x97, 0xe5, 0x16, 0x5a, 0xb2, 0x97, 0xb5, 0x64, - 0xf3, 0x8e, 0x19, 0x73, 0xde, 0x9e, 0xff, 0x63, 0xb7, 0x47, 0x50, 0x55, 0xa5, 0x65, 0xe1, 0x0e, - 0x2d, 0xa8, 0xef, 0x78, 0xcc, 0xed, 0xfb, 0x64, 0x28, 0xa9, 0x75, 0x9c, 0xcc, 0x65, 0x5d, 0x93, - 0xbb, 0x57, 0xde, 0x53, 0x13, 0x5b, 0xe5, 0x10, 0xb4, 0x02, 0xa5, 0xa4, 0xaf, 0x2c, 0xed, 0xef, - 0x08, 0xb0, 0x08, 0x73, 0x65, 0x6a, 0x03, 0xab, 0x89, 0xdd, 0x85, 0xaa, 0xca, 0x4a, 0x73, 0x78, - 0x0b, 0xea, 0x22, 0x2c, 0xe5, 0x35, 0x51, 0x7b, 0x4e, 0xe6, 0xc2, 0xbc, 0xdd, 0xe0, 0x42, 0x2f, - 0x2b, 0x86, 0xf6, 0xab, 0x54, 0x69, 0x17, 0x76, 0xc8, 0x9e, 0x4b, 0xdb, 0x21, 0x3b, 0xad, 0xc7, - 0x50, 0xed, 0xd2, 0x68, 0xe2, 0x72, 0xad, 0x4c, 0xcf, 0x6c, 0x1b, 0x56, 0xf6, 0x03, 0x16, 0x92, - 0x01, 0xcf, 0x6f, 0xc5, 0x8f, 0xe1, 0x41, 0x82, 0xd1, 0x4d, 0x78, 0xaa, 0x97, 0x34, 0xee, 0xdf, - 0x4b, 0xfe, 0xc5, 0x80, 0x46, 0x92, 0xe9, 0x50, 0x07, 0xaa, 0xf2, 0x34, 0xe2, 0x8e, 0xfe, 0xe5, - 0x2d, 0xa9, 0xd1, 0xf9, 0x20, 0xd1, 0xba, 0xe2, 0x28, 0xaa, 0xf5, 0x23, 0x34, 0x53, 0xe2, 0x05, - 0x01, 0xb0, 0x99, 0xed, 0xc0, 0x9e, 0x14, 0x2d, 0x92, 0x0e, 0x8f, 0x1d, 0xa8, 0x2a, 0xe1, 0x42, - 0xb7, 0x22, 0xa8, 0xec, 0xb9, 0x91, 0x0a, 0x8d, 0x32, 0x96, 0x63, 0x21, 0xeb, 0xd1, 0x33, 0x2e, - 0x8f, 0xa7, 0x8c, 0xe5, 0xd8, 0xfe, 0x9b, 0x01, 0x2d, 0xdd, 0x9e, 0x6b, 0x0f, 0x12, 0x58, 0x55, - 0x37, 0x94, 0x44, 0xb1, 0x4c, 0xdb, 0xff, 0xa6, 0xc0, 0x95, 0x31, 0xd4, 0xb9, 0xc9, 0x55, 0xde, - 0x98, 0x53, 0x69, 0x75, 0xe0, 0xd1, 0x42, 0xe8, 0xbd, 0xae, 0xc8, 0x0b, 0x78, 0x38, 0x7b, 0x78, - 0xe4, 0xc7, 0xc9, 0x1a, 0xa0, 0x34, 0x4c, 0x3f, 0x4c, 0x3e, 0x85, 0xa6, 0x78, 0xc8, 0xe5, 0xd3, - 0x6c, 0x58, 0x56, 0x00, 0xed, 0x19, 0x04, 0x95, 0x31, 0xb9, 0x56, 0xd1, 0xd0, 0xc0, 0x72, 0x6c, - 0xff, 0xd9, 0x10, 0xef, 0xb1, 0x70, 0xca, 0x0f, 0x09, 0x63, 0xee, 0x48, 0x04, 0x60, 0x65, 0x3f, - 0xf0, 0xb8, 0x8e, 0xbe, 0xcf, 0x0a, 0xfa, 0x5f, 0x01, 0xd3, 0xac, 0xbd, 0x9f, 0x61, 0xc9, 0x12, - 0xad, 0xec, 0x8e, 0xcb, 0x5d, 0x1d, 0x0b, 0x39, 0x1d, 0x94, 0x40, 0xa4, 0x88, 0x62, 0xba, 0x5d, - 0x13, 0x8f, 0xcf, 0x70, 0xca, 0xed, 0xe7, 0xb0, 0x7a, 0x53, 0xfb, 0x02, 0xd3, 0xbe, 0x86, 0x66, - 0x4a, 0x8b, 0xbc, 0xb7, 0xc7, 0x5d, 0x09, 0xa8, 0x63, 0x31, 0x14, 0xb6, 0x26, 0x1b, 0x59, 0x56, - 0x6b, 0xd8, 0x0f, 0xa0, 0x25, 0x55, 0x27, 0x1e, 0xfc, 0x43, 0x09, 0x6a, 0xb1, 0x8a, 0x57, 0x19, - 0xbb, 0x9f, 0xe6, 0xd9, 0x3d, 0x6f, 0xf2, 0xb7, 0x50, 0x49, 0x4a, 0x5f, 0x6e, 0xfb, 0xd1, 0x1d, - 0xa6, 0x68, 0xb2, 0x2a, 0x7e, 0x0f, 0x55, 0x4c, 0x98, 0x68, 0x95, 0x0a, 0xdb, 0x7e, 0x85, 0x99, - 0x91, 0x35, 0x49, 0xd0, 0x7b, 0xde, 0x28, 0x70, 0x7d, 0xfd, 0x52, 0xcb, 0xa1, 0x2b, 0x4c, 0x8a, - 0xae, 0x04, 0x33, 0x77, 0xff, 0xd1, 0x80, 0x66, 0xa1, 0xab, 0x8b, 0x9f, 0xce, 0x73, 0xcf, 0xf9, - 0xf2, 0xff, 0xf8, 0x9c, 0xff, 0x97, 0x91, 0x55, 0x24, 0xeb, 0xbc, 0xb8, 0x4f, 0x21, 0xf5, 0x02, - 0xae, 0x43, 0x36, 0x25, 0x11, 0x1b, 0xed, 0x4c, 0x86, 0x3a, 0xe9, 0x8b, 0xe1, 0x2c, 0x79, 0x97, - 0x75, 0xf2, 0x16, 0x41, 0xf0, 0x9e, 0x91, 0x48, 0xba, 0xa8, 0x81, 0xe5, 0x58, 0xe4, 0xeb, 0x23, - 0x2a, 0xa5, 0xaa, 0xb7, 0xd0, 0x33, 0xa9, 0xef, 0x52, 0x35, 0x14, 0x42, 0xdf, 0xa5, 0xac, 0x42, - 0x47, 0x54, 0xc8, 0x54, 0x23, 0xa1, 0x26, 0x02, 0x77, 0xca, 0xaf, 0xcd, 0xba, 0x0a, 0xb5, 0x53, - 0x7e, 0x2d, 0x0a, 0x0a, 0xa6, 0xbe, 0xdf, 0x77, 0x07, 0x63, 0xf9, 0xb0, 0xa8, 0xe3, 0x64, 0x2e, - 0x7a, 0x1f, 0xe1, 0x5d, 0xcf, 0xf5, 0x4d, 0x50, 0xbd, 0x8f, 0x9e, 0xda, 0x5b, 0xd0, 0x48, 0x82, - 0x42, 0xd4, 0xa8, 0xee, 0x50, 0x3a, 0xbd, 0x85, 0x4b, 0xdd, 0x61, 0x1c, 0xcf, 0xa5, 0xf9, 0x78, - 0x2e, 0xa7, 0xe2, 0xf9, 0x15, 0xb4, 0x32, 0xe1, 0x21, 0x40, 0x98, 0x5e, 0x32, 0xad, 0x48, 0x8e, - 0x85, 0xac, 0x43, 0x7d, 0xf5, 0xcf, 0x44, 0x0b, 0xcb, 0xb1, 0xfd, 0x0c, 0x5a, 0x99, 0xc0, 0x58, - 0x94, 0x81, 0xed, 0xa7, 0xd0, 0xea, 0x71, 0x97, 0x4f, 0x0b, 0xfe, 0x4a, 0xfa, 0xb7, 0x01, 0x2b, - 0x31, 0x46, 0xe7, 0x98, 0x6f, 0xa0, 0x7e, 0x41, 0x22, 0x4e, 0xae, 0x92, 0xaa, 0x63, 0xce, 0x37, - 0xd4, 0x1f, 0x24, 0x02, 0x27, 0x48, 0xf4, 0x1d, 0xd4, 0x99, 0xd4, 0x43, 0xe2, 0x8e, 0xe5, 0x93, - 0x3c, 0x96, 0x5e, 0x2f, 0xc1, 0xa3, 0x36, 0x54, 0x7c, 0x3a, 0x62, 0xf2, 0xdc, 0x9b, 0x9b, 0x1f, - 0xe7, 0xf1, 0x0e, 0xe8, 0x08, 0x4b, 0x20, 0x7a, 0x0b, 0xf5, 0x4b, 0x37, 0x0a, 0xbc, 0x60, 0xc4, - 0xe4, 0xc3, 0x59, 0x5c, 0xda, 0x1c, 0xd2, 0x8f, 0x0a, 0x87, 0x13, 0x82, 0xdd, 0x12, 0xd7, 0xe5, - 0x8c, 0x6a, 0x9f, 0xd8, 0xbf, 0x16, 0x51, 0x2b, 0xa6, 0xda, 0xfc, 0x7d, 0x68, 0xa9, 0xc8, 0xff, - 0x40, 0x22, 0x26, 0xfa, 0x3f, 0xa3, 0xe8, 0x76, 0x6e, 0xa7, 0xa1, 0x38, 0xcb, 0xb4, 0x7f, 0xd2, - 0x85, 0x2d, 0x16, 0x88, 0x58, 0x0a, 0xdd, 0xc1, 0xd8, 0x1d, 0xc5, 0xe7, 0x14, 0x4f, 0xc5, 0x97, - 0x0b, 0xbd, 0x9e, 0xba, 0xa0, 0xf1, 0x54, 0xc4, 0x66, 0x44, 0x2e, 0x3c, 0x36, 0x6b, 0x45, 0x93, - 0xf9, 0xe6, 0x9f, 0x6a, 0x00, 0x9d, 0x64, 0x3f, 0xe8, 0x04, 0x96, 0xe4, 0x7a, 0xc8, 0x2e, 0x2c, - 0x93, 0xd2, 0x6e, 0xeb, 0xd9, 0x1d, 0x4a, 0x29, 0xfa, 0x20, 0x82, 0x5f, 0xb6, 0x37, 0xe8, 0x79, - 0x5e, 0x42, 0x48, 0x77, 0x48, 0xd6, 0x8b, 0x5b, 0x50, 0x5a, 0xef, 0x7b, 0xa8, 0xaa, 0x28, 0x40, - 0x79, 0x59, 0x2f, 0x1d, 0xb7, 0xd6, 0xf3, 0x62, 0x90, 0x52, 0xfa, 0xa5, 0x81, 0xb0, 0xce, 0x89, - 0xc8, 0x2e, 0x28, 0x7a, 0xfa, 0xc6, 0xe4, 0x39, 0x20, 0x53, 0x5f, 0x36, 0x0c, 0xf4, 0x03, 0x54, - 0x55, 0x56, 0x43, 0xbf, 0x58, 0x4c, 0x88, 0xf5, 0x15, 0x7f, 0xde, 0x30, 0xbe, 0x34, 0xd0, 0x21, - 0x54, 0x44, 0x39, 0x47, 0x39, 0xb5, 0x29, 0xd5, 0x0b, 0x58, 0x76, 0x11, 0x44, 0x7b, 0xf1, 0x27, - 0x80, 0x59, 0x53, 0x81, 0x72, 0xfe, 0x53, 0x99, 0xeb, 0x4e, 0xac, 0x8d, 0xdb, 0x81, 0x7a, 0x81, - 0x43, 0x51, 0x51, 0xcf, 0x28, 0xca, 0xad, 0xa5, 0xc9, 0x35, 0xb2, 0xec, 0x22, 0x88, 0x56, 0x77, - 0x0e, 0xad, 0xcc, 0xff, 0xd6, 0xe8, 0xf3, 0x7c, 0x23, 0x6f, 0xfe, 0x0d, 0x6e, 0xbd, 0xbc, 0x13, - 0x56, 0xaf, 0xc4, 0xd3, 0x5d, 0x99, 0xfe, 0x8c, 0x9c, 0xdb, 0xec, 0xce, 0xfe, 0x07, 0x6d, 0xb5, - 0xef, 0x8c, 0x57, 0xab, 0x6e, 0x57, 0x7e, 0x53, 0x0a, 0xfb, 0xfd, 0xaa, 0xfc, 0x3b, 0xff, 0xeb, - 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x09, 0xb4, 0x4e, 0xa7, 0x9a, 0x18, 0x00, 0x00, + 0x15, 0x2e, 0x48, 0x8a, 0x3f, 0x87, 0xa2, 0x2c, 0x6f, 0x65, 0x0f, 0xc2, 0xb8, 0x89, 0x0c, 0xdb, + 0x29, 0x27, 0xce, 0x80, 0x89, 0x92, 0xd4, 0x76, 0xec, 0x5c, 0x48, 0x94, 0x38, 0x52, 0x46, 0x7f, + 0xb3, 0x94, 0x9d, 0x69, 0x2f, 0x9a, 0x01, 0xc9, 0x15, 0x85, 0x21, 0x88, 0x45, 0xb1, 0x4b, 0x49, + 0xec, 0x55, 0x6f, 0x7a, 0xd7, 0xe9, 0x4b, 0xf4, 0xaa, 0xd3, 0x47, 0xe8, 0x4c, 0x67, 0xfa, 0x0c, + 0x7d, 0x8f, 0x4e, 0x1f, 0xa1, 0xb3, 0x3f, 0x00, 0x01, 0x91, 0x80, 0xa4, 0xf6, 0x8a, 0xbb, 0x07, + 0xdf, 0x77, 0x76, 0xcf, 0xd9, 0xb3, 0xe7, 0x9c, 0x25, 0xac, 0x0f, 0xa8, 0xcf, 0x43, 0xea, 0x79, + 0x24, 0xb4, 0x83, 0x90, 0x72, 0x8a, 0x36, 0xfa, 0x53, 0xd7, 0x1b, 0x5e, 0xdb, 0x89, 0x0f, 0x97, + 0x5f, 0x35, 0xdf, 0x8e, 0x5c, 0x7e, 0x31, 0xed, 0xdb, 0x03, 0x3a, 0x69, 0x4f, 0x68, 0x7f, 0xd6, + 0x96, 0xa8, 0xb1, 0xcb, 0xdb, 0x4e, 0xe0, 0xb6, 0x19, 0x09, 0x2f, 0xdd, 0x01, 0x61, 0x6d, 0x4d, + 0x8a, 0x7e, 0x95, 0xca, 0xe6, 0xb7, 0x99, 0x64, 0x46, 0xa7, 0xe1, 0x80, 0x04, 0xd4, 0x73, 0x07, + 0xb3, 0x76, 0xd0, 0x6f, 0xab, 0x91, 0xa6, 0x7d, 0x91, 0x43, 0xf3, 0x2e, 0x49, 0x28, 0x08, 0x34, + 0x60, 0x0a, 0x6d, 0xb5, 0x60, 0xe3, 0xd0, 0x65, 0xfc, 0x34, 0xa4, 0x03, 0xc2, 0x18, 0x61, 0x98, + 0xfc, 0x6e, 0x4a, 0x18, 0x47, 0xeb, 0x50, 0xc4, 0xe4, 0xdc, 0x34, 0x36, 0x8d, 0x56, 0x0d, 0x8b, + 0xa1, 0x75, 0x0a, 0x8f, 0x6e, 0x20, 0x59, 0x40, 0x7d, 0x46, 0xd0, 0x2b, 0x58, 0x39, 0xf0, 0xcf, + 0x29, 0x33, 0x8d, 0xcd, 0x62, 0xab, 0xbe, 0xf5, 0xd4, 0x5e, 0xe6, 0x0a, 0x5b, 0xf3, 0x04, 0x12, + 0x2b, 0xbc, 0xc5, 0xa0, 0x9e, 0x90, 0xa2, 0x27, 0x50, 0x8b, 0xa6, 0xbb, 0x7a, 0xe1, 0xb9, 0x00, + 0x75, 0x61, 0xf5, 0xc0, 0xbf, 0xa4, 0x63, 0xd2, 0xa1, 0xfe, 0xb9, 0x3b, 0x32, 0x0b, 0x9b, 0x46, + 0xab, 0xbe, 0x65, 0x2d, 0x5f, 0x2c, 0x89, 0xc4, 0x29, 0x9e, 0xf5, 0x03, 0x98, 0xbb, 0x2e, 0x1b, + 0x50, 0xdf, 0x27, 0x83, 0xc8, 0x98, 0x4c, 0xa3, 0xd3, 0x7b, 0x2a, 0xdc, 0xd8, 0x93, 0xf5, 0x31, + 0x7c, 0xb4, 0x44, 0x97, 0x72, 0x8b, 0xf5, 0x5b, 0x58, 0xdd, 0x11, 0x7b, 0xcb, 0x56, 0xfe, 0x0e, + 0x2a, 0x27, 0x01, 0x77, 0xa9, 0xcf, 0xf2, 0xad, 0x91, 0x6a, 0x34, 0x12, 0x47, 0x14, 0xeb, 0x2f, + 0x45, 0x28, 0x1f, 0xf8, 0xc1, 0x94, 0x33, 0xb4, 0x09, 0xf5, 0x0e, 0xf5, 0x39, 0xb9, 0xe6, 0xa7, + 0x0e, 0xbf, 0xd0, 0x4b, 0x24, 0x45, 0xa8, 0x05, 0x0f, 0x12, 0xd3, 0x7d, 0x87, 0x5d, 0x68, 0x6b, + 0x6e, 0x8a, 0xd1, 0x67, 0xb0, 0xb6, 0x4b, 0x07, 0x63, 0x12, 0x9e, 0xbb, 0x1e, 0x39, 0x76, 0x26, + 0xc4, 0x2c, 0x4a, 0xe0, 0x0d, 0x29, 0xfa, 0x1c, 0xd6, 0xe7, 0x92, 0x03, 0xdf, 0x73, 0x7d, 0x62, + 0x96, 0x24, 0x72, 0x41, 0x8e, 0xde, 0xc1, 0x43, 0xbd, 0xcc, 0x2e, 0x39, 0x77, 0x7d, 0x57, 0x18, + 0x60, 0xae, 0x48, 0x93, 0xd7, 0xec, 0xa0, 0x6f, 0xcf, 0xa5, 0x78, 0x11, 0x88, 0xde, 0x43, 0x43, + 0xac, 0x38, 0xd4, 0x5f, 0x98, 0x59, 0x96, 0x71, 0xd6, 0xce, 0x3a, 0x7a, 0xe1, 0x12, 0x3b, 0xc5, + 0xd8, 0xf3, 0x79, 0x38, 0xc3, 0x69, 0x2d, 0xcd, 0x21, 0xa0, 0x45, 0x90, 0x38, 0xa5, 0x31, 0x99, + 0x45, 0xa7, 0x34, 0x26, 0x33, 0xf4, 0x1a, 0x56, 0x2e, 0x1d, 0x6f, 0x4a, 0xf2, 0xcf, 0x28, 0xa9, + 0x0a, 0x2b, 0xc2, 0x77, 0x85, 0xd7, 0x86, 0xf5, 0x8f, 0x9a, 0x0e, 0x03, 0x7d, 0x6c, 0xe8, 0x9b, + 0xe8, 0xd4, 0xe4, 0x1a, 0xf5, 0xad, 0x27, 0x79, 0x66, 0xe0, 0xe8, 0x84, 0xbf, 0x17, 0x71, 0xe8, + 0xfa, 0xbc, 0x3b, 0xf5, 0x07, 0x7a, 0x23, 0x9f, 0x66, 0xdd, 0x33, 0x0d, 0xc3, 0x73, 0x06, 0x7a, + 0x05, 0xa5, 0x93, 0x80, 0x33, 0x79, 0x94, 0xf5, 0xad, 0x67, 0xcb, 0x99, 0x1d, 0x3a, 0x99, 0x50, + 0x3f, 0x8a, 0x33, 0x49, 0x40, 0x1b, 0xb0, 0xb2, 0xed, 0x79, 0xf4, 0xca, 0x2c, 0x6d, 0x16, 0x5b, + 0x35, 0xac, 0x26, 0xe8, 0x57, 0x50, 0xd9, 0xe6, 0x9c, 0x30, 0xce, 0xcc, 0x15, 0x79, 0x16, 0x19, + 0x46, 0x28, 0x10, 0x8e, 0xc0, 0xe8, 0x04, 0x6a, 0xd2, 0x17, 0xdb, 0xe1, 0x28, 0x3a, 0xc5, 0xaf, + 0x6e, 0x0f, 0x79, 0x3b, 0xe6, 0xa8, 0x73, 0x9c, 0xeb, 0x40, 0x7b, 0x50, 0xeb, 0x38, 0x83, 0x0b, + 0xd2, 0x0d, 0xe9, 0xc4, 0xac, 0x48, 0x85, 0xbf, 0xcc, 0x30, 0x4e, 0xc0, 0xb4, 0x42, 0xad, 0x26, + 0x66, 0xa2, 0x6d, 0xa8, 0xc8, 0xc9, 0x19, 0x35, 0xab, 0xf7, 0x53, 0x12, 0xf1, 0x90, 0x05, 0xab, + 0x9d, 0x51, 0x48, 0xa7, 0xc1, 0xa9, 0x13, 0x12, 0x9f, 0x9b, 0x35, 0x19, 0x40, 0x29, 0x19, 0x7a, + 0x0b, 0x95, 0xbd, 0xeb, 0x80, 0x86, 0x9c, 0x99, 0x90, 0x97, 0x2a, 0x15, 0x48, 0x2f, 0xa0, 0x19, + 0xe8, 0x13, 0x80, 0xbd, 0x6b, 0x1e, 0x3a, 0xfb, 0x54, 0xb8, 0xbd, 0x2e, 0x8f, 0x23, 0x21, 0x41, + 0x5d, 0x28, 0x1f, 0x3a, 0x7d, 0xe2, 0x31, 0x73, 0x55, 0xea, 0xb6, 0xef, 0xe0, 0x58, 0x45, 0x50, + 0x0b, 0x69, 0xb6, 0xc8, 0x25, 0xc7, 0x84, 0x5f, 0xd1, 0x70, 0x7c, 0x44, 0x87, 0xc4, 0x6c, 0xa8, + 0x5c, 0x92, 0x10, 0xa1, 0xe7, 0xd0, 0x38, 0xa6, 0xca, 0x79, 0xae, 0xc7, 0x49, 0x68, 0xae, 0xc9, + 0xcd, 0xa4, 0x85, 0x32, 0x73, 0x7a, 0x0e, 0x3f, 0xa7, 0xe1, 0x84, 0x99, 0x0f, 0x24, 0x62, 0x2e, + 0x10, 0x11, 0xd4, 0x23, 0x83, 0x90, 0x70, 0x66, 0xae, 0xe7, 0x45, 0x90, 0x02, 0xe1, 0x08, 0x8c, + 0x4c, 0xa8, 0xf4, 0x2e, 0x26, 0x3d, 0xf7, 0xf7, 0xc4, 0x7c, 0xb8, 0x69, 0xb4, 0x8a, 0x38, 0x9a, + 0xa2, 0x97, 0x50, 0xec, 0xf5, 0xf6, 0x4d, 0x24, 0xb5, 0x7d, 0x94, 0xa1, 0xad, 0xb7, 0x8f, 0x05, + 0x0a, 0x21, 0x28, 0x9d, 0x39, 0x23, 0x66, 0xfe, 0x5c, 0xee, 0x4b, 0x8e, 0xd1, 0x63, 0x28, 0x9f, + 0x39, 0xe1, 0x88, 0x70, 0x73, 0x43, 0xda, 0xac, 0x67, 0xe8, 0x0d, 0x54, 0xde, 0x7b, 0xee, 0xc4, + 0xe5, 0xcc, 0x7c, 0x94, 0x77, 0xf1, 0x14, 0xe8, 0x24, 0xe0, 0x38, 0xc2, 0xa3, 0x03, 0x58, 0xed, + 0xc9, 0x52, 0x7d, 0x2a, 0x0b, 0xb4, 0xf9, 0x58, 0xf2, 0x5f, 0xd8, 0xa2, 0x2c, 0xdb, 0x51, 0x59, + 0x16, 0xdc, 0x64, 0x41, 0xb7, 0x15, 0x18, 0xa7, 0xa8, 0xcd, 0x77, 0xb0, 0x96, 0xbe, 0x06, 0x4b, + 0x32, 0xd5, 0x46, 0x32, 0x53, 0xd5, 0x12, 0x59, 0xa8, 0xf9, 0x06, 0xea, 0x89, 0xb3, 0xbe, 0x0f, + 0xd5, 0xc2, 0xb0, 0x9a, 0xcc, 0x6d, 0xc2, 0x75, 0x89, 0x22, 0x23, 0xc7, 0xc8, 0x06, 0x48, 0x24, + 0xf6, 0xc2, 0xd2, 0xc4, 0x9e, 0x40, 0x58, 0xff, 0x32, 0xa0, 0x91, 0xca, 0x36, 0xe2, 0x5c, 0xa5, + 0x79, 0x24, 0xd4, 0x8a, 0xa3, 0xa9, 0xb8, 0x58, 0x47, 0x84, 0x3b, 0x43, 0x87, 0x3b, 0x5d, 0xd7, + 0x8b, 0x36, 0x98, 0x92, 0x09, 0xb6, 0x0e, 0x3e, 0x99, 0xe1, 0xaa, 0x38, 0x9a, 0xca, 0xdd, 0x4e, + 0x3d, 0x4f, 0x56, 0xa6, 0x2a, 0x96, 0x63, 0x75, 0x93, 0xc4, 0xa5, 0x3a, 0x9d, 0xb2, 0x0b, 0x59, + 0x86, 0xaa, 0x38, 0x21, 0x99, 0x7f, 0x3f, 0xa4, 0xce, 0xd0, 0x2c, 0x27, 0xbf, 0x0b, 0x89, 0x08, + 0x94, 0x43, 0xd7, 0x1f, 0x93, 0xa1, 0x59, 0x91, 0xdf, 0xf4, 0xcc, 0xfa, 0xa7, 0x01, 0xf5, 0xc4, + 0xd5, 0x95, 0x41, 0x36, 0x0b, 0x48, 0xe4, 0x29, 0x31, 0x46, 0x3b, 0xb0, 0xb2, 0xcd, 0x79, 0x28, + 0x0a, 0xbe, 0x88, 0xd3, 0x2f, 0x6e, 0x4d, 0x00, 0xb6, 0x84, 0xab, 0x2b, 0xaa, 0xa8, 0xe2, 0x86, + 0xee, 0x12, 0xc6, 0x5d, 0xdf, 0x91, 0xee, 0x56, 0xe5, 0x39, 0x29, 0x6a, 0xbe, 0x06, 0x98, 0xd3, + 0xee, 0x75, 0xda, 0x7f, 0x33, 0xe0, 0xe1, 0x42, 0x96, 0x5b, 0x6a, 0xc9, 0x7e, 0xda, 0x92, 0xad, + 0x3b, 0x66, 0xcc, 0x45, 0x7b, 0xfe, 0x8f, 0xdd, 0x1e, 0x43, 0x59, 0x95, 0x96, 0xa5, 0x3b, 0x6c, + 0x42, 0x75, 0xd7, 0x65, 0x4e, 0xdf, 0x23, 0x43, 0x49, 0xad, 0xe2, 0x78, 0x2e, 0xeb, 0x9a, 0xdc, + 0xbd, 0xf2, 0x9e, 0x9a, 0x58, 0x2a, 0x87, 0xa0, 0x35, 0x28, 0xc4, 0x1d, 0x68, 0xe1, 0x60, 0x57, + 0x80, 0x45, 0x98, 0x2b, 0x53, 0x6b, 0x58, 0x4d, 0xac, 0x2e, 0x94, 0x55, 0x56, 0x5a, 0xc0, 0x37, + 0xa1, 0x2a, 0xc2, 0x52, 0x5e, 0x13, 0xb5, 0xe7, 0x78, 0x2e, 0xcc, 0xdb, 0xf3, 0x2f, 0xf5, 0xb2, + 0x62, 0x68, 0xbd, 0x4a, 0x94, 0x76, 0x61, 0x87, 0xec, 0xb9, 0xb4, 0x1d, 0xb2, 0xd3, 0x7a, 0x0c, + 0xe5, 0x2e, 0x0d, 0x27, 0x0e, 0xd7, 0xca, 0xf4, 0xcc, 0xb2, 0x60, 0xed, 0xc0, 0x67, 0x01, 0x19, + 0xf0, 0xec, 0xa6, 0xfd, 0x04, 0x1e, 0xc4, 0x18, 0xdd, 0xae, 0x27, 0xba, 0x4e, 0xe3, 0xfe, 0x5d, + 0xe7, 0x5f, 0x0d, 0xa8, 0xc5, 0x99, 0x0e, 0x75, 0xa0, 0x2c, 0x4f, 0x23, 0xea, 0xfd, 0x5f, 0xde, + 0x92, 0x1a, 0xed, 0x0f, 0x12, 0xad, 0x2b, 0x8e, 0xa2, 0x36, 0x7f, 0x84, 0x7a, 0x42, 0xbc, 0x24, + 0x00, 0xb6, 0xd2, 0x1d, 0xd8, 0x93, 0xbc, 0x45, 0x92, 0xe1, 0xb1, 0x0b, 0x65, 0x25, 0x5c, 0xea, + 0x56, 0x04, 0xa5, 0x7d, 0x27, 0x54, 0xa1, 0x51, 0xc4, 0x72, 0x2c, 0x64, 0x3d, 0x7a, 0xce, 0xe5, + 0xf1, 0x14, 0xb1, 0x1c, 0x5b, 0x7f, 0x37, 0xa0, 0xa1, 0x1b, 0x79, 0xed, 0x41, 0x02, 0xeb, 0xea, + 0x86, 0x92, 0x30, 0x92, 0x69, 0xfb, 0xdf, 0xe4, 0xb8, 0x32, 0x82, 0xda, 0x37, 0xb9, 0xca, 0x1b, + 0x0b, 0x2a, 0x9b, 0x1d, 0x78, 0xb4, 0x14, 0x7a, 0xaf, 0x2b, 0xf2, 0x02, 0x1e, 0xce, 0x9f, 0x28, + 0xd9, 0x71, 0xb2, 0x01, 0x28, 0x09, 0xd3, 0x4f, 0x98, 0x4f, 0xa1, 0x2e, 0x9e, 0x7c, 0xd9, 0x34, + 0x0b, 0x56, 0x15, 0x40, 0x7b, 0x06, 0x41, 0x69, 0x4c, 0x66, 0x2a, 0x1a, 0x6a, 0x58, 0x8e, 0xad, + 0x3f, 0x1b, 0xe2, 0xe5, 0x16, 0x4c, 0xf9, 0x11, 0x61, 0xcc, 0x19, 0x89, 0x00, 0x2c, 0x1d, 0xf8, + 0x2e, 0xd7, 0xd1, 0xf7, 0x59, 0x4e, 0xff, 0x2b, 0x60, 0x9a, 0xb5, 0xff, 0x33, 0x2c, 0x59, 0xa2, + 0x95, 0xdd, 0x75, 0xb8, 0xa3, 0x63, 0x21, 0xa3, 0x83, 0x12, 0x88, 0x04, 0x51, 0x4c, 0x77, 0x2a, + 0xe2, 0x99, 0x1a, 0x4c, 0xb9, 0xf5, 0x1c, 0xd6, 0x6f, 0x6a, 0x5f, 0x62, 0xda, 0xd7, 0x50, 0x4f, + 0x68, 0x91, 0xf7, 0xf6, 0xa4, 0x2b, 0x01, 0x55, 0x2c, 0x86, 0xc2, 0xd6, 0x78, 0x23, 0xab, 0x6a, + 0x0d, 0xeb, 0x01, 0x34, 0xa4, 0xea, 0xd8, 0x83, 0x7f, 0x28, 0x40, 0x25, 0x52, 0xf1, 0x2a, 0x65, + 0xf7, 0xd3, 0x2c, 0xbb, 0x17, 0x4d, 0xfe, 0x16, 0x4a, 0x71, 0xe9, 0xcb, 0x6c, 0x3f, 0xba, 0xc3, + 0x04, 0x4d, 0x56, 0xc5, 0xef, 0xa1, 0x8c, 0x09, 0x13, 0xad, 0x52, 0x6e, 0xdb, 0xaf, 0x30, 0x73, + 0xb2, 0x26, 0x09, 0x7a, 0xcf, 0x1d, 0xf9, 0x8e, 0x2a, 0x9e, 0x99, 0x74, 0x85, 0x49, 0xd0, 0x95, + 0x60, 0xee, 0xee, 0x3f, 0x1a, 0x50, 0xcf, 0x75, 0x75, 0xfe, 0x23, 0x7b, 0xe1, 0xe1, 0x5f, 0xfc, + 0x1f, 0x1f, 0xfe, 0xff, 0x36, 0xd2, 0x8a, 0x64, 0x9d, 0x17, 0xf7, 0x29, 0xa0, 0xae, 0xcf, 0x75, + 0xc8, 0x26, 0x24, 0x62, 0xa3, 0x9d, 0xc9, 0x50, 0x27, 0x7d, 0x31, 0x9c, 0x27, 0xef, 0xa2, 0x4e, + 0xde, 0x22, 0x08, 0xde, 0x33, 0x12, 0xea, 0x97, 0xaf, 0x1c, 0x8b, 0x7c, 0x7d, 0x4c, 0xa5, 0x54, + 0xf5, 0x16, 0x7a, 0x26, 0xf5, 0x5d, 0xa9, 0x86, 0x42, 0xe8, 0xbb, 0x92, 0x55, 0xe8, 0x98, 0x0a, + 0x99, 0x6a, 0x24, 0xd4, 0x44, 0xe0, 0xce, 0xf8, 0xcc, 0xac, 0xaa, 0x50, 0x3b, 0xe3, 0x33, 0x51, + 0x50, 0x30, 0xf5, 0xbc, 0xbe, 0x33, 0x18, 0xcb, 0x87, 0x45, 0x15, 0xc7, 0x73, 0xd1, 0xfb, 0x08, + 0xef, 0xba, 0x8e, 0x67, 0x82, 0xea, 0x7d, 0xf4, 0xd4, 0xda, 0x86, 0x5a, 0x1c, 0x14, 0xa2, 0x46, + 0x75, 0x87, 0xd2, 0xe9, 0x0d, 0x5c, 0xe8, 0x0e, 0xa3, 0x78, 0x2e, 0x2c, 0xc6, 0x73, 0x31, 0x11, + 0xcf, 0xaf, 0xa0, 0x91, 0x0a, 0x0f, 0x01, 0xc2, 0xf4, 0x8a, 0x69, 0x45, 0x72, 0x2c, 0x64, 0x1d, + 0xea, 0xa9, 0xff, 0x30, 0x1a, 0x58, 0x8e, 0xad, 0x67, 0xd0, 0x48, 0x05, 0xc6, 0xb2, 0x0c, 0x6c, + 0x3d, 0x85, 0x46, 0x8f, 0x3b, 0x7c, 0x9a, 0xf3, 0xa7, 0xd3, 0x7f, 0x0c, 0x58, 0x8b, 0x30, 0x3a, + 0xc7, 0x7c, 0x03, 0xd5, 0x4b, 0x12, 0x72, 0x72, 0x1d, 0x57, 0x1d, 0x73, 0xb1, 0xa1, 0xfe, 0x20, + 0x11, 0x38, 0x46, 0xa2, 0xef, 0xa0, 0xca, 0xa4, 0x1e, 0x12, 0x75, 0x2c, 0x9f, 0x64, 0xb1, 0xf4, + 0x7a, 0x31, 0x1e, 0xb5, 0xa1, 0xe4, 0xd1, 0x11, 0x93, 0xe7, 0x5e, 0xdf, 0xfa, 0x38, 0x8b, 0x77, + 0x48, 0x47, 0x58, 0x02, 0xd1, 0x5b, 0xa8, 0x5e, 0x39, 0xa1, 0xef, 0xfa, 0x23, 0x26, 0x1f, 0xce, + 0xe2, 0xd2, 0x66, 0x90, 0x7e, 0x54, 0x38, 0x1c, 0x13, 0xac, 0x86, 0xb8, 0x2e, 0xe7, 0x54, 0xfb, + 0xc4, 0xfa, 0xb5, 0x88, 0x5a, 0x31, 0xd5, 0xe6, 0x1f, 0x40, 0x43, 0x45, 0xfe, 0x07, 0x12, 0x32, + 0xd1, 0xff, 0x19, 0x79, 0xb7, 0x73, 0x27, 0x09, 0xc5, 0x69, 0xa6, 0xf5, 0x93, 0x2e, 0x6c, 0x91, + 0x40, 0xc4, 0x52, 0xe0, 0x0c, 0xc6, 0xce, 0x28, 0x3a, 0xa7, 0x68, 0x2a, 0xbe, 0x5c, 0xea, 0xf5, + 0xd4, 0x05, 0x8d, 0xa6, 0x22, 0x36, 0x43, 0x72, 0xe9, 0xb2, 0x79, 0x2b, 0x1a, 0xcf, 0xb7, 0xfe, + 0x54, 0x01, 0xe8, 0xc4, 0xfb, 0x41, 0xa7, 0xb0, 0x22, 0xd7, 0x43, 0x56, 0x6e, 0x99, 0x94, 0x76, + 0x37, 0x9f, 0xdd, 0xa1, 0x94, 0xa2, 0x0f, 0x22, 0xf8, 0x65, 0x7b, 0x83, 0x9e, 0x67, 0x25, 0x84, + 0x64, 0x87, 0xd4, 0x7c, 0x71, 0x0b, 0x4a, 0xeb, 0x7d, 0x0f, 0x65, 0x15, 0x05, 0x28, 0x2b, 0xeb, + 0x25, 0xe3, 0xb6, 0xf9, 0x3c, 0x1f, 0xa4, 0x94, 0x7e, 0x69, 0x20, 0xac, 0x73, 0x22, 0xb2, 0x72, + 0x8a, 0x9e, 0xbe, 0x31, 0x59, 0x0e, 0x48, 0xd5, 0x97, 0x96, 0x81, 0x7e, 0x80, 0xb2, 0xca, 0x6a, + 0xe8, 0x17, 0xcb, 0x09, 0x91, 0xbe, 0xfc, 0xcf, 0x2d, 0xe3, 0x4b, 0x03, 0x1d, 0x41, 0x49, 0x94, + 0x73, 0x94, 0x51, 0x9b, 0x12, 0xbd, 0x40, 0xd3, 0xca, 0x83, 0x68, 0x2f, 0xfe, 0x04, 0x30, 0x6f, + 0x2a, 0x50, 0xc6, 0x7f, 0x2a, 0x0b, 0xdd, 0x49, 0xb3, 0x75, 0x3b, 0x50, 0x2f, 0x70, 0x24, 0x2a, + 0xea, 0x39, 0x45, 0x99, 0xb5, 0x34, 0xbe, 0x46, 0x4d, 0x2b, 0x0f, 0xa2, 0xd5, 0x5d, 0x40, 0x23, + 0xf5, 0x0f, 0x37, 0xfa, 0x3c, 0xdb, 0xc8, 0x9b, 0x7f, 0x98, 0x37, 0x5f, 0xde, 0x09, 0xab, 0x57, + 0xe2, 0xc9, 0xae, 0x4c, 0x7f, 0x46, 0xf6, 0x6d, 0x76, 0xa7, 0xff, 0xad, 0x6e, 0xb6, 0xef, 0x8c, + 0x57, 0xab, 0xee, 0x94, 0x7e, 0x53, 0x08, 0xfa, 0xfd, 0xb2, 0xfc, 0xe3, 0xff, 0xeb, 0xff, 0x06, + 0x00, 0x00, 0xff, 0xff, 0x6e, 0xde, 0x0e, 0xdf, 0xc4, 0x18, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/controller/pb/controller.proto b/controller/pb/controller.proto index 6156e4ddf5ba..f25ef748b84e 100644 --- a/controller/pb/controller.proto +++ b/controller/pb/controller.proto @@ -49,10 +49,11 @@ message BuildRequest { message Inputs { string ContextPath = 1; - string DockerfileName = 2; - string DockerfileInline = 3; - pb.Definition ContextDefinition = 4; - map NamedContexts = 5; + string ContextPathHash = 2; + string DockerfileName = 3; + string DockerfileInline = 4; + pb.Definition ContextDefinition = 5; + map NamedContexts = 6; // io.Reader InStream = ???; } From 73b4e04211dedc8b92e62caf15e9de43dd60b0a8 Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Thu, 1 Jun 2023 13:36:39 +0200 Subject: [PATCH 4/5] controller: remove MetadataFile from CommonOptions Signed-off-by: CrazyMax --- commands/bake.go | 17 +- commands/build.go | 19 ++- controller/pb/controller.pb.go | 277 ++++++++++++++++----------------- controller/pb/controller.proto | 11 +- 4 files changed, 157 insertions(+), 167 deletions(-) diff --git a/commands/bake.go b/commands/bake.go index 553fb09bdd73..a1a14a01f9dd 100644 --- a/commands/bake.go +++ b/commands/bake.go @@ -25,11 +25,12 @@ import ( ) type bakeOptions struct { - files []string - overrides []string - printOnly bool - sbom string - provenance string + files []string + overrides []string + printOnly bool + sbom string + provenance string + metadataFile string controllerapi.CommonOptions //control.ControlOptions @@ -212,12 +213,12 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com return wrapBuildError(err, true) } - if len(in.MetadataFile) > 0 { + if len(in.metadataFile) > 0 { dt := make(map[string]interface{}) for t, r := range resp { dt[t] = decodeExporterResponse(r.ExporterResponse) } - if err := writeMetadataFile(in.MetadataFile, dt); err != nil { + if err := writeMetadataFile(in.metadataFile, dt); err != nil { return err } } @@ -242,7 +243,7 @@ func bakeCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command { cFlags.pull = nil } options.Builder = rootOpts.builder - options.MetadataFile = cFlags.metadataFile + options.metadataFile = cFlags.metadataFile // Other common flags (noCache, pull and progress) are processed in runBake function. return runBake(dockerCli, args, options, cFlags) }, diff --git a/commands/build.go b/commands/build.go index 227ab18a60a0..cd5bd52a66fb 100644 --- a/commands/build.go +++ b/commands/build.go @@ -63,6 +63,7 @@ type buildOptions struct { dockerfileName string extraHosts []string imageIDFile string + metadataFile string labels []string networkMode string noCacheFilter []string @@ -75,17 +76,15 @@ type buildOptions struct { tags []string target string ulimits *dockeropts.UlimitOpt + attests []string + sbom string + provenance string + progress string + quiet bool invoke *invokeConfig noBuild bool - attests []string - sbom string - provenance string - - progress string - quiet bool - controllerapi.CommonOptions control.ControlOptions } @@ -284,8 +283,8 @@ func runBuild(dockerCli command.Cli, options buildOptions) (err error) { return errors.Wrap(err, "writing image ID file") } } - if options.MetadataFile != "" { - if err := writeMetadataFile(options.MetadataFile, decodeExporterResponse(resp.ExporterResponse)); err != nil { + if options.metadataFile != "" { + if err := writeMetadataFile(options.metadataFile, decodeExporterResponse(resp.ExporterResponse)); err != nil { return err } } @@ -414,7 +413,7 @@ func buildCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { options.contextPath = args[0] options.Builder = rootOpts.builder - options.MetadataFile = cFlags.metadataFile + options.metadataFile = cFlags.metadataFile options.NoCache = false if cFlags.noCache != nil { options.NoCache = *cFlags.noCache diff --git a/controller/pb/controller.pb.go b/controller/pb/controller.pb.go index 65d48ef7e050..6ff9367f2cd3 100644 --- a/controller/pb/controller.pb.go +++ b/controller/pb/controller.pb.go @@ -602,18 +602,17 @@ func (m *NamedContext) GetDefinition() *pb.Definition { } type CommonOptions struct { - Builder string `protobuf:"bytes,1,opt,name=Builder,proto3" json:"Builder,omitempty"` - MetadataFile string `protobuf:"bytes,2,opt,name=MetadataFile,proto3" json:"MetadataFile,omitempty"` - NoCache bool `protobuf:"varint,3,opt,name=NoCache,proto3" json:"NoCache,omitempty"` + Builder string `protobuf:"bytes,1,opt,name=Builder,proto3" json:"Builder,omitempty"` + NoCache bool `protobuf:"varint,2,opt,name=NoCache,proto3" json:"NoCache,omitempty"` // string Progress: no progress view on server side - Pull bool `protobuf:"varint,4,opt,name=Pull,proto3" json:"Pull,omitempty"` - ExportPush bool `protobuf:"varint,5,opt,name=ExportPush,proto3" json:"ExportPush,omitempty"` - ExportLoad bool `protobuf:"varint,6,opt,name=ExportLoad,proto3" json:"ExportLoad,omitempty"` + Pull bool `protobuf:"varint,3,opt,name=Pull,proto3" json:"Pull,omitempty"` + ExportPush bool `protobuf:"varint,4,opt,name=ExportPush,proto3" json:"ExportPush,omitempty"` + ExportLoad bool `protobuf:"varint,5,opt,name=ExportLoad,proto3" json:"ExportLoad,omitempty"` // TODO: we should remove Linked from the controllerapi, it's only used to // produce a single warning. To allow this, we need to move the default // export detection out from the controller server, as well as load the // driver on the controller client. - Linked bool `protobuf:"varint,7,opt,name=Linked,proto3" json:"Linked,omitempty"` + Linked bool `protobuf:"varint,6,opt,name=Linked,proto3" json:"Linked,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -650,13 +649,6 @@ func (m *CommonOptions) GetBuilder() string { return "" } -func (m *CommonOptions) GetMetadataFile() string { - if m != nil { - return m.MetadataFile - } - return "" -} - func (m *CommonOptions) GetNoCache() bool { if m != nil { return m.NoCache @@ -2217,135 +2209,134 @@ func init() { func init() { proto.RegisterFile("controller.proto", fileDescriptor_ed7f10298fa1d90f) } var fileDescriptor_ed7f10298fa1d90f = []byte{ - // 2044 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xdd, 0x72, 0xdb, 0xc6, - 0x15, 0x2e, 0x48, 0x8a, 0x3f, 0x87, 0xa2, 0x2c, 0x6f, 0x65, 0x0f, 0xc2, 0xb8, 0x89, 0x0c, 0xdb, - 0x29, 0x27, 0xce, 0x80, 0x89, 0x92, 0xd4, 0x76, 0xec, 0x5c, 0x48, 0x94, 0x38, 0x52, 0x46, 0x7f, - 0xb3, 0x94, 0x9d, 0x69, 0x2f, 0x9a, 0x01, 0xc9, 0x15, 0x85, 0x21, 0x88, 0x45, 0xb1, 0x4b, 0x49, - 0xec, 0x55, 0x6f, 0x7a, 0xd7, 0xe9, 0x4b, 0xf4, 0xaa, 0xd3, 0x47, 0xe8, 0x4c, 0x67, 0xfa, 0x0c, - 0x7d, 0x8f, 0x4e, 0x1f, 0xa1, 0xb3, 0x3f, 0x00, 0x01, 0x91, 0x80, 0xa4, 0xf6, 0x8a, 0xbb, 0x07, - 0xdf, 0x77, 0x76, 0xcf, 0xd9, 0xb3, 0xe7, 0x9c, 0x25, 0xac, 0x0f, 0xa8, 0xcf, 0x43, 0xea, 0x79, - 0x24, 0xb4, 0x83, 0x90, 0x72, 0x8a, 0x36, 0xfa, 0x53, 0xd7, 0x1b, 0x5e, 0xdb, 0x89, 0x0f, 0x97, - 0x5f, 0x35, 0xdf, 0x8e, 0x5c, 0x7e, 0x31, 0xed, 0xdb, 0x03, 0x3a, 0x69, 0x4f, 0x68, 0x7f, 0xd6, - 0x96, 0xa8, 0xb1, 0xcb, 0xdb, 0x4e, 0xe0, 0xb6, 0x19, 0x09, 0x2f, 0xdd, 0x01, 0x61, 0x6d, 0x4d, - 0x8a, 0x7e, 0x95, 0xca, 0xe6, 0xb7, 0x99, 0x64, 0x46, 0xa7, 0xe1, 0x80, 0x04, 0xd4, 0x73, 0x07, - 0xb3, 0x76, 0xd0, 0x6f, 0xab, 0x91, 0xa6, 0x7d, 0x91, 0x43, 0xf3, 0x2e, 0x49, 0x28, 0x08, 0x34, - 0x60, 0x0a, 0x6d, 0xb5, 0x60, 0xe3, 0xd0, 0x65, 0xfc, 0x34, 0xa4, 0x03, 0xc2, 0x18, 0x61, 0x98, - 0xfc, 0x6e, 0x4a, 0x18, 0x47, 0xeb, 0x50, 0xc4, 0xe4, 0xdc, 0x34, 0x36, 0x8d, 0x56, 0x0d, 0x8b, - 0xa1, 0x75, 0x0a, 0x8f, 0x6e, 0x20, 0x59, 0x40, 0x7d, 0x46, 0xd0, 0x2b, 0x58, 0x39, 0xf0, 0xcf, - 0x29, 0x33, 0x8d, 0xcd, 0x62, 0xab, 0xbe, 0xf5, 0xd4, 0x5e, 0xe6, 0x0a, 0x5b, 0xf3, 0x04, 0x12, - 0x2b, 0xbc, 0xc5, 0xa0, 0x9e, 0x90, 0xa2, 0x27, 0x50, 0x8b, 0xa6, 0xbb, 0x7a, 0xe1, 0xb9, 0x00, - 0x75, 0x61, 0xf5, 0xc0, 0xbf, 0xa4, 0x63, 0xd2, 0xa1, 0xfe, 0xb9, 0x3b, 0x32, 0x0b, 0x9b, 0x46, - 0xab, 0xbe, 0x65, 0x2d, 0x5f, 0x2c, 0x89, 0xc4, 0x29, 0x9e, 0xf5, 0x03, 0x98, 0xbb, 0x2e, 0x1b, - 0x50, 0xdf, 0x27, 0x83, 0xc8, 0x98, 0x4c, 0xa3, 0xd3, 0x7b, 0x2a, 0xdc, 0xd8, 0x93, 0xf5, 0x31, - 0x7c, 0xb4, 0x44, 0x97, 0x72, 0x8b, 0xf5, 0x5b, 0x58, 0xdd, 0x11, 0x7b, 0xcb, 0x56, 0xfe, 0x0e, - 0x2a, 0x27, 0x01, 0x77, 0xa9, 0xcf, 0xf2, 0xad, 0x91, 0x6a, 0x34, 0x12, 0x47, 0x14, 0xeb, 0x2f, - 0x45, 0x28, 0x1f, 0xf8, 0xc1, 0x94, 0x33, 0xb4, 0x09, 0xf5, 0x0e, 0xf5, 0x39, 0xb9, 0xe6, 0xa7, - 0x0e, 0xbf, 0xd0, 0x4b, 0x24, 0x45, 0xa8, 0x05, 0x0f, 0x12, 0xd3, 0x7d, 0x87, 0x5d, 0x68, 0x6b, - 0x6e, 0x8a, 0xd1, 0x67, 0xb0, 0xb6, 0x4b, 0x07, 0x63, 0x12, 0x9e, 0xbb, 0x1e, 0x39, 0x76, 0x26, - 0xc4, 0x2c, 0x4a, 0xe0, 0x0d, 0x29, 0xfa, 0x1c, 0xd6, 0xe7, 0x92, 0x03, 0xdf, 0x73, 0x7d, 0x62, - 0x96, 0x24, 0x72, 0x41, 0x8e, 0xde, 0xc1, 0x43, 0xbd, 0xcc, 0x2e, 0x39, 0x77, 0x7d, 0x57, 0x18, - 0x60, 0xae, 0x48, 0x93, 0xd7, 0xec, 0xa0, 0x6f, 0xcf, 0xa5, 0x78, 0x11, 0x88, 0xde, 0x43, 0x43, - 0xac, 0x38, 0xd4, 0x5f, 0x98, 0x59, 0x96, 0x71, 0xd6, 0xce, 0x3a, 0x7a, 0xe1, 0x12, 0x3b, 0xc5, - 0xd8, 0xf3, 0x79, 0x38, 0xc3, 0x69, 0x2d, 0xcd, 0x21, 0xa0, 0x45, 0x90, 0x38, 0xa5, 0x31, 0x99, - 0x45, 0xa7, 0x34, 0x26, 0x33, 0xf4, 0x1a, 0x56, 0x2e, 0x1d, 0x6f, 0x4a, 0xf2, 0xcf, 0x28, 0xa9, - 0x0a, 0x2b, 0xc2, 0x77, 0x85, 0xd7, 0x86, 0xf5, 0x8f, 0x9a, 0x0e, 0x03, 0x7d, 0x6c, 0xe8, 0x9b, - 0xe8, 0xd4, 0xe4, 0x1a, 0xf5, 0xad, 0x27, 0x79, 0x66, 0xe0, 0xe8, 0x84, 0xbf, 0x17, 0x71, 0xe8, - 0xfa, 0xbc, 0x3b, 0xf5, 0x07, 0x7a, 0x23, 0x9f, 0x66, 0xdd, 0x33, 0x0d, 0xc3, 0x73, 0x06, 0x7a, - 0x05, 0xa5, 0x93, 0x80, 0x33, 0x79, 0x94, 0xf5, 0xad, 0x67, 0xcb, 0x99, 0x1d, 0x3a, 0x99, 0x50, - 0x3f, 0x8a, 0x33, 0x49, 0x40, 0x1b, 0xb0, 0xb2, 0xed, 0x79, 0xf4, 0xca, 0x2c, 0x6d, 0x16, 0x5b, - 0x35, 0xac, 0x26, 0xe8, 0x57, 0x50, 0xd9, 0xe6, 0x9c, 0x30, 0xce, 0xcc, 0x15, 0x79, 0x16, 0x19, - 0x46, 0x28, 0x10, 0x8e, 0xc0, 0xe8, 0x04, 0x6a, 0xd2, 0x17, 0xdb, 0xe1, 0x28, 0x3a, 0xc5, 0xaf, - 0x6e, 0x0f, 0x79, 0x3b, 0xe6, 0xa8, 0x73, 0x9c, 0xeb, 0x40, 0x7b, 0x50, 0xeb, 0x38, 0x83, 0x0b, - 0xd2, 0x0d, 0xe9, 0xc4, 0xac, 0x48, 0x85, 0xbf, 0xcc, 0x30, 0x4e, 0xc0, 0xb4, 0x42, 0xad, 0x26, - 0x66, 0xa2, 0x6d, 0xa8, 0xc8, 0xc9, 0x19, 0x35, 0xab, 0xf7, 0x53, 0x12, 0xf1, 0x90, 0x05, 0xab, - 0x9d, 0x51, 0x48, 0xa7, 0xc1, 0xa9, 0x13, 0x12, 0x9f, 0x9b, 0x35, 0x19, 0x40, 0x29, 0x19, 0x7a, - 0x0b, 0x95, 0xbd, 0xeb, 0x80, 0x86, 0x9c, 0x99, 0x90, 0x97, 0x2a, 0x15, 0x48, 0x2f, 0xa0, 0x19, - 0xe8, 0x13, 0x80, 0xbd, 0x6b, 0x1e, 0x3a, 0xfb, 0x54, 0xb8, 0xbd, 0x2e, 0x8f, 0x23, 0x21, 0x41, - 0x5d, 0x28, 0x1f, 0x3a, 0x7d, 0xe2, 0x31, 0x73, 0x55, 0xea, 0xb6, 0xef, 0xe0, 0x58, 0x45, 0x50, - 0x0b, 0x69, 0xb6, 0xc8, 0x25, 0xc7, 0x84, 0x5f, 0xd1, 0x70, 0x7c, 0x44, 0x87, 0xc4, 0x6c, 0xa8, - 0x5c, 0x92, 0x10, 0xa1, 0xe7, 0xd0, 0x38, 0xa6, 0xca, 0x79, 0xae, 0xc7, 0x49, 0x68, 0xae, 0xc9, - 0xcd, 0xa4, 0x85, 0x32, 0x73, 0x7a, 0x0e, 0x3f, 0xa7, 0xe1, 0x84, 0x99, 0x0f, 0x24, 0x62, 0x2e, - 0x10, 0x11, 0xd4, 0x23, 0x83, 0x90, 0x70, 0x66, 0xae, 0xe7, 0x45, 0x90, 0x02, 0xe1, 0x08, 0x8c, - 0x4c, 0xa8, 0xf4, 0x2e, 0x26, 0x3d, 0xf7, 0xf7, 0xc4, 0x7c, 0xb8, 0x69, 0xb4, 0x8a, 0x38, 0x9a, - 0xa2, 0x97, 0x50, 0xec, 0xf5, 0xf6, 0x4d, 0x24, 0xb5, 0x7d, 0x94, 0xa1, 0xad, 0xb7, 0x8f, 0x05, - 0x0a, 0x21, 0x28, 0x9d, 0x39, 0x23, 0x66, 0xfe, 0x5c, 0xee, 0x4b, 0x8e, 0xd1, 0x63, 0x28, 0x9f, - 0x39, 0xe1, 0x88, 0x70, 0x73, 0x43, 0xda, 0xac, 0x67, 0xe8, 0x0d, 0x54, 0xde, 0x7b, 0xee, 0xc4, - 0xe5, 0xcc, 0x7c, 0x94, 0x77, 0xf1, 0x14, 0xe8, 0x24, 0xe0, 0x38, 0xc2, 0xa3, 0x03, 0x58, 0xed, - 0xc9, 0x52, 0x7d, 0x2a, 0x0b, 0xb4, 0xf9, 0x58, 0xf2, 0x5f, 0xd8, 0xa2, 0x2c, 0xdb, 0x51, 0x59, - 0x16, 0xdc, 0x64, 0x41, 0xb7, 0x15, 0x18, 0xa7, 0xa8, 0xcd, 0x77, 0xb0, 0x96, 0xbe, 0x06, 0x4b, - 0x32, 0xd5, 0x46, 0x32, 0x53, 0xd5, 0x12, 0x59, 0xa8, 0xf9, 0x06, 0xea, 0x89, 0xb3, 0xbe, 0x0f, - 0xd5, 0xc2, 0xb0, 0x9a, 0xcc, 0x6d, 0xc2, 0x75, 0x89, 0x22, 0x23, 0xc7, 0xc8, 0x06, 0x48, 0x24, - 0xf6, 0xc2, 0xd2, 0xc4, 0x9e, 0x40, 0x58, 0xff, 0x32, 0xa0, 0x91, 0xca, 0x36, 0xe2, 0x5c, 0xa5, - 0x79, 0x24, 0xd4, 0x8a, 0xa3, 0xa9, 0xb8, 0x58, 0x47, 0x84, 0x3b, 0x43, 0x87, 0x3b, 0x5d, 0xd7, - 0x8b, 0x36, 0x98, 0x92, 0x09, 0xb6, 0x0e, 0x3e, 0x99, 0xe1, 0xaa, 0x38, 0x9a, 0xca, 0xdd, 0x4e, - 0x3d, 0x4f, 0x56, 0xa6, 0x2a, 0x96, 0x63, 0x75, 0x93, 0xc4, 0xa5, 0x3a, 0x9d, 0xb2, 0x0b, 0x59, - 0x86, 0xaa, 0x38, 0x21, 0x99, 0x7f, 0x3f, 0xa4, 0xce, 0xd0, 0x2c, 0x27, 0xbf, 0x0b, 0x89, 0x08, - 0x94, 0x43, 0xd7, 0x1f, 0x93, 0xa1, 0x59, 0x91, 0xdf, 0xf4, 0xcc, 0xfa, 0xa7, 0x01, 0xf5, 0xc4, - 0xd5, 0x95, 0x41, 0x36, 0x0b, 0x48, 0xe4, 0x29, 0x31, 0x46, 0x3b, 0xb0, 0xb2, 0xcd, 0x79, 0x28, - 0x0a, 0xbe, 0x88, 0xd3, 0x2f, 0x6e, 0x4d, 0x00, 0xb6, 0x84, 0xab, 0x2b, 0xaa, 0xa8, 0xe2, 0x86, - 0xee, 0x12, 0xc6, 0x5d, 0xdf, 0x91, 0xee, 0x56, 0xe5, 0x39, 0x29, 0x6a, 0xbe, 0x06, 0x98, 0xd3, - 0xee, 0x75, 0xda, 0x7f, 0x33, 0xe0, 0xe1, 0x42, 0x96, 0x5b, 0x6a, 0xc9, 0x7e, 0xda, 0x92, 0xad, - 0x3b, 0x66, 0xcc, 0x45, 0x7b, 0xfe, 0x8f, 0xdd, 0x1e, 0x43, 0x59, 0x95, 0x96, 0xa5, 0x3b, 0x6c, - 0x42, 0x75, 0xd7, 0x65, 0x4e, 0xdf, 0x23, 0x43, 0x49, 0xad, 0xe2, 0x78, 0x2e, 0xeb, 0x9a, 0xdc, - 0xbd, 0xf2, 0x9e, 0x9a, 0x58, 0x2a, 0x87, 0xa0, 0x35, 0x28, 0xc4, 0x1d, 0x68, 0xe1, 0x60, 0x57, - 0x80, 0x45, 0x98, 0x2b, 0x53, 0x6b, 0x58, 0x4d, 0xac, 0x2e, 0x94, 0x55, 0x56, 0x5a, 0xc0, 0x37, - 0xa1, 0x2a, 0xc2, 0x52, 0x5e, 0x13, 0xb5, 0xe7, 0x78, 0x2e, 0xcc, 0xdb, 0xf3, 0x2f, 0xf5, 0xb2, - 0x62, 0x68, 0xbd, 0x4a, 0x94, 0x76, 0x61, 0x87, 0xec, 0xb9, 0xb4, 0x1d, 0xb2, 0xd3, 0x7a, 0x0c, - 0xe5, 0x2e, 0x0d, 0x27, 0x0e, 0xd7, 0xca, 0xf4, 0xcc, 0xb2, 0x60, 0xed, 0xc0, 0x67, 0x01, 0x19, - 0xf0, 0xec, 0xa6, 0xfd, 0x04, 0x1e, 0xc4, 0x18, 0xdd, 0xae, 0x27, 0xba, 0x4e, 0xe3, 0xfe, 0x5d, - 0xe7, 0x5f, 0x0d, 0xa8, 0xc5, 0x99, 0x0e, 0x75, 0xa0, 0x2c, 0x4f, 0x23, 0xea, 0xfd, 0x5f, 0xde, - 0x92, 0x1a, 0xed, 0x0f, 0x12, 0xad, 0x2b, 0x8e, 0xa2, 0x36, 0x7f, 0x84, 0x7a, 0x42, 0xbc, 0x24, - 0x00, 0xb6, 0xd2, 0x1d, 0xd8, 0x93, 0xbc, 0x45, 0x92, 0xe1, 0xb1, 0x0b, 0x65, 0x25, 0x5c, 0xea, - 0x56, 0x04, 0xa5, 0x7d, 0x27, 0x54, 0xa1, 0x51, 0xc4, 0x72, 0x2c, 0x64, 0x3d, 0x7a, 0xce, 0xe5, - 0xf1, 0x14, 0xb1, 0x1c, 0x5b, 0x7f, 0x37, 0xa0, 0xa1, 0x1b, 0x79, 0xed, 0x41, 0x02, 0xeb, 0xea, - 0x86, 0x92, 0x30, 0x92, 0x69, 0xfb, 0xdf, 0xe4, 0xb8, 0x32, 0x82, 0xda, 0x37, 0xb9, 0xca, 0x1b, - 0x0b, 0x2a, 0x9b, 0x1d, 0x78, 0xb4, 0x14, 0x7a, 0xaf, 0x2b, 0xf2, 0x02, 0x1e, 0xce, 0x9f, 0x28, - 0xd9, 0x71, 0xb2, 0x01, 0x28, 0x09, 0xd3, 0x4f, 0x98, 0x4f, 0xa1, 0x2e, 0x9e, 0x7c, 0xd9, 0x34, - 0x0b, 0x56, 0x15, 0x40, 0x7b, 0x06, 0x41, 0x69, 0x4c, 0x66, 0x2a, 0x1a, 0x6a, 0x58, 0x8e, 0xad, - 0x3f, 0x1b, 0xe2, 0xe5, 0x16, 0x4c, 0xf9, 0x11, 0x61, 0xcc, 0x19, 0x89, 0x00, 0x2c, 0x1d, 0xf8, - 0x2e, 0xd7, 0xd1, 0xf7, 0x59, 0x4e, 0xff, 0x2b, 0x60, 0x9a, 0xb5, 0xff, 0x33, 0x2c, 0x59, 0xa2, - 0x95, 0xdd, 0x75, 0xb8, 0xa3, 0x63, 0x21, 0xa3, 0x83, 0x12, 0x88, 0x04, 0x51, 0x4c, 0x77, 0x2a, - 0xe2, 0x99, 0x1a, 0x4c, 0xb9, 0xf5, 0x1c, 0xd6, 0x6f, 0x6a, 0x5f, 0x62, 0xda, 0xd7, 0x50, 0x4f, - 0x68, 0x91, 0xf7, 0xf6, 0xa4, 0x2b, 0x01, 0x55, 0x2c, 0x86, 0xc2, 0xd6, 0x78, 0x23, 0xab, 0x6a, - 0x0d, 0xeb, 0x01, 0x34, 0xa4, 0xea, 0xd8, 0x83, 0x7f, 0x28, 0x40, 0x25, 0x52, 0xf1, 0x2a, 0x65, - 0xf7, 0xd3, 0x2c, 0xbb, 0x17, 0x4d, 0xfe, 0x16, 0x4a, 0x71, 0xe9, 0xcb, 0x6c, 0x3f, 0xba, 0xc3, - 0x04, 0x4d, 0x56, 0xc5, 0xef, 0xa1, 0x8c, 0x09, 0x13, 0xad, 0x52, 0x6e, 0xdb, 0xaf, 0x30, 0x73, - 0xb2, 0x26, 0x09, 0x7a, 0xcf, 0x1d, 0xf9, 0x8e, 0x2a, 0x9e, 0x99, 0x74, 0x85, 0x49, 0xd0, 0x95, - 0x60, 0xee, 0xee, 0x3f, 0x1a, 0x50, 0xcf, 0x75, 0x75, 0xfe, 0x23, 0x7b, 0xe1, 0xe1, 0x5f, 0xfc, - 0x1f, 0x1f, 0xfe, 0xff, 0x36, 0xd2, 0x8a, 0x64, 0x9d, 0x17, 0xf7, 0x29, 0xa0, 0xae, 0xcf, 0x75, - 0xc8, 0x26, 0x24, 0x62, 0xa3, 0x9d, 0xc9, 0x50, 0x27, 0x7d, 0x31, 0x9c, 0x27, 0xef, 0xa2, 0x4e, - 0xde, 0x22, 0x08, 0xde, 0x33, 0x12, 0xea, 0x97, 0xaf, 0x1c, 0x8b, 0x7c, 0x7d, 0x4c, 0xa5, 0x54, - 0xf5, 0x16, 0x7a, 0x26, 0xf5, 0x5d, 0xa9, 0x86, 0x42, 0xe8, 0xbb, 0x92, 0x55, 0xe8, 0x98, 0x0a, - 0x99, 0x6a, 0x24, 0xd4, 0x44, 0xe0, 0xce, 0xf8, 0xcc, 0xac, 0xaa, 0x50, 0x3b, 0xe3, 0x33, 0x51, - 0x50, 0x30, 0xf5, 0xbc, 0xbe, 0x33, 0x18, 0xcb, 0x87, 0x45, 0x15, 0xc7, 0x73, 0xd1, 0xfb, 0x08, - 0xef, 0xba, 0x8e, 0x67, 0x82, 0xea, 0x7d, 0xf4, 0xd4, 0xda, 0x86, 0x5a, 0x1c, 0x14, 0xa2, 0x46, - 0x75, 0x87, 0xd2, 0xe9, 0x0d, 0x5c, 0xe8, 0x0e, 0xa3, 0x78, 0x2e, 0x2c, 0xc6, 0x73, 0x31, 0x11, - 0xcf, 0xaf, 0xa0, 0x91, 0x0a, 0x0f, 0x01, 0xc2, 0xf4, 0x8a, 0x69, 0x45, 0x72, 0x2c, 0x64, 0x1d, - 0xea, 0xa9, 0xff, 0x30, 0x1a, 0x58, 0x8e, 0xad, 0x67, 0xd0, 0x48, 0x05, 0xc6, 0xb2, 0x0c, 0x6c, - 0x3d, 0x85, 0x46, 0x8f, 0x3b, 0x7c, 0x9a, 0xf3, 0xa7, 0xd3, 0x7f, 0x0c, 0x58, 0x8b, 0x30, 0x3a, - 0xc7, 0x7c, 0x03, 0xd5, 0x4b, 0x12, 0x72, 0x72, 0x1d, 0x57, 0x1d, 0x73, 0xb1, 0xa1, 0xfe, 0x20, - 0x11, 0x38, 0x46, 0xa2, 0xef, 0xa0, 0xca, 0xa4, 0x1e, 0x12, 0x75, 0x2c, 0x9f, 0x64, 0xb1, 0xf4, - 0x7a, 0x31, 0x1e, 0xb5, 0xa1, 0xe4, 0xd1, 0x11, 0x93, 0xe7, 0x5e, 0xdf, 0xfa, 0x38, 0x8b, 0x77, - 0x48, 0x47, 0x58, 0x02, 0xd1, 0x5b, 0xa8, 0x5e, 0x39, 0xa1, 0xef, 0xfa, 0x23, 0x26, 0x1f, 0xce, - 0xe2, 0xd2, 0x66, 0x90, 0x7e, 0x54, 0x38, 0x1c, 0x13, 0xac, 0x86, 0xb8, 0x2e, 0xe7, 0x54, 0xfb, - 0xc4, 0xfa, 0xb5, 0x88, 0x5a, 0x31, 0xd5, 0xe6, 0x1f, 0x40, 0x43, 0x45, 0xfe, 0x07, 0x12, 0x32, - 0xd1, 0xff, 0x19, 0x79, 0xb7, 0x73, 0x27, 0x09, 0xc5, 0x69, 0xa6, 0xf5, 0x93, 0x2e, 0x6c, 0x91, - 0x40, 0xc4, 0x52, 0xe0, 0x0c, 0xc6, 0xce, 0x28, 0x3a, 0xa7, 0x68, 0x2a, 0xbe, 0x5c, 0xea, 0xf5, - 0xd4, 0x05, 0x8d, 0xa6, 0x22, 0x36, 0x43, 0x72, 0xe9, 0xb2, 0x79, 0x2b, 0x1a, 0xcf, 0xb7, 0xfe, - 0x54, 0x01, 0xe8, 0xc4, 0xfb, 0x41, 0xa7, 0xb0, 0x22, 0xd7, 0x43, 0x56, 0x6e, 0x99, 0x94, 0x76, - 0x37, 0x9f, 0xdd, 0xa1, 0x94, 0xa2, 0x0f, 0x22, 0xf8, 0x65, 0x7b, 0x83, 0x9e, 0x67, 0x25, 0x84, - 0x64, 0x87, 0xd4, 0x7c, 0x71, 0x0b, 0x4a, 0xeb, 0x7d, 0x0f, 0x65, 0x15, 0x05, 0x28, 0x2b, 0xeb, - 0x25, 0xe3, 0xb6, 0xf9, 0x3c, 0x1f, 0xa4, 0x94, 0x7e, 0x69, 0x20, 0xac, 0x73, 0x22, 0xb2, 0x72, - 0x8a, 0x9e, 0xbe, 0x31, 0x59, 0x0e, 0x48, 0xd5, 0x97, 0x96, 0x81, 0x7e, 0x80, 0xb2, 0xca, 0x6a, - 0xe8, 0x17, 0xcb, 0x09, 0x91, 0xbe, 0xfc, 0xcf, 0x2d, 0xe3, 0x4b, 0x03, 0x1d, 0x41, 0x49, 0x94, - 0x73, 0x94, 0x51, 0x9b, 0x12, 0xbd, 0x40, 0xd3, 0xca, 0x83, 0x68, 0x2f, 0xfe, 0x04, 0x30, 0x6f, - 0x2a, 0x50, 0xc6, 0x7f, 0x2a, 0x0b, 0xdd, 0x49, 0xb3, 0x75, 0x3b, 0x50, 0x2f, 0x70, 0x24, 0x2a, - 0xea, 0x39, 0x45, 0x99, 0xb5, 0x34, 0xbe, 0x46, 0x4d, 0x2b, 0x0f, 0xa2, 0xd5, 0x5d, 0x40, 0x23, - 0xf5, 0x0f, 0x37, 0xfa, 0x3c, 0xdb, 0xc8, 0x9b, 0x7f, 0x98, 0x37, 0x5f, 0xde, 0x09, 0xab, 0x57, - 0xe2, 0xc9, 0xae, 0x4c, 0x7f, 0x46, 0xf6, 0x6d, 0x76, 0xa7, 0xff, 0xad, 0x6e, 0xb6, 0xef, 0x8c, - 0x57, 0xab, 0xee, 0x94, 0x7e, 0x53, 0x08, 0xfa, 0xfd, 0xb2, 0xfc, 0xe3, 0xff, 0xeb, 0xff, 0x06, - 0x00, 0x00, 0xff, 0xff, 0x6e, 0xde, 0x0e, 0xdf, 0xc4, 0x18, 0x00, 0x00, + // 2030 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0x5f, 0x73, 0xdb, 0xc6, + 0x11, 0x2f, 0x48, 0x8a, 0x7f, 0x96, 0xa2, 0x2c, 0x5f, 0x65, 0x0f, 0xc2, 0xb8, 0x89, 0x0c, 0xdb, + 0x29, 0x27, 0xce, 0x80, 0x89, 0x92, 0x54, 0x76, 0xec, 0x3c, 0x48, 0x94, 0x38, 0x52, 0x46, 0x96, + 0x34, 0x47, 0xd9, 0x99, 0xf6, 0xa1, 0x19, 0x90, 0x3c, 0x51, 0x18, 0x82, 0x38, 0x14, 0x77, 0x94, + 0xc4, 0x3e, 0xf5, 0xa5, 0x6f, 0x9d, 0x7e, 0x89, 0x3e, 0x75, 0xfa, 0xd0, 0x0f, 0xd0, 0x99, 0xce, + 0xf4, 0x0b, 0x75, 0xfa, 0x11, 0x3a, 0xf7, 0x07, 0x20, 0x20, 0x12, 0x90, 0xd4, 0x3e, 0xf1, 0x6e, + 0xf1, 0xfb, 0xed, 0xdd, 0xee, 0xed, 0xed, 0xee, 0x11, 0xd6, 0x07, 0xd4, 0xe7, 0x21, 0xf5, 0x3c, + 0x12, 0xda, 0x41, 0x48, 0x39, 0x45, 0x1b, 0xfd, 0xa9, 0xeb, 0x0d, 0xaf, 0xed, 0xc4, 0x87, 0xcb, + 0xaf, 0x9a, 0x6f, 0x46, 0x2e, 0xbf, 0x98, 0xf6, 0xed, 0x01, 0x9d, 0xb4, 0x27, 0xb4, 0x3f, 0x6b, + 0x4b, 0xd4, 0xd8, 0xe5, 0x6d, 0x27, 0x70, 0xdb, 0x8c, 0x84, 0x97, 0xee, 0x80, 0xb0, 0xb6, 0x26, + 0x45, 0xbf, 0x4a, 0x65, 0xf3, 0xdb, 0x4c, 0x32, 0xa3, 0xd3, 0x70, 0x40, 0x02, 0xea, 0xb9, 0x83, + 0x59, 0x3b, 0xe8, 0xb7, 0xd5, 0x48, 0xd3, 0xbe, 0xc8, 0xa1, 0x79, 0x97, 0x24, 0x14, 0x04, 0x1a, + 0x30, 0x85, 0xb6, 0x5a, 0xb0, 0x71, 0xe4, 0x32, 0x7e, 0x1a, 0xd2, 0x01, 0x61, 0x8c, 0x30, 0x4c, + 0x7e, 0x37, 0x25, 0x8c, 0xa3, 0x75, 0x28, 0x62, 0x72, 0x6e, 0x1a, 0x9b, 0x46, 0xab, 0x86, 0xc5, + 0xd0, 0x3a, 0x85, 0x47, 0x37, 0x90, 0x2c, 0xa0, 0x3e, 0x23, 0x68, 0x1b, 0x56, 0x0e, 0xfd, 0x73, + 0xca, 0x4c, 0x63, 0xb3, 0xd8, 0xaa, 0x6f, 0x3d, 0xb5, 0x97, 0xb9, 0xc2, 0xd6, 0x3c, 0x81, 0xc4, + 0x0a, 0x6f, 0x31, 0xa8, 0x27, 0xa4, 0xe8, 0x09, 0xd4, 0xa2, 0xe9, 0x9e, 0x5e, 0x78, 0x2e, 0x40, + 0x5d, 0x58, 0x3d, 0xf4, 0x2f, 0xe9, 0x98, 0x74, 0xa8, 0x7f, 0xee, 0x8e, 0xcc, 0xc2, 0xa6, 0xd1, + 0xaa, 0x6f, 0x59, 0xcb, 0x17, 0x4b, 0x22, 0x71, 0x8a, 0x67, 0xfd, 0x00, 0xe6, 0x9e, 0xcb, 0x06, + 0xd4, 0xf7, 0xc9, 0x20, 0x32, 0x26, 0xd3, 0xe8, 0xf4, 0x9e, 0x0a, 0x37, 0xf6, 0x64, 0x7d, 0x0c, + 0x1f, 0x2d, 0xd1, 0xa5, 0xdc, 0x62, 0xfd, 0x16, 0x56, 0x77, 0xc5, 0xde, 0xb2, 0x95, 0xbf, 0x85, + 0xca, 0x49, 0xc0, 0x5d, 0xea, 0xb3, 0x7c, 0x6b, 0xa4, 0x1a, 0x8d, 0xc4, 0x11, 0xc5, 0xfa, 0x4b, + 0x11, 0xca, 0x87, 0x7e, 0x30, 0xe5, 0x0c, 0x6d, 0x42, 0xbd, 0x43, 0x7d, 0x4e, 0xae, 0xf9, 0xa9, + 0xc3, 0x2f, 0xf4, 0x12, 0x49, 0x11, 0x6a, 0xc1, 0x83, 0xc4, 0xf4, 0xc0, 0x61, 0x17, 0xda, 0x9a, + 0x9b, 0x62, 0xf4, 0x19, 0xac, 0xed, 0xd1, 0xc1, 0x98, 0x84, 0xe7, 0xae, 0x47, 0x8e, 0x9d, 0x09, + 0x31, 0x8b, 0x12, 0x78, 0x43, 0x8a, 0x3e, 0x87, 0xf5, 0xb9, 0xe4, 0xd0, 0xf7, 0x5c, 0x9f, 0x98, + 0x25, 0x89, 0x5c, 0x90, 0xa3, 0xb7, 0xf0, 0x50, 0x2f, 0xb3, 0x47, 0xce, 0x5d, 0xdf, 0x15, 0x06, + 0x98, 0x2b, 0xd2, 0xe4, 0x35, 0x3b, 0xe8, 0xdb, 0x73, 0x29, 0x5e, 0x04, 0xa2, 0xf7, 0xd0, 0x10, + 0x2b, 0x0e, 0xf5, 0x17, 0x66, 0x96, 0x65, 0x9c, 0xb5, 0xb3, 0x8e, 0x5e, 0xb8, 0xc4, 0x4e, 0x31, + 0xf6, 0x7d, 0x1e, 0xce, 0x70, 0x5a, 0x4b, 0x73, 0x08, 0x68, 0x11, 0x24, 0x4e, 0x69, 0x4c, 0x66, + 0xd1, 0x29, 0x8d, 0xc9, 0x0c, 0xbd, 0x82, 0x95, 0x4b, 0xc7, 0x9b, 0x92, 0xfc, 0x33, 0x4a, 0xaa, + 0xc2, 0x8a, 0xf0, 0x5d, 0xe1, 0x95, 0x61, 0xfd, 0xb3, 0xa6, 0xc3, 0x40, 0x1f, 0x1b, 0xfa, 0x26, + 0x3a, 0x35, 0xb9, 0x46, 0x7d, 0xeb, 0x49, 0x9e, 0x19, 0x38, 0x3a, 0xe1, 0xef, 0x45, 0x1c, 0xba, + 0x3e, 0xef, 0x4e, 0xfd, 0x81, 0xde, 0xc8, 0xa7, 0x59, 0xf7, 0x4c, 0xc3, 0xf0, 0x9c, 0x81, 0xb6, + 0xa1, 0x74, 0x12, 0x70, 0x26, 0x8f, 0xb2, 0xbe, 0xf5, 0x6c, 0x39, 0xb3, 0x43, 0x27, 0x13, 0xea, + 0x47, 0x71, 0x26, 0x09, 0x68, 0x03, 0x56, 0x76, 0x3c, 0x8f, 0x5e, 0x99, 0xa5, 0xcd, 0x62, 0xab, + 0x86, 0xd5, 0x04, 0xfd, 0x0a, 0x2a, 0x3b, 0x9c, 0x13, 0xc6, 0x99, 0xb9, 0x22, 0xcf, 0x22, 0xc3, + 0x08, 0x05, 0xc2, 0x11, 0x18, 0x9d, 0x40, 0x4d, 0xfa, 0x62, 0x27, 0x1c, 0x45, 0xa7, 0xf8, 0xd5, + 0xed, 0x21, 0x6f, 0xc7, 0x1c, 0x75, 0x8e, 0x73, 0x1d, 0x68, 0x1f, 0x6a, 0x1d, 0x67, 0x70, 0x41, + 0xba, 0x21, 0x9d, 0x98, 0x15, 0xa9, 0xf0, 0x97, 0x19, 0xc6, 0x09, 0x98, 0x56, 0xa8, 0xd5, 0xc4, + 0x4c, 0xb4, 0x03, 0x15, 0x39, 0x39, 0xa3, 0x66, 0xf5, 0x7e, 0x4a, 0x22, 0x1e, 0xb2, 0x60, 0xb5, + 0x33, 0x0a, 0xe9, 0x34, 0x38, 0x75, 0x42, 0xe2, 0x73, 0xb3, 0x26, 0x03, 0x28, 0x25, 0x43, 0x6f, + 0xa0, 0xb2, 0x7f, 0x1d, 0xd0, 0x90, 0x33, 0x13, 0xf2, 0x52, 0xa5, 0x02, 0xe9, 0x05, 0x34, 0x03, + 0x7d, 0x02, 0xb0, 0x7f, 0xcd, 0x43, 0xe7, 0x80, 0x0a, 0xb7, 0xd7, 0xe5, 0x71, 0x24, 0x24, 0xa8, + 0x0b, 0xe5, 0x23, 0xa7, 0x4f, 0x3c, 0x66, 0xae, 0x4a, 0xdd, 0xf6, 0x1d, 0x1c, 0xab, 0x08, 0x6a, + 0x21, 0xcd, 0x16, 0xb9, 0xe4, 0x98, 0xf0, 0x2b, 0x1a, 0x8e, 0xdf, 0xd1, 0x21, 0x31, 0x1b, 0x2a, + 0x97, 0x24, 0x44, 0xe8, 0x39, 0x34, 0x8e, 0xa9, 0x72, 0x9e, 0xeb, 0x71, 0x12, 0x9a, 0x6b, 0x72, + 0x33, 0x69, 0xa1, 0xcc, 0x9c, 0x9e, 0xc3, 0xcf, 0x69, 0x38, 0x61, 0xe6, 0x03, 0x89, 0x98, 0x0b, + 0x44, 0x04, 0xf5, 0xc8, 0x20, 0x24, 0x9c, 0x99, 0xeb, 0x79, 0x11, 0xa4, 0x40, 0x38, 0x02, 0x23, + 0x13, 0x2a, 0xbd, 0x8b, 0x49, 0xcf, 0xfd, 0x3d, 0x31, 0x1f, 0x6e, 0x1a, 0xad, 0x22, 0x8e, 0xa6, + 0xe8, 0x25, 0x14, 0x7b, 0xbd, 0x03, 0x13, 0x49, 0x6d, 0x1f, 0x65, 0x68, 0xeb, 0x1d, 0x60, 0x81, + 0x42, 0x08, 0x4a, 0x67, 0xce, 0x88, 0x99, 0x3f, 0x97, 0xfb, 0x92, 0x63, 0xf4, 0x18, 0xca, 0x67, + 0x4e, 0x38, 0x22, 0xdc, 0xdc, 0x90, 0x36, 0xeb, 0x19, 0x7a, 0x0d, 0x95, 0xf7, 0x9e, 0x3b, 0x71, + 0x39, 0x33, 0x1f, 0xe5, 0x5d, 0x3c, 0x05, 0x3a, 0x09, 0x38, 0x8e, 0xf0, 0xe8, 0x10, 0x56, 0x7b, + 0xb2, 0x54, 0x9f, 0xca, 0x02, 0x6d, 0x3e, 0x96, 0xfc, 0x17, 0xb6, 0x28, 0xcb, 0x76, 0x54, 0x96, + 0x05, 0x37, 0x59, 0xd0, 0x6d, 0x05, 0xc6, 0x29, 0x6a, 0xf3, 0x2d, 0xac, 0xa5, 0xaf, 0xc1, 0x92, + 0x4c, 0xb5, 0x91, 0xcc, 0x54, 0xb5, 0x44, 0x16, 0x6a, 0xbe, 0x86, 0x7a, 0xe2, 0xac, 0xef, 0x43, + 0xb5, 0x30, 0xac, 0x26, 0x73, 0x9b, 0x70, 0x5d, 0xa2, 0xc8, 0xc8, 0x31, 0xb2, 0x01, 0x12, 0x89, + 0xbd, 0xb0, 0x34, 0xb1, 0x27, 0x10, 0xd6, 0xdf, 0x0d, 0x68, 0xa4, 0xb2, 0x8d, 0x38, 0x57, 0x69, + 0x1e, 0x09, 0xb5, 0xe2, 0x68, 0x2a, 0xbe, 0xe8, 0xc0, 0x92, 0x8a, 0xab, 0x38, 0x9a, 0xca, 0x9d, + 0x4c, 0x3d, 0x4f, 0x26, 0xb5, 0x2a, 0x96, 0x63, 0x75, 0x4b, 0xc4, 0x85, 0x39, 0x9d, 0xb2, 0x0b, + 0x59, 0x8f, 0xaa, 0x38, 0x21, 0x99, 0x7f, 0x3f, 0xa2, 0xce, 0x50, 0x96, 0xa0, 0xf8, 0xbb, 0x90, + 0x88, 0x20, 0x38, 0x72, 0xfd, 0x31, 0x19, 0x9a, 0x65, 0xf9, 0x4d, 0xcf, 0xac, 0x7f, 0x19, 0x50, + 0x4f, 0x5c, 0x4b, 0x19, 0x40, 0xb3, 0x80, 0x44, 0x5e, 0x10, 0x63, 0xb4, 0x0b, 0x2b, 0x3b, 0x9c, + 0x87, 0xa2, 0x98, 0x8b, 0x18, 0xfc, 0xe2, 0xd6, 0xcb, 0x6d, 0x4b, 0xb8, 0xba, 0x7e, 0x8a, 0x2a, + 0x6e, 0xdf, 0x1e, 0x61, 0xdc, 0xf5, 0x1d, 0xe9, 0x4a, 0x55, 0x7a, 0x93, 0xa2, 0xe6, 0x2b, 0x80, + 0x39, 0xed, 0x5e, 0x27, 0xf9, 0x37, 0x03, 0x1e, 0x2e, 0x64, 0xb0, 0xa5, 0x96, 0x1c, 0xa4, 0x2d, + 0xd9, 0xba, 0x63, 0x36, 0x5c, 0xb4, 0xe7, 0xff, 0xd8, 0xed, 0x31, 0x94, 0x55, 0xd9, 0x58, 0xba, + 0xc3, 0x26, 0x54, 0xf7, 0x5c, 0xe6, 0xf4, 0x3d, 0x32, 0xd4, 0x61, 0x11, 0xcf, 0x65, 0xcd, 0x92, + 0xbb, 0x57, 0xde, 0x53, 0x13, 0x4b, 0xe5, 0x07, 0xb4, 0x06, 0x85, 0xb8, 0xbb, 0x2c, 0x1c, 0xee, + 0x09, 0xb0, 0x08, 0x61, 0x65, 0x6a, 0x0d, 0xab, 0x89, 0xd5, 0x85, 0xb2, 0xca, 0x38, 0x0b, 0xf8, + 0x26, 0x54, 0xbb, 0xae, 0x47, 0xe4, 0x15, 0x50, 0x7b, 0x8e, 0xe7, 0xc2, 0xbc, 0x7d, 0xff, 0x52, + 0x2f, 0x2b, 0x86, 0xd6, 0x76, 0xa2, 0x6c, 0x0b, 0x3b, 0x64, 0x3f, 0xa5, 0xed, 0x90, 0x5d, 0xd4, + 0x63, 0x28, 0x77, 0x69, 0x38, 0x71, 0xb8, 0x56, 0xa6, 0x67, 0x96, 0x05, 0x6b, 0x87, 0x3e, 0x0b, + 0xc8, 0x80, 0x67, 0x37, 0xe4, 0x27, 0xf0, 0x20, 0xc6, 0xe8, 0x56, 0x3c, 0xd1, 0x51, 0x1a, 0xf7, + 0xef, 0x28, 0xff, 0x6a, 0x40, 0x2d, 0xce, 0x62, 0xa8, 0x03, 0x65, 0x79, 0x1a, 0x51, 0x5f, 0xff, + 0xf2, 0x96, 0xb4, 0x67, 0x7f, 0x90, 0x68, 0x5d, 0x4d, 0x14, 0xb5, 0xf9, 0x23, 0xd4, 0x13, 0xe2, + 0x25, 0x01, 0xb0, 0x95, 0xee, 0xae, 0x9e, 0xe4, 0x2d, 0x92, 0x0c, 0x8f, 0x3d, 0x28, 0x2b, 0xe1, + 0x52, 0xb7, 0x22, 0x28, 0x1d, 0x38, 0xa1, 0x0a, 0x8d, 0x22, 0x96, 0x63, 0x21, 0xeb, 0xd1, 0x73, + 0x2e, 0x8f, 0xa7, 0x88, 0xe5, 0xd8, 0xfa, 0x87, 0x01, 0x0d, 0xdd, 0xa4, 0x6b, 0x0f, 0x12, 0x58, + 0x57, 0x37, 0x94, 0x84, 0x91, 0x4c, 0xdb, 0xff, 0x3a, 0xc7, 0x95, 0x11, 0xd4, 0xbe, 0xc9, 0x55, + 0xde, 0x58, 0x50, 0xd9, 0xec, 0xc0, 0xa3, 0xa5, 0xd0, 0x7b, 0x5d, 0x91, 0x17, 0xf0, 0x70, 0xfe, + 0xfc, 0xc8, 0x8e, 0x93, 0x0d, 0x40, 0x49, 0x98, 0x7e, 0x9e, 0x7c, 0x0a, 0x75, 0xf1, 0x9c, 0xcb, + 0xa6, 0x59, 0xb0, 0xaa, 0x00, 0xda, 0x33, 0x08, 0x4a, 0x63, 0x32, 0x53, 0xd1, 0x50, 0xc3, 0x72, + 0x6c, 0xfd, 0xd9, 0x10, 0xaf, 0xb2, 0x60, 0xca, 0xdf, 0x11, 0xc6, 0x9c, 0x91, 0x08, 0xc0, 0xd2, + 0xa1, 0xef, 0x72, 0x1d, 0x7d, 0x9f, 0xe5, 0xf4, 0xb6, 0x02, 0xa6, 0x59, 0x07, 0x3f, 0xc3, 0x92, + 0x25, 0xda, 0xd4, 0x3d, 0x87, 0x3b, 0x3a, 0x16, 0x32, 0xba, 0x23, 0x81, 0x48, 0x10, 0xc5, 0x74, + 0xb7, 0x22, 0x9e, 0xa0, 0xc1, 0x94, 0x5b, 0xcf, 0x61, 0xfd, 0xa6, 0xf6, 0x25, 0xa6, 0x7d, 0x0d, + 0xf5, 0x84, 0x16, 0x79, 0x6f, 0x4f, 0xba, 0x12, 0x50, 0xc5, 0x62, 0x28, 0x6c, 0x8d, 0x37, 0xb2, + 0xaa, 0xd6, 0xb0, 0x1e, 0x40, 0x43, 0xaa, 0x8e, 0x3d, 0xf8, 0x87, 0x02, 0x54, 0x22, 0x15, 0xdb, + 0x29, 0xbb, 0x9f, 0x66, 0xd9, 0xbd, 0x68, 0xf2, 0xb7, 0x50, 0x12, 0xf9, 0x23, 0xbf, 0xa7, 0xef, + 0x0e, 0x13, 0x34, 0x01, 0x47, 0xdf, 0x43, 0x19, 0x13, 0x26, 0xda, 0xa0, 0xdc, 0x96, 0x5e, 0x61, + 0xe6, 0x64, 0x4d, 0x12, 0xf4, 0x9e, 0x3b, 0xf2, 0x1d, 0x4f, 0x96, 0xc8, 0x4c, 0xba, 0xc2, 0x24, + 0xe8, 0x4a, 0x30, 0x77, 0xf7, 0x1f, 0x0d, 0xa8, 0xe7, 0xba, 0x3a, 0xff, 0x01, 0xbd, 0xf0, 0xa8, + 0x2f, 0xfe, 0x8f, 0x8f, 0xfa, 0x7f, 0x1b, 0x69, 0x45, 0xb2, 0xce, 0x8b, 0xfb, 0x14, 0x50, 0xd7, + 0xe7, 0x3a, 0x64, 0x13, 0x12, 0xb1, 0xd1, 0xce, 0x64, 0xa8, 0x93, 0xbe, 0x18, 0xce, 0x93, 0x77, + 0x51, 0x27, 0x6f, 0x11, 0x04, 0xef, 0x19, 0x09, 0xf5, 0xab, 0x56, 0x8e, 0x45, 0xbe, 0x3e, 0xa6, + 0x52, 0xaa, 0x7a, 0x07, 0x3d, 0x93, 0xfa, 0xae, 0x54, 0xd3, 0x20, 0xf4, 0x5d, 0xc9, 0x2a, 0x74, + 0x4c, 0x85, 0xac, 0x22, 0x81, 0x6a, 0x22, 0x70, 0x67, 0x7c, 0x66, 0x56, 0x55, 0xa8, 0x9d, 0xf1, + 0x99, 0x28, 0x28, 0x98, 0x7a, 0x5e, 0xdf, 0x19, 0x8c, 0xe5, 0xa3, 0xa1, 0x8a, 0xe3, 0xb9, 0xe8, + 0x7d, 0x84, 0x77, 0x5d, 0xc7, 0x33, 0x41, 0xf5, 0x3e, 0x7a, 0x6a, 0xed, 0x40, 0x2d, 0x0e, 0x0a, + 0x51, 0xa3, 0xba, 0x43, 0xe9, 0xf4, 0x06, 0x2e, 0x74, 0x87, 0x51, 0x3c, 0x17, 0x16, 0xe3, 0xb9, + 0x98, 0x88, 0xe7, 0x6d, 0x68, 0xa4, 0xc2, 0x43, 0x80, 0x30, 0xbd, 0x62, 0x5a, 0x91, 0x1c, 0x0b, + 0x59, 0x87, 0x7a, 0xea, 0xff, 0x89, 0x06, 0x96, 0x63, 0xeb, 0x19, 0x34, 0x52, 0x81, 0xb1, 0x2c, + 0x03, 0x5b, 0x4f, 0xa1, 0xd1, 0xe3, 0x0e, 0x9f, 0xe6, 0xfc, 0xa1, 0xf4, 0x1f, 0x03, 0xd6, 0x22, + 0x8c, 0xce, 0x31, 0xdf, 0x40, 0xf5, 0x92, 0x84, 0x9c, 0x5c, 0xc7, 0x55, 0xc7, 0x5c, 0x6c, 0x96, + 0x3f, 0x48, 0x04, 0x8e, 0x91, 0xe8, 0x3b, 0xa8, 0x32, 0xa9, 0x87, 0x44, 0x1d, 0xcb, 0x27, 0x59, + 0x2c, 0xbd, 0x5e, 0x8c, 0x47, 0x6d, 0x28, 0x79, 0x74, 0xc4, 0xe4, 0xb9, 0xd7, 0xb7, 0x3e, 0xce, + 0xe2, 0x1d, 0xd1, 0x11, 0x96, 0x40, 0xf4, 0x06, 0xaa, 0x57, 0x4e, 0xe8, 0xbb, 0xfe, 0x88, 0xc9, + 0x47, 0xb1, 0xb8, 0xb4, 0x19, 0xa4, 0x1f, 0x15, 0x0e, 0xc7, 0x04, 0xab, 0x21, 0xae, 0xcb, 0x39, + 0xd5, 0x3e, 0xb1, 0x7e, 0x2d, 0xa2, 0x56, 0x4c, 0xb5, 0xf9, 0x87, 0xd0, 0x50, 0x91, 0xff, 0x81, + 0x84, 0x4c, 0xf4, 0x7f, 0x46, 0xde, 0xed, 0xdc, 0x4d, 0x42, 0x71, 0x9a, 0x69, 0xfd, 0xa4, 0x0b, + 0x5b, 0x24, 0x10, 0xb1, 0x14, 0x38, 0x83, 0xb1, 0x33, 0x8a, 0xce, 0x29, 0x9a, 0x8a, 0x2f, 0x97, + 0x7a, 0x3d, 0x75, 0x41, 0xa3, 0xa9, 0x88, 0xcd, 0x90, 0x5c, 0xba, 0x6c, 0xde, 0x8a, 0xc6, 0xf3, + 0xad, 0x3f, 0x55, 0x00, 0x3a, 0xf1, 0x7e, 0xd0, 0x29, 0xac, 0xc8, 0xf5, 0x90, 0x95, 0x5b, 0x26, + 0xa5, 0xdd, 0xcd, 0x67, 0x77, 0x28, 0xa5, 0xe8, 0x83, 0x08, 0x7e, 0xd9, 0xde, 0xa0, 0xe7, 0x59, + 0x09, 0x21, 0xd9, 0x21, 0x35, 0x5f, 0xdc, 0x82, 0xd2, 0x7a, 0xdf, 0x43, 0x59, 0x45, 0x01, 0xca, + 0xca, 0x7a, 0xc9, 0xb8, 0x6d, 0x3e, 0xcf, 0x07, 0x29, 0xa5, 0x5f, 0x1a, 0x08, 0xeb, 0x9c, 0x88, + 0xac, 0x9c, 0xa2, 0xa7, 0x6f, 0x4c, 0x96, 0x03, 0x52, 0xf5, 0xa5, 0x65, 0xa0, 0x1f, 0xa0, 0xac, + 0xb2, 0x1a, 0xfa, 0xc5, 0x72, 0x42, 0xa4, 0x2f, 0xff, 0x73, 0xcb, 0xf8, 0xd2, 0x40, 0xef, 0xa0, + 0x24, 0xca, 0x39, 0xca, 0xa8, 0x4d, 0x89, 0x5e, 0xa0, 0x69, 0xe5, 0x41, 0xb4, 0x17, 0x7f, 0x02, + 0x98, 0x37, 0x15, 0x28, 0xe3, 0xff, 0x92, 0x85, 0xee, 0xa4, 0xd9, 0xba, 0x1d, 0xa8, 0x17, 0x78, + 0x27, 0x2a, 0xea, 0x39, 0x45, 0x99, 0xb5, 0x34, 0xbe, 0x46, 0x4d, 0x2b, 0x0f, 0xa2, 0xd5, 0x5d, + 0x40, 0x23, 0xf5, 0xef, 0x35, 0xfa, 0x3c, 0xdb, 0xc8, 0x9b, 0x7f, 0x86, 0x37, 0x5f, 0xde, 0x09, + 0xab, 0x57, 0xe2, 0xc9, 0xae, 0x4c, 0x7f, 0x46, 0xf6, 0x6d, 0x76, 0xa7, 0xff, 0x89, 0x6e, 0xb6, + 0xef, 0x8c, 0x57, 0xab, 0xee, 0x96, 0x7e, 0x53, 0x08, 0xfa, 0xfd, 0xb2, 0xfc, 0x53, 0xff, 0xeb, + 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x90, 0x18, 0xf3, 0xa0, 0x18, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/controller/pb/controller.proto b/controller/pb/controller.proto index f25ef748b84e..846fa1d99672 100644 --- a/controller/pb/controller.proto +++ b/controller/pb/controller.proto @@ -90,17 +90,16 @@ message NamedContext { message CommonOptions { string Builder = 1; - string MetadataFile = 2; - bool NoCache = 3; + bool NoCache = 2; // string Progress: no progress view on server side - bool Pull = 4; - bool ExportPush = 5; - bool ExportLoad = 6; + bool Pull = 3; + bool ExportPush = 4; + bool ExportLoad = 5; // TODO: we should remove Linked from the controllerapi, it's only used to // produce a single warning. To allow this, we need to move the default // export detection out from the controller server, as well as load the // driver on the controller client. - bool Linked = 7; + bool Linked = 6; } message ExportEntry { From e16151f7c8e8229cc78823d4c3ab8ac0e8cda15c Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Wed, 7 Jun 2023 01:57:25 +0200 Subject: [PATCH 5/5] build: mark result handle build as internal Signed-off-by: CrazyMax --- build/result.go | 1 + 1 file changed, 1 insertion(+) diff --git a/build/result.go b/build/result.go index 91ba9efad5ca..3cd37b7b70bc 100644 --- a/build/result.go +++ b/build/result.go @@ -160,6 +160,7 @@ func NewResultHandle(ctx context.Context, cc *client.Client, opt client.SolveOpt opt.Ref = "" opt.Exports = nil opt.CacheExports = nil + opt.Internal = true _, respErr = cc.Build(ctx, opt, "buildx", func(ctx context.Context, c gateway.Client) (*gateway.Result, error) { res, err := evalDefinition(ctx, c, def) if err != nil {