diff --git a/api/types/swarm/container.go b/api/types/swarm/container.go index 4a84f2e53f..7ea87caa38 100644 --- a/api/types/swarm/container.go +++ b/api/types/swarm/container.go @@ -3,20 +3,22 @@ package swarm import ( "time" + "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/mount" ) // ContainerSpec represents the spec of a container. type ContainerSpec struct { - Image string `json:",omitempty"` - Labels map[string]string `json:",omitempty"` - Command []string `json:",omitempty"` - Args []string `json:",omitempty"` - Env []string `json:",omitempty"` - Dir string `json:",omitempty"` - User string `json:",omitempty"` - Groups []string `json:",omitempty"` - TTY bool `json:",omitempty"` - Mounts []mount.Mount `json:",omitempty"` - StopGracePeriod *time.Duration `json:",omitempty"` + Image string `json:",omitempty"` + Labels map[string]string `json:",omitempty"` + Command []string `json:",omitempty"` + Args []string `json:",omitempty"` + Env []string `json:",omitempty"` + Dir string `json:",omitempty"` + User string `json:",omitempty"` + Groups []string `json:",omitempty"` + TTY bool `json:",omitempty"` + Mounts []mount.Mount `json:",omitempty"` + StopGracePeriod *time.Duration `json:",omitempty"` + Healthcheck *container.HealthConfig `json:",omitempty"` } diff --git a/cli/command/service/opts.go b/cli/command/service/opts.go index 5fdc56de05..0c91360c6e 100644 --- a/cli/command/service/opts.go +++ b/cli/command/service/opts.go @@ -8,6 +8,7 @@ import ( "strings" "time" + "github.com/docker/docker/api/types/container" mounttypes "github.com/docker/docker/api/types/mount" "github.com/docker/docker/api/types/swarm" "github.com/docker/docker/opts" @@ -68,6 +69,25 @@ func (c *nanoCPUs) Value() int64 { return int64(*c) } +// PositiveDurationOpt is an option type for time.Duration that uses a pointer. +// It bahave similarly to DurationOpt but only allows positive duration values. +type PositiveDurationOpt struct { + DurationOpt +} + +// Set a new value on the option. Setting a negative duration value will cause +// an error to be returned. +func (d *PositiveDurationOpt) Set(s string) error { + err := d.DurationOpt.Set(s) + if err != nil { + return err + } + if *d.DurationOpt.value < 0 { + return fmt.Errorf("duration cannot be negative") + } + return nil +} + // DurationOpt is an option type for time.Duration that uses a pointer. This // allows us to get nil values outside, instead of defaulting to 0 type DurationOpt struct { @@ -377,6 +397,47 @@ func (ldo *logDriverOptions) toLogDriver() *swarm.Driver { } } +type healthCheckOptions struct { + cmd string + interval PositiveDurationOpt + timeout PositiveDurationOpt + retries int + noHealthcheck bool +} + +func (opts *healthCheckOptions) toHealthConfig() (*container.HealthConfig, error) { + var healthConfig *container.HealthConfig + haveHealthSettings := opts.cmd != "" || + opts.interval.Value() != nil || + opts.timeout.Value() != nil || + opts.retries != 0 + if opts.noHealthcheck { + if haveHealthSettings { + return nil, fmt.Errorf("--%s conflicts with --health-* options", flagNoHealthcheck) + } + healthConfig = &container.HealthConfig{Test: []string{"NONE"}} + } else if haveHealthSettings { + var test []string + if opts.cmd != "" { + test = []string{"CMD-SHELL", opts.cmd} + } + var interval, timeout time.Duration + if ptr := opts.interval.Value(); ptr != nil { + interval = *ptr + } + if ptr := opts.timeout.Value(); ptr != nil { + timeout = *ptr + } + healthConfig = &container.HealthConfig{ + Test: test, + Interval: interval, + Timeout: timeout, + Retries: opts.retries, + } + } + return healthConfig, nil +} + // ValidatePort validates a string is in the expected format for a port definition func ValidatePort(value string) (string, error) { portMappings, err := nat.ParsePortSpec(value) @@ -416,6 +477,8 @@ type serviceOptions struct { registryAuth bool logDriver logDriverOptions + + healthcheck healthCheckOptions } func newServiceOptions() *serviceOptions { @@ -490,6 +553,12 @@ func (opts *serviceOptions) ToService() (swarm.ServiceSpec, error) { EndpointSpec: opts.endpoint.ToEndpointSpec(), } + healthConfig, err := opts.healthcheck.toHealthConfig() + if err != nil { + return service, err + } + service.TaskTemplate.ContainerSpec.Healthcheck = healthConfig + switch opts.mode { case "global": if opts.replicas.Value() != nil { @@ -541,6 +610,12 @@ func addServiceFlags(cmd *cobra.Command, opts *serviceOptions) { flags.StringVar(&opts.logDriver.name, flagLogDriver, "", "Logging driver for service") flags.Var(&opts.logDriver.opts, flagLogOpt, "Logging driver options") + + flags.StringVar(&opts.healthcheck.cmd, flagHealthCmd, "", "Command to run to check health") + flags.Var(&opts.healthcheck.interval, flagHealthInterval, "Time between running the check") + flags.Var(&opts.healthcheck.timeout, flagHealthTimeout, "Maximum time to allow one check to run") + flags.IntVar(&opts.healthcheck.retries, flagHealthRetries, 0, "Consecutive failures needed to report unhealthy") + flags.BoolVar(&opts.healthcheck.noHealthcheck, flagNoHealthcheck, false, "Disable any container-specified HEALTHCHECK") } const ( @@ -589,4 +664,9 @@ const ( flagRegistryAuth = "with-registry-auth" flagLogDriver = "log-driver" flagLogOpt = "log-opt" + flagHealthCmd = "health-cmd" + flagHealthInterval = "health-interval" + flagHealthRetries = "health-retries" + flagHealthTimeout = "health-timeout" + flagNoHealthcheck = "no-healthcheck" ) diff --git a/cli/command/service/opts_test.go b/cli/command/service/opts_test.go index 8ef3cacb45..52016cbfc5 100644 --- a/cli/command/service/opts_test.go +++ b/cli/command/service/opts_test.go @@ -1,9 +1,11 @@ package service import ( + "reflect" "testing" "time" + "github.com/docker/docker/api/types/container" mounttypes "github.com/docker/docker/api/types/mount" "github.com/docker/docker/pkg/testutil/assert" ) @@ -40,6 +42,15 @@ func TestDurationOptSetAndValue(t *testing.T) { var duration DurationOpt assert.NilError(t, duration.Set("300s")) assert.Equal(t, *duration.Value(), time.Duration(300*10e8)) + assert.NilError(t, duration.Set("-300s")) + assert.Equal(t, *duration.Value(), time.Duration(-300*10e8)) +} + +func TestPositiveDurationOptSetAndValue(t *testing.T) { + var duration PositiveDurationOpt + assert.NilError(t, duration.Set("300s")) + assert.Equal(t, *duration.Value(), time.Duration(300*10e8)) + assert.Error(t, duration.Set("-300s"), "cannot be negative") } func TestUint64OptString(t *testing.T) { @@ -201,3 +212,41 @@ func TestMountOptTypeConflict(t *testing.T) { assert.Error(t, m.Set("type=bind,target=/foo,source=/foo,volume-nocopy=true"), "cannot mix") assert.Error(t, m.Set("type=volume,target=/foo,source=/foo,bind-propagation=rprivate"), "cannot mix") } + +func TestHealthCheckOptionsToHealthConfig(t *testing.T) { + dur := time.Second + opt := healthCheckOptions{ + cmd: "curl", + interval: PositiveDurationOpt{DurationOpt{value: &dur}}, + timeout: PositiveDurationOpt{DurationOpt{value: &dur}}, + retries: 10, + } + config, err := opt.toHealthConfig() + assert.NilError(t, err) + assert.Equal(t, reflect.DeepEqual(config, &container.HealthConfig{ + Test: []string{"CMD-SHELL", "curl"}, + Interval: time.Second, + Timeout: time.Second, + Retries: 10, + }), true) +} + +func TestHealthCheckOptionsToHealthConfigNoHealthcheck(t *testing.T) { + opt := healthCheckOptions{ + noHealthcheck: true, + } + config, err := opt.toHealthConfig() + assert.NilError(t, err) + assert.Equal(t, reflect.DeepEqual(config, &container.HealthConfig{ + Test: []string{"NONE"}, + }), true) +} + +func TestHealthCheckOptionsToHealthConfigConflict(t *testing.T) { + opt := healthCheckOptions{ + cmd: "curl", + noHealthcheck: true, + } + _, err := opt.toHealthConfig() + assert.Error(t, err, "--no-healthcheck conflicts with --health-* options") +} diff --git a/cli/command/service/update.go b/cli/command/service/update.go index e1f7cad66b..356c27a5c6 100644 --- a/cli/command/service/update.go +++ b/cli/command/service/update.go @@ -9,6 +9,7 @@ import ( "golang.org/x/net/context" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" mounttypes "github.com/docker/docker/api/types/mount" "github.com/docker/docker/api/types/swarm" "github.com/docker/docker/cli" @@ -266,6 +267,10 @@ func updateService(flags *pflag.FlagSet, spec *swarm.ServiceSpec) error { spec.TaskTemplate.ForceUpdate++ } + if err := updateHealthcheck(flags, cspec); err != nil { + return err + } + return nil } @@ -537,3 +542,48 @@ func updateLogDriver(flags *pflag.FlagSet, taskTemplate *swarm.TaskSpec) error { return nil } + +func updateHealthcheck(flags *pflag.FlagSet, containerSpec *swarm.ContainerSpec) error { + if !anyChanged(flags, flagNoHealthcheck, flagHealthCmd, flagHealthInterval, flagHealthRetries, flagHealthTimeout) { + return nil + } + if containerSpec.Healthcheck == nil { + containerSpec.Healthcheck = &container.HealthConfig{} + } + noHealthcheck, err := flags.GetBool(flagNoHealthcheck) + if err != nil { + return err + } + if noHealthcheck { + if !anyChanged(flags, flagHealthCmd, flagHealthInterval, flagHealthRetries, flagHealthTimeout) { + containerSpec.Healthcheck = &container.HealthConfig{ + Test: []string{"NONE"}, + } + return nil + } + return fmt.Errorf("--%s conflicts with --health-* options", flagNoHealthcheck) + } + if len(containerSpec.Healthcheck.Test) > 0 && containerSpec.Healthcheck.Test[0] == "NONE" { + containerSpec.Healthcheck.Test = nil + } + if flags.Changed(flagHealthInterval) { + val := *flags.Lookup(flagHealthInterval).Value.(*PositiveDurationOpt).Value() + containerSpec.Healthcheck.Interval = val + } + if flags.Changed(flagHealthTimeout) { + val := *flags.Lookup(flagHealthTimeout).Value.(*PositiveDurationOpt).Value() + containerSpec.Healthcheck.Timeout = val + } + if flags.Changed(flagHealthRetries) { + containerSpec.Healthcheck.Retries, _ = flags.GetInt(flagHealthRetries) + } + if flags.Changed(flagHealthCmd) { + cmd, _ := flags.GetString(flagHealthCmd) + if cmd != "" { + containerSpec.Healthcheck.Test = []string{"CMD-SHELL", cmd} + } else { + containerSpec.Healthcheck.Test = nil + } + } + return nil +} diff --git a/cli/command/service/update_test.go b/cli/command/service/update_test.go index 6e68e977ac..731358753e 100644 --- a/cli/command/service/update_test.go +++ b/cli/command/service/update_test.go @@ -1,9 +1,12 @@ package service import ( + "reflect" "sort" "testing" + "time" + "github.com/docker/docker/api/types/container" mounttypes "github.com/docker/docker/api/types/mount" "github.com/docker/docker/api/types/swarm" "github.com/docker/docker/pkg/testutil/assert" @@ -196,3 +199,79 @@ func TestUpdatePortsConflictingFlags(t *testing.T) { err := updatePorts(flags, &portConfigs) assert.Error(t, err, "conflicting port mapping") } + +func TestUpdateHealthcheckTable(t *testing.T) { + type test struct { + flags [][2]string + initial *container.HealthConfig + expected *container.HealthConfig + err string + } + testCases := []test{ + { + flags: [][2]string{{"no-healthcheck", "true"}}, + initial: &container.HealthConfig{Test: []string{"CMD-SHELL", "cmd1"}, Retries: 10}, + expected: &container.HealthConfig{Test: []string{"NONE"}}, + }, + { + flags: [][2]string{{"health-cmd", "cmd1"}}, + initial: &container.HealthConfig{Test: []string{"NONE"}}, + expected: &container.HealthConfig{Test: []string{"CMD-SHELL", "cmd1"}}, + }, + { + flags: [][2]string{{"health-retries", "10"}}, + initial: &container.HealthConfig{Test: []string{"NONE"}}, + expected: &container.HealthConfig{Retries: 10}, + }, + { + flags: [][2]string{{"health-retries", "10"}}, + initial: &container.HealthConfig{Test: []string{"CMD", "cmd1"}}, + expected: &container.HealthConfig{Test: []string{"CMD", "cmd1"}, Retries: 10}, + }, + { + flags: [][2]string{{"health-interval", "1m"}}, + initial: &container.HealthConfig{Test: []string{"CMD", "cmd1"}}, + expected: &container.HealthConfig{Test: []string{"CMD", "cmd1"}, Interval: time.Minute}, + }, + { + flags: [][2]string{{"health-cmd", ""}}, + initial: &container.HealthConfig{Test: []string{"CMD", "cmd1"}, Retries: 10}, + expected: &container.HealthConfig{Retries: 10}, + }, + { + flags: [][2]string{{"health-retries", "0"}}, + initial: &container.HealthConfig{Test: []string{"CMD", "cmd1"}, Retries: 10}, + expected: &container.HealthConfig{Test: []string{"CMD", "cmd1"}}, + }, + { + flags: [][2]string{{"health-cmd", "cmd1"}, {"no-healthcheck", "true"}}, + err: "--no-healthcheck conflicts with --health-* options", + }, + { + flags: [][2]string{{"health-interval", "10m"}, {"no-healthcheck", "true"}}, + err: "--no-healthcheck conflicts with --health-* options", + }, + { + flags: [][2]string{{"health-timeout", "1m"}, {"no-healthcheck", "true"}}, + err: "--no-healthcheck conflicts with --health-* options", + }, + } + for i, c := range testCases { + flags := newUpdateCommand(nil).Flags() + for _, flag := range c.flags { + flags.Set(flag[0], flag[1]) + } + cspec := &swarm.ContainerSpec{ + Healthcheck: c.initial, + } + err := updateHealthcheck(flags, cspec) + if c.err != "" { + assert.Error(t, err, c.err) + } else { + assert.NilError(t, err) + if !reflect.DeepEqual(cspec.Healthcheck, c.expected) { + t.Errorf("incorrect result for test %d, expected health config:\n\t%#v\ngot:\n\t%#v", i, c.expected, cspec.Healthcheck) + } + } + } +} diff --git a/contrib/completion/bash/docker b/contrib/completion/bash/docker index 813f17e45b..e1fa2aa5eb 100644 --- a/contrib/completion/bash/docker +++ b/contrib/completion/bash/docker @@ -2574,6 +2574,10 @@ _docker_service_update() { --env -e --force --group-add + --health-cmd + --health-interval + --health-retries + --health-timeout --label -l --limit-cpu --limit-memory @@ -2581,6 +2585,7 @@ _docker_service_update() { --log-opt --mount --network + --no-healthcheck --publish -p --replicas --reserve-cpu diff --git a/contrib/completion/zsh/_docker b/contrib/completion/zsh/_docker index a2330b62d3..cb54e8dfc7 100644 --- a/contrib/completion/zsh/_docker +++ b/contrib/completion/zsh/_docker @@ -1089,6 +1089,10 @@ __docker_service_subcommand() { "($help)--endpoint-mode=[Placement constraints]:mode:(dnsrr vip)" "($help)*"{-e=,--env=}"[Set environment variables]:env: " "($help)*--group-add=[Add additional user groups to the container]:group:_groups" + "($help)--health-cmd=[Command to run to check health]:command: " + "($help)--health-interval=[Time between running the check]:time: " + "($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)" + "($help)--health-timeout=[Maximum time to allow one check to run]:time: " "($help)*--label=[Service labels]:label: " "($help)--limit-cpu=[Limit CPUs]:value: " "($help)--limit-memory=[Limit Memory]:value: " @@ -1096,6 +1100,7 @@ __docker_service_subcommand() { "($help)*--log-opt=[Logging driver options]:log driver options:__docker_log_options" "($help)*--mount=[Attach a mount to the service]:mount: " "($help)*--network=[Network attachments]:network: " + "($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]" "($help)*"{-p=,--publish=}"[Publish a port as a node port]:port: " "($help)--replicas=[Number of tasks]:replicas: " "($help)--reserve-cpu=[Reserve CPUs]:value: " diff --git a/daemon/cluster/convert/container.go b/daemon/cluster/convert/container.go index 7cac7960b6..36c4aed52f 100644 --- a/daemon/cluster/convert/container.go +++ b/daemon/cluster/convert/container.go @@ -4,6 +4,7 @@ import ( "fmt" "strings" + container "github.com/docker/docker/api/types/container" mounttypes "github.com/docker/docker/api/types/mount" types "github.com/docker/docker/api/types/swarm" swarmapi "github.com/docker/swarmkit/api" @@ -56,6 +57,11 @@ func containerSpecFromGRPC(c *swarmapi.ContainerSpec) types.ContainerSpec { grace, _ := ptypes.Duration(c.StopGracePeriod) containerSpec.StopGracePeriod = &grace } + + if c.Healthcheck != nil { + containerSpec.Healthcheck = healthConfigFromGRPC(c.Healthcheck) + } + return containerSpec } @@ -115,5 +121,29 @@ func containerToGRPC(c types.ContainerSpec) (*swarmapi.ContainerSpec, error) { containerSpec.Mounts = append(containerSpec.Mounts, mount) } + if c.Healthcheck != nil { + containerSpec.Healthcheck = healthConfigToGRPC(c.Healthcheck) + } + return containerSpec, nil } + +func healthConfigFromGRPC(h *swarmapi.HealthConfig) *container.HealthConfig { + interval, _ := ptypes.Duration(h.Interval) + timeout, _ := ptypes.Duration(h.Timeout) + return &container.HealthConfig{ + Test: h.Test, + Interval: interval, + Timeout: timeout, + Retries: int(h.Retries), + } +} + +func healthConfigToGRPC(h *container.HealthConfig) *swarmapi.HealthConfig { + return &swarmapi.HealthConfig{ + Test: h.Test, + Interval: ptypes.DurationProto(h.Interval), + Timeout: ptypes.DurationProto(h.Timeout), + Retries: int32(h.Retries), + } +} diff --git a/daemon/cluster/executor/container/container.go b/daemon/cluster/executor/container/container.go index fffa7fab62..7b5203715f 100644 --- a/daemon/cluster/executor/container/container.go +++ b/daemon/cluster/executor/container/container.go @@ -18,6 +18,7 @@ import ( "github.com/docker/docker/reference" "github.com/docker/swarmkit/agent/exec" "github.com/docker/swarmkit/api" + "github.com/docker/swarmkit/protobuf/ptypes" ) const ( @@ -124,12 +125,13 @@ func (c *containerConfig) image() string { func (c *containerConfig) config() *enginecontainer.Config { config := &enginecontainer.Config{ - Labels: c.labels(), - User: c.spec().User, - Env: c.spec().Env, - WorkingDir: c.spec().Dir, - Image: c.image(), - Volumes: c.volumes(), + Labels: c.labels(), + User: c.spec().User, + Env: c.spec().Env, + WorkingDir: c.spec().Dir, + Image: c.image(), + Volumes: c.volumes(), + Healthcheck: c.healthcheck(), } if len(c.spec().Command) > 0 { @@ -224,6 +226,21 @@ func (c *containerConfig) binds() []string { return r } +func (c *containerConfig) healthcheck() *enginecontainer.HealthConfig { + hcSpec := c.spec().Healthcheck + if hcSpec == nil { + return nil + } + interval, _ := ptypes.Duration(hcSpec.Interval) + timeout, _ := ptypes.Duration(hcSpec.Timeout) + return &enginecontainer.HealthConfig{ + Test: hcSpec.Test, + Interval: interval, + Timeout: timeout, + Retries: int(hcSpec.Retries), + } +} + func getMountMask(m *api.Mount) string { var maskOpts []string if m.ReadOnly { diff --git a/docs/reference/commandline/service_create.md b/docs/reference/commandline/service_create.md index 3feaf6435d..2c023f0c51 100644 --- a/docs/reference/commandline/service_create.md +++ b/docs/reference/commandline/service_create.md @@ -27,6 +27,10 @@ Options: -e, --env value Set environment variables (default []) --env-file value Read in a file of environment variables (default []) --group-add value Add additional user groups to the container (default []) + --health-cmd string Command to run to check health + --health-interval duration Time between running the check + --health-retries int Consecutive failures needed to report unhealthy + --health-timeout duration Maximum time to allow one check to run --help Print usage -l, --label value Service labels (default []) --limit-cpu value Limit CPUs (default 0.000) @@ -37,6 +41,7 @@ Options: --mount value Attach a mount to the service --name string Service name --network value Network attachments (default []) + --no-healthcheck Disable any container-specified HEALTHCHECK -p, --publish value Publish a port as a node port (default []) --replicas value Number of tasks (default none) --reserve-cpu value Reserve CPUs (default 0.000) diff --git a/docs/reference/commandline/service_update.md b/docs/reference/commandline/service_update.md index c30e5e973e..58ffe6e442 100644 --- a/docs/reference/commandline/service_update.md +++ b/docs/reference/commandline/service_update.md @@ -32,6 +32,10 @@ Options: --force Force update even if no changes require it --group-add value Add additional user groups to the container (default []) --group-rm value Remove previously added user groups from the container (default []) + --health-cmd string Command to run to check health + --health-interval duration Time between running the check + --health-retries int Consecutive failures needed to report unhealthy + --health-timeout duration Maximum time to allow one check to run --help Print usage --image string Service image tag --label-add value Add or update service labels (default []) @@ -42,6 +46,7 @@ Options: --log-opt value Logging driver options (default []) --mount-add value Add or update a mount on a service --mount-rm value Remove a mount by its target path (default []) + --no-healthcheck Disable any container-specified HEALTHCHECK --publish-add value Add or update a published port (default []) --publish-rm value Remove a published port by its target port (default []) --replicas value Number of tasks (default none) diff --git a/hack/vendor.sh b/hack/vendor.sh index e8db101e56..03d7a8de92 100755 --- a/hack/vendor.sh +++ b/hack/vendor.sh @@ -147,7 +147,7 @@ clone git github.com/docker/containerd 52ef1ceb4b660c42cf4ea9013180a5663968d4c7 clone git github.com/tonistiigi/fifo 8c56881ce5e63e19e2dfc495c8af0fb90916467d # cluster -clone git github.com/docker/swarmkit 0ec7c6ee4b3185ec4e3d6bd65f8f5542b1761421 +clone git github.com/docker/swarmkit 72981f443024da2c57d54b915eae0477be6dada5 clone git github.com/golang/mock bd3c8e81be01eef76d4b503f5e687d2d1354d2d9 clone git github.com/gogo/protobuf v0.3 clone git github.com/cloudflare/cfssl 7fb22c8cba7ecaf98e4082d22d65800cf45e042a diff --git a/vendor/src/github.com/docker/swarmkit/agent/exec/controller.go b/vendor/src/github.com/docker/swarmkit/agent/exec/controller.go index 2a70cc2138..9b1e4039db 100644 --- a/vendor/src/github.com/docker/swarmkit/agent/exec/controller.go +++ b/vendor/src/github.com/docker/swarmkit/agent/exec/controller.go @@ -54,6 +54,13 @@ type ContainerStatuser interface { ContainerStatus(ctx context.Context) (*api.ContainerStatus, error) } +// PortStatuser reports status of ports which are allocated by the executor +type PortStatuser interface { + // PortStatus returns the status on a list of PortConfigs + // which are managed at the host level by the controller. + PortStatus(ctx context.Context) (*api.PortStatus, error) +} + // Resolve attempts to get a controller from the executor and reports the // correct status depending on the tasks current state according to the result. // @@ -131,6 +138,7 @@ func Do(ctx context.Context, task *api.Task, ctlr Controller) (*api.TaskStatus, // this particular method. Eventually, we assemble this as part of a defer. var ( containerStatus *api.ContainerStatus + portStatus *api.PortStatus exitCode int ) @@ -230,6 +238,21 @@ func Do(ctx context.Context, task *api.Task, ctlr Controller) (*api.TaskStatus, status.RuntimeStatus = &api.TaskStatus_Container{ Container: containerStatus, } + + if portStatus == nil { + pctlr, ok := ctlr.(PortStatuser) + if !ok { + return + } + + var err error + portStatus, err = pctlr.PortStatus(ctx) + if err != nil && !contextDoneError(err) { + log.G(ctx).WithError(err).Error("container port status unavailable") + } + } + + status.PortStatus = portStatus }() if task.DesiredState == api.TaskStateShutdown { diff --git a/vendor/src/github.com/docker/swarmkit/agent/exec/controller_test.mock.go b/vendor/src/github.com/docker/swarmkit/agent/exec/controller_test.mock.go index 3b2a1a740f..8a20bc620b 100644 --- a/vendor/src/github.com/docker/swarmkit/agent/exec/controller_test.mock.go +++ b/vendor/src/github.com/docker/swarmkit/agent/exec/controller_test.mock.go @@ -141,3 +141,35 @@ func (_m *MockContainerStatuser) ContainerStatus(ctx context.Context) (*api.Cont func (_mr *_MockContainerStatuserRecorder) ContainerStatus(arg0 interface{}) *gomock.Call { return _mr.mock.ctrl.RecordCall(_mr.mock, "ContainerStatus", arg0) } + +// Mock of PortStatuser interface +type MockPortStatuser struct { + ctrl *gomock.Controller + recorder *_MockPortStatuserRecorder +} + +// Recorder for MockPortStatuser (not exported) +type _MockPortStatuserRecorder struct { + mock *MockPortStatuser +} + +func NewMockPortStatuser(ctrl *gomock.Controller) *MockPortStatuser { + mock := &MockPortStatuser{ctrl: ctrl} + mock.recorder = &_MockPortStatuserRecorder{mock} + return mock +} + +func (_m *MockPortStatuser) EXPECT() *_MockPortStatuserRecorder { + return _m.recorder +} + +func (_m *MockPortStatuser) PortStatus(ctx context.Context) (*api.PortStatus, error) { + ret := _m.ctrl.Call(_m, "PortStatus", ctx) + ret0, _ := ret[0].(*api.PortStatus) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +func (_mr *_MockPortStatuserRecorder) PortStatus(arg0 interface{}) *gomock.Call { + return _mr.mock.ctrl.RecordCall(_mr.mock, "PortStatus", arg0) +} diff --git a/vendor/src/github.com/docker/swarmkit/api/specs.pb.go b/vendor/src/github.com/docker/swarmkit/api/specs.pb.go index edeff78329..3e4f0185d4 100644 --- a/vendor/src/github.com/docker/swarmkit/api/specs.pb.go +++ b/vendor/src/github.com/docker/swarmkit/api/specs.pb.go @@ -489,6 +489,11 @@ type ContainerSpec struct { Secrets []*SecretReference `protobuf:"bytes,12,rep,name=secrets" json:"secrets,omitempty"` // DNSConfig allows one to specify DNS related configuration in resolv.conf DNSConfig *ContainerSpec_DNSConfig `protobuf:"bytes,15,opt,name=dns_config,json=dnsConfig" json:"dns_config,omitempty"` + // Healthcheck describes how to check the container is healthy. If the + // container is considered unhealthy, it will be destroyed, its creating + // task will exit and a new task will be rescheduled elsewhere. A container + // is considered unhealthy after `Retries` number of consecutive failures. + Healthcheck *HealthConfig `protobuf:"bytes,16,opt,name=healthcheck" json:"healthcheck,omitempty"` } func (m *ContainerSpec) Reset() { *m = ContainerSpec{} } @@ -756,6 +761,7 @@ func (m *ContainerSpec) Copy() *ContainerSpec { StopGracePeriod: m.StopGracePeriod.Copy(), PullOptions: m.PullOptions.Copy(), DNSConfig: m.DNSConfig.Copy(), + Healthcheck: m.Healthcheck.Copy(), } if m.Labels != nil { @@ -1035,7 +1041,7 @@ func (this *ContainerSpec) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 19) + s := make([]string, 0, 20) s = append(s, "&api.ContainerSpec{") s = append(s, "Image: "+fmt.Sprintf("%#v", this.Image)+",\n") keysForLabels := make([]string, 0, len(this.Labels)) @@ -1074,6 +1080,9 @@ func (this *ContainerSpec) GoString() string { if this.DNSConfig != nil { s = append(s, "DNSConfig: "+fmt.Sprintf("%#v", this.DNSConfig)+",\n") } + if this.Healthcheck != nil { + s = append(s, "Healthcheck: "+fmt.Sprintf("%#v", this.Healthcheck)+",\n") + } s = append(s, "}") return strings.Join(s, "") } @@ -1681,6 +1690,18 @@ func (m *ContainerSpec) MarshalTo(data []byte) (int, error) { } i += n18 } + if m.Healthcheck != nil { + data[i] = 0x82 + i++ + data[i] = 0x1 + i++ + i = encodeVarintSpecs(data, i, uint64(m.Healthcheck.Size())) + n19, err := m.Healthcheck.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n19 + } return i, nil } @@ -1826,20 +1847,20 @@ func (m *NetworkSpec) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintSpecs(data, i, uint64(m.Annotations.Size())) - n19, err := m.Annotations.MarshalTo(data[i:]) + n20, err := m.Annotations.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n19 + i += n20 if m.DriverConfig != nil { data[i] = 0x12 i++ i = encodeVarintSpecs(data, i, uint64(m.DriverConfig.Size())) - n20, err := m.DriverConfig.MarshalTo(data[i:]) + n21, err := m.DriverConfig.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n20 + i += n21 } if m.Ipv6Enabled { data[i] = 0x18 @@ -1865,11 +1886,11 @@ func (m *NetworkSpec) MarshalTo(data []byte) (int, error) { data[i] = 0x2a i++ i = encodeVarintSpecs(data, i, uint64(m.IPAM.Size())) - n21, err := m.IPAM.MarshalTo(data[i:]) + n22, err := m.IPAM.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n21 + i += n22 } if m.Attachable { data[i] = 0x30 @@ -1902,59 +1923,59 @@ func (m *ClusterSpec) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintSpecs(data, i, uint64(m.Annotations.Size())) - n22, err := m.Annotations.MarshalTo(data[i:]) - if err != nil { - return 0, err - } - i += n22 - data[i] = 0x12 - i++ - i = encodeVarintSpecs(data, i, uint64(m.AcceptancePolicy.Size())) - n23, err := m.AcceptancePolicy.MarshalTo(data[i:]) + n23, err := m.Annotations.MarshalTo(data[i:]) if err != nil { return 0, err } i += n23 - data[i] = 0x1a + data[i] = 0x12 i++ - i = encodeVarintSpecs(data, i, uint64(m.Orchestration.Size())) - n24, err := m.Orchestration.MarshalTo(data[i:]) + i = encodeVarintSpecs(data, i, uint64(m.AcceptancePolicy.Size())) + n24, err := m.AcceptancePolicy.MarshalTo(data[i:]) if err != nil { return 0, err } i += n24 - data[i] = 0x22 + data[i] = 0x1a i++ - i = encodeVarintSpecs(data, i, uint64(m.Raft.Size())) - n25, err := m.Raft.MarshalTo(data[i:]) + i = encodeVarintSpecs(data, i, uint64(m.Orchestration.Size())) + n25, err := m.Orchestration.MarshalTo(data[i:]) if err != nil { return 0, err } i += n25 - data[i] = 0x2a + data[i] = 0x22 i++ - i = encodeVarintSpecs(data, i, uint64(m.Dispatcher.Size())) - n26, err := m.Dispatcher.MarshalTo(data[i:]) + i = encodeVarintSpecs(data, i, uint64(m.Raft.Size())) + n26, err := m.Raft.MarshalTo(data[i:]) if err != nil { return 0, err } i += n26 - data[i] = 0x32 + data[i] = 0x2a i++ - i = encodeVarintSpecs(data, i, uint64(m.CAConfig.Size())) - n27, err := m.CAConfig.MarshalTo(data[i:]) + i = encodeVarintSpecs(data, i, uint64(m.Dispatcher.Size())) + n27, err := m.Dispatcher.MarshalTo(data[i:]) if err != nil { return 0, err } i += n27 - data[i] = 0x3a + data[i] = 0x32 i++ - i = encodeVarintSpecs(data, i, uint64(m.TaskDefaults.Size())) - n28, err := m.TaskDefaults.MarshalTo(data[i:]) + i = encodeVarintSpecs(data, i, uint64(m.CAConfig.Size())) + n28, err := m.CAConfig.MarshalTo(data[i:]) if err != nil { return 0, err } i += n28 + data[i] = 0x3a + i++ + i = encodeVarintSpecs(data, i, uint64(m.TaskDefaults.Size())) + n29, err := m.TaskDefaults.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n29 return i, nil } @@ -1976,11 +1997,11 @@ func (m *SecretSpec) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintSpecs(data, i, uint64(m.Annotations.Size())) - n29, err := m.Annotations.MarshalTo(data[i:]) + n30, err := m.Annotations.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n29 + i += n30 if len(m.Data) > 0 { data[i] = 0x12 i++ @@ -2235,6 +2256,10 @@ func (m *ContainerSpec) Size() (n int) { l = m.DNSConfig.Size() n += 1 + l + sovSpecs(uint64(l)) } + if m.Healthcheck != nil { + l = m.Healthcheck.Size() + n += 2 + l + sovSpecs(uint64(l)) + } return n } @@ -2500,6 +2525,7 @@ func (this *ContainerSpec) String() string { `TTY:` + fmt.Sprintf("%v", this.TTY) + `,`, `Hostname:` + fmt.Sprintf("%v", this.Hostname) + `,`, `DNSConfig:` + strings.Replace(fmt.Sprintf("%v", this.DNSConfig), "ContainerSpec_DNSConfig", "ContainerSpec_DNSConfig", 1) + `,`, + `Healthcheck:` + strings.Replace(fmt.Sprintf("%v", this.Healthcheck), "HealthConfig", "HealthConfig", 1) + `,`, `}`, }, "") return s @@ -4047,6 +4073,39 @@ func (m *ContainerSpec) Unmarshal(data []byte) error { return err } iNdEx = postIndex + case 16: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Healthcheck", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSpecs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSpecs + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Healthcheck == nil { + m.Healthcheck = &HealthConfig{} + } + if err := m.Healthcheck.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipSpecs(data[iNdEx:]) @@ -5069,103 +5128,105 @@ var ( func init() { proto.RegisterFile("specs.proto", fileDescriptorSpecs) } var fileDescriptorSpecs = []byte{ - // 1563 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x57, 0xcd, 0x6e, 0x23, 0xc7, - 0x11, 0xe6, 0x88, 0x14, 0x7f, 0x6a, 0xc8, 0x5d, 0x6e, 0xc3, 0x3f, 0xb3, 0xb4, 0x43, 0x72, 0xe9, - 0x8d, 0x23, 0xc7, 0x88, 0x36, 0x61, 0x02, 0x67, 0x9d, 0x8d, 0x91, 0xf0, 0x2f, 0x5a, 0x46, 0x91, - 0x4c, 0xb4, 0xe4, 0x05, 0xf6, 0x44, 0xb4, 0x66, 0x5a, 0xe4, 0x40, 0xc3, 0xe9, 0x49, 0x4f, 0x0f, - 0x0d, 0xdd, 0x72, 0x34, 0xf6, 0x90, 0x37, 0xd0, 0x29, 0x40, 0xde, 0x20, 0xef, 0xb0, 0xc7, 0x1c, - 0x73, 0x12, 0x2c, 0x3e, 0x41, 0x80, 0xbc, 0x40, 0xd0, 0x3d, 0x3d, 0xe4, 0x30, 0x1e, 0x59, 0x06, - 0xa2, 0x5b, 0x77, 0xcd, 0xf7, 0x55, 0x77, 0x57, 0x7d, 0xac, 0x2a, 0x82, 0x19, 0x06, 0xd4, 0x0e, + // 1586 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x57, 0xdd, 0x6e, 0xe3, 0xc6, + 0x15, 0x16, 0x2d, 0x59, 0x3f, 0x87, 0xd2, 0xae, 0x76, 0x90, 0x1f, 0xae, 0x92, 0x4a, 0x5a, 0x65, + 0x9b, 0x3a, 0x0d, 0xea, 0x6d, 0xd5, 0x22, 0xdd, 0x74, 0x1b, 0xb4, 0xfa, 0xab, 0x57, 0x75, 0xed, + 0x08, 0x63, 0x67, 0x81, 0xbd, 0x12, 0xc6, 0xe4, 0x58, 0x22, 0x4c, 0x71, 0xd8, 0xe1, 0x50, 0x81, + 0xef, 0x7a, 0x19, 0xec, 0x45, 0xdf, 0xc0, 0x57, 0x2d, 0xfa, 0x06, 0x7d, 0x87, 0xbd, 0xec, 0x65, + 0xaf, 0x8c, 0x5a, 0x4f, 0x50, 0xa0, 0x2f, 0x50, 0xcc, 0x70, 0x28, 0x51, 0x0d, 0x1d, 0x07, 0xa8, + 0xef, 0x66, 0x0e, 0xbf, 0xef, 0x70, 0xe6, 0x9c, 0x8f, 0xe7, 0x1c, 0x82, 0x19, 0x06, 0xd4, 0x0e, 0xf7, 0x03, 0xce, 0x04, 0x43, 0xc8, 0x61, 0xf6, 0x05, 0xe5, 0xfb, 0xe1, 0xd7, 0x84, 0x2f, 0x2e, - 0x5c, 0xb1, 0xbf, 0xfc, 0x45, 0xc3, 0x14, 0x97, 0x01, 0xd5, 0x80, 0xc6, 0x3b, 0x33, 0x36, 0x63, + 0x5c, 0xb1, 0xbf, 0xfc, 0x59, 0xc3, 0x14, 0x97, 0x01, 0xd5, 0x80, 0xc6, 0x3b, 0x33, 0x36, 0x63, 0x6a, 0xf9, 0x4c, 0xae, 0xb4, 0xf5, 0x7d, 0x27, 0xe2, 0x44, 0xb8, 0xcc, 0x7f, 0x96, 0x2c, 0xe2, - 0x0f, 0x9d, 0xbf, 0x16, 0xa0, 0x7c, 0xcc, 0x1c, 0x7a, 0x12, 0x50, 0x1b, 0x1d, 0x80, 0x49, 0x7c, - 0x9f, 0x09, 0x05, 0x08, 0x2d, 0xa3, 0x6d, 0xec, 0x99, 0xdd, 0xd6, 0xfe, 0x77, 0x8f, 0xdc, 0xef, - 0x6d, 0x60, 0xfd, 0xc2, 0xdb, 0xeb, 0x56, 0x0e, 0xa7, 0x99, 0xe8, 0xe7, 0x50, 0xe0, 0xcc, 0xa3, - 0xd6, 0x4e, 0xdb, 0xd8, 0x7b, 0xd0, 0xfd, 0x30, 0xcb, 0x83, 0x3c, 0x14, 0x33, 0x8f, 0x62, 0x85, - 0x44, 0x07, 0x00, 0x0b, 0xba, 0x38, 0xa3, 0x3c, 0x9c, 0xbb, 0x81, 0x95, 0x57, 0xbc, 0x9f, 0xdc, - 0xc6, 0x93, 0x97, 0xdd, 0x3f, 0x5a, 0xc3, 0x71, 0x8a, 0x8a, 0x8e, 0xa0, 0x4a, 0x96, 0xc4, 0xf5, - 0xc8, 0x99, 0xeb, 0xb9, 0xe2, 0xd2, 0x2a, 0x28, 0x57, 0x9f, 0x7c, 0xaf, 0xab, 0x5e, 0x8a, 0x80, - 0xb7, 0xe8, 0x1d, 0x07, 0x60, 0x73, 0x10, 0xfa, 0x18, 0x4a, 0x93, 0xd1, 0xf1, 0x70, 0x7c, 0x7c, - 0x50, 0xcf, 0x35, 0x1e, 0xbf, 0xb9, 0x6a, 0xbf, 0x2b, 0x7d, 0x6c, 0x00, 0x13, 0xea, 0x3b, 0xae, - 0x3f, 0x43, 0x7b, 0x50, 0xee, 0x0d, 0x06, 0xa3, 0xc9, 0xe9, 0x68, 0x58, 0x37, 0x1a, 0x8d, 0x37, - 0x57, 0xed, 0xf7, 0xb6, 0x81, 0x3d, 0xdb, 0xa6, 0x81, 0xa0, 0x4e, 0xa3, 0xf0, 0xcd, 0xdf, 0x9a, - 0xb9, 0xce, 0x37, 0x06, 0x54, 0xd3, 0x97, 0x40, 0x1f, 0x43, 0xb1, 0x37, 0x38, 0x1d, 0xbf, 0x1a, - 0xd5, 0x73, 0x1b, 0x7a, 0x1a, 0xd1, 0xb3, 0x85, 0xbb, 0xa4, 0xe8, 0x29, 0xec, 0x4e, 0x7a, 0x5f, - 0x9d, 0x8c, 0xea, 0xc6, 0xe6, 0x3a, 0x69, 0xd8, 0x84, 0x44, 0xa1, 0x42, 0x0d, 0x71, 0x6f, 0x7c, - 0x5c, 0xdf, 0xc9, 0x46, 0x0d, 0x39, 0x71, 0x7d, 0x7d, 0x95, 0x9b, 0x3c, 0x98, 0x27, 0x94, 0x2f, - 0x5d, 0xfb, 0x9e, 0x35, 0xf1, 0x19, 0x14, 0x04, 0x09, 0x2f, 0x94, 0x26, 0xcc, 0x6c, 0x4d, 0x9c, - 0x92, 0xf0, 0x42, 0x1e, 0xaa, 0xe9, 0x0a, 0x2f, 0x95, 0xc1, 0x69, 0xe0, 0xb9, 0x36, 0x11, 0xd4, - 0x51, 0xca, 0x30, 0xbb, 0x3f, 0xce, 0x62, 0xe3, 0x35, 0x4a, 0xdf, 0xff, 0x65, 0x0e, 0xa7, 0xa8, - 0xe8, 0x05, 0x14, 0x67, 0x1e, 0x3b, 0x23, 0x9e, 0xd2, 0x84, 0xd9, 0x7d, 0x92, 0xe5, 0xe4, 0x40, - 0x21, 0x36, 0x0e, 0x34, 0x05, 0x3d, 0x87, 0x62, 0x14, 0x38, 0x44, 0x50, 0xab, 0xa8, 0xc8, 0xed, - 0x2c, 0xf2, 0x57, 0x0a, 0x31, 0x60, 0xfe, 0xb9, 0x3b, 0xc3, 0x1a, 0x8f, 0x0e, 0xa1, 0xec, 0x53, - 0xf1, 0x35, 0xe3, 0x17, 0xa1, 0x55, 0x6a, 0xe7, 0xf7, 0xcc, 0xee, 0xa7, 0x99, 0x62, 0x8c, 0x31, - 0x3d, 0x21, 0x88, 0x3d, 0x5f, 0x50, 0x5f, 0xc4, 0x6e, 0xfa, 0x3b, 0x96, 0x81, 0xd7, 0x0e, 0xd0, - 0x6f, 0xa1, 0x4c, 0x7d, 0x27, 0x60, 0xae, 0x2f, 0xac, 0xf2, 0xed, 0x17, 0x19, 0x69, 0x8c, 0x0c, - 0x26, 0x5e, 0x33, 0xfa, 0x45, 0x28, 0x2c, 0x98, 0x43, 0x3b, 0xcf, 0xe0, 0xd1, 0x77, 0x82, 0x85, - 0x1a, 0x50, 0xd6, 0xc1, 0x8a, 0xb3, 0x5c, 0xc0, 0xeb, 0x7d, 0xe7, 0x21, 0xd4, 0xb6, 0x02, 0xa3, - 0xca, 0x46, 0x92, 0x2d, 0xd4, 0x83, 0x8a, 0xcd, 0x7c, 0x41, 0x5c, 0x9f, 0x72, 0x2d, 0x90, 0xcc, - 0xd8, 0x0e, 0x12, 0x90, 0x64, 0xbd, 0xcc, 0xe1, 0x0d, 0x0b, 0xfd, 0x01, 0x2a, 0x9c, 0x86, 0x2c, - 0xe2, 0x36, 0x0d, 0xb5, 0x42, 0xf6, 0xb2, 0x73, 0x1c, 0x83, 0x30, 0xfd, 0x73, 0xe4, 0x72, 0x2a, - 0xe3, 0x14, 0xe2, 0x0d, 0x15, 0xbd, 0x80, 0x12, 0xa7, 0xa1, 0x20, 0x5c, 0x7c, 0x5f, 0x92, 0x71, - 0x0c, 0x99, 0x30, 0xcf, 0xb5, 0x2f, 0x71, 0xc2, 0x40, 0x2f, 0xa0, 0x12, 0x78, 0xc4, 0x56, 0x5e, - 0xad, 0x5d, 0x45, 0xff, 0x51, 0x16, 0x7d, 0x92, 0x80, 0xf0, 0x06, 0x8f, 0x3e, 0x07, 0xf0, 0xd8, - 0x6c, 0xea, 0x70, 0x77, 0x49, 0xb9, 0x16, 0x49, 0x23, 0x8b, 0x3d, 0x54, 0x08, 0x5c, 0xf1, 0xd8, - 0x2c, 0x5e, 0xa2, 0x83, 0xff, 0x4b, 0x21, 0x29, 0x75, 0x1c, 0x02, 0x90, 0xf5, 0x57, 0xad, 0x8f, - 0x4f, 0x7e, 0x90, 0x2b, 0x9d, 0x91, 0x14, 0x1d, 0x3d, 0x81, 0xea, 0x39, 0xe3, 0x36, 0x9d, 0x6a, - 0xdd, 0x57, 0x94, 0x26, 0x4c, 0x65, 0x8b, 0x85, 0xde, 0xaf, 0x40, 0x89, 0x47, 0xbe, 0x70, 0x17, - 0xb4, 0x73, 0x08, 0xef, 0x66, 0x3a, 0x45, 0x5d, 0xa8, 0xae, 0xd3, 0x3c, 0x75, 0x1d, 0xa5, 0x8f, - 0x4a, 0xff, 0xe1, 0xea, 0xba, 0x65, 0xae, 0xf5, 0x30, 0x1e, 0x62, 0x73, 0x0d, 0x1a, 0x3b, 0x9d, - 0x6f, 0x8b, 0x50, 0xdb, 0x12, 0x0b, 0x7a, 0x07, 0x76, 0xdd, 0x05, 0x99, 0xd1, 0x98, 0x8e, 0xe3, - 0x0d, 0x1a, 0x41, 0xd1, 0x23, 0x67, 0xd4, 0x93, 0x92, 0x91, 0x61, 0xfb, 0xd9, 0x9d, 0xaa, 0xdb, - 0xff, 0x93, 0xc2, 0x8f, 0x7c, 0xc1, 0x2f, 0xb1, 0x26, 0x23, 0x0b, 0x4a, 0x36, 0x5b, 0x2c, 0x88, - 0x2f, 0xcb, 0x4b, 0x7e, 0xaf, 0x82, 0x93, 0x2d, 0x42, 0x50, 0x20, 0x7c, 0x16, 0x5a, 0x05, 0x65, - 0x56, 0x6b, 0x54, 0x87, 0x3c, 0xf5, 0x97, 0xd6, 0xae, 0x32, 0xc9, 0xa5, 0xb4, 0x38, 0x6e, 0x9c, - 0xf3, 0x0a, 0x96, 0x4b, 0xc9, 0x8b, 0x42, 0xca, 0xad, 0x92, 0x32, 0xa9, 0x35, 0xfa, 0x35, 0x14, - 0x17, 0x2c, 0xf2, 0x45, 0x68, 0x95, 0xd5, 0x65, 0x1f, 0x67, 0x5d, 0xf6, 0x48, 0x22, 0x74, 0xf9, - 0xd3, 0x70, 0xf4, 0x12, 0x1e, 0x85, 0x82, 0x05, 0xd3, 0x19, 0x27, 0x36, 0x9d, 0x06, 0x94, 0xbb, - 0xcc, 0x51, 0xd9, 0xb8, 0xa5, 0x8a, 0x0e, 0x75, 0x87, 0xc7, 0x0f, 0x25, 0xed, 0x40, 0xb2, 0x26, - 0x8a, 0x84, 0x26, 0x50, 0x0d, 0x22, 0xcf, 0x9b, 0xb2, 0x20, 0x2e, 0xe6, 0xa0, 0x9c, 0xfc, 0x80, - 0xa8, 0x4d, 0x22, 0xcf, 0xfb, 0x32, 0x26, 0x61, 0x33, 0xd8, 0x6c, 0xd0, 0x7b, 0x50, 0x9c, 0x71, - 0x16, 0x05, 0xa1, 0x65, 0xaa, 0x78, 0xe8, 0x1d, 0xfa, 0x02, 0x4a, 0x21, 0xb5, 0x39, 0x15, 0xa1, - 0x55, 0x55, 0xaf, 0xfd, 0x28, 0xeb, 0x90, 0x13, 0x05, 0xc1, 0xf4, 0x9c, 0x72, 0xea, 0xdb, 0x14, - 0x27, 0x1c, 0xf4, 0x18, 0xf2, 0x42, 0x5c, 0x5a, 0xb5, 0xb6, 0xb1, 0x57, 0xee, 0x97, 0x56, 0xd7, - 0xad, 0xfc, 0xe9, 0xe9, 0x6b, 0x2c, 0x6d, 0xb2, 0x4c, 0xcd, 0x59, 0x28, 0x7c, 0xb2, 0xa0, 0xd6, - 0x03, 0x15, 0xde, 0xf5, 0x1e, 0xbd, 0x06, 0x70, 0xfc, 0x70, 0x6a, 0xab, 0xdf, 0x85, 0xf5, 0x50, - 0xbd, 0xee, 0xd3, 0xbb, 0x5f, 0x37, 0x3c, 0x3e, 0xd1, 0xc5, 0xb6, 0xb6, 0xba, 0x6e, 0x55, 0xd6, - 0x5b, 0x5c, 0x71, 0xfc, 0x30, 0x5e, 0x36, 0x3e, 0x07, 0x33, 0x25, 0x1d, 0x99, 0xf2, 0x0b, 0x7a, - 0xa9, 0xd5, 0x28, 0x97, 0x52, 0xa1, 0x4b, 0xe2, 0x45, 0xf1, 0xcc, 0x53, 0xc1, 0xf1, 0xe6, 0x37, - 0x3b, 0xcf, 0x8d, 0x46, 0x17, 0xcc, 0x54, 0xfc, 0xd0, 0x47, 0x50, 0xe3, 0x74, 0xe6, 0x86, 0x82, - 0x5f, 0x4e, 0x49, 0x24, 0xe6, 0xd6, 0xef, 0x15, 0xa1, 0x9a, 0x18, 0x7b, 0x91, 0x98, 0x37, 0xa6, - 0xb0, 0xb9, 0x06, 0x6a, 0x83, 0x29, 0x9f, 0x17, 0x52, 0xbe, 0xa4, 0x5c, 0x16, 0x67, 0x19, 0xe9, - 0xb4, 0x49, 0xa6, 0x21, 0xa4, 0x84, 0xdb, 0x73, 0xf5, 0x43, 0xa8, 0x60, 0xbd, 0x93, 0xca, 0x4e, - 0x72, 0xad, 0x95, 0xad, 0xb7, 0x9d, 0xff, 0x18, 0x50, 0x4d, 0x77, 0x09, 0x34, 0x88, 0x7b, 0x83, - 0x7a, 0xd2, 0x83, 0xee, 0xb3, 0xbb, 0xba, 0x8a, 0xaa, 0xc4, 0x5e, 0x24, 0x9d, 0x1d, 0xc9, 0x49, - 0x4e, 0x91, 0xd1, 0xaf, 0x60, 0x37, 0x60, 0x5c, 0x24, 0xbf, 0xc7, 0x66, 0x66, 0xf5, 0x64, 0x3c, - 0xa9, 0x5c, 0x31, 0xb8, 0x33, 0x87, 0x07, 0xdb, 0xde, 0xd0, 0x53, 0xc8, 0xbf, 0x1a, 0x4f, 0xea, - 0xb9, 0xc6, 0x07, 0x6f, 0xae, 0xda, 0xef, 0x6f, 0x7f, 0x7c, 0xe5, 0x72, 0x11, 0x11, 0x6f, 0x3c, - 0x41, 0x3f, 0x85, 0xdd, 0xe1, 0xf1, 0x09, 0xc6, 0x75, 0xa3, 0xd1, 0x7a, 0x73, 0xd5, 0xfe, 0x60, - 0x1b, 0x27, 0x3f, 0xb1, 0xc8, 0x77, 0x30, 0x3b, 0x5b, 0x0f, 0x37, 0xff, 0xd8, 0x01, 0x53, 0x97, - 0xa9, 0xfb, 0x1d, 0x6e, 0x7e, 0x07, 0xb5, 0xb8, 0xf2, 0x27, 0xe2, 0xdb, 0xb9, 0xb3, 0x01, 0x54, - 0x63, 0x82, 0xce, 0xf1, 0x13, 0xa8, 0xba, 0xc1, 0xf2, 0xb3, 0x29, 0xf5, 0xc9, 0x99, 0xa7, 0xe7, - 0x9c, 0x32, 0x36, 0xa5, 0x6d, 0x14, 0x9b, 0xa4, 0xf2, 0x5d, 0x5f, 0x50, 0xee, 0xeb, 0x09, 0xa6, - 0x8c, 0xd7, 0x7b, 0xf4, 0x05, 0x14, 0xdc, 0x80, 0x2c, 0x74, 0xd7, 0xca, 0x7c, 0xc1, 0x78, 0xd2, - 0x3b, 0xd2, 0x1a, 0xec, 0x97, 0x57, 0xd7, 0xad, 0x82, 0x34, 0x60, 0x45, 0x43, 0xcd, 0xa4, 0x71, - 0xc8, 0x93, 0x54, 0x21, 0x2b, 0xe3, 0x94, 0xa5, 0xf3, 0xf7, 0x02, 0x98, 0x03, 0x2f, 0x0a, 0x85, - 0x2e, 0xc7, 0xf7, 0x16, 0xb7, 0xd7, 0xf0, 0x88, 0xa8, 0x51, 0x98, 0xf8, 0xb2, 0xb6, 0xa9, 0x86, - 0xac, 0x63, 0xf7, 0x34, 0xd3, 0xdd, 0x1a, 0x1c, 0x37, 0xef, 0x7e, 0x51, 0xfa, 0xb4, 0x0c, 0x5c, - 0x27, 0xff, 0xf3, 0x05, 0x9d, 0x40, 0x8d, 0x71, 0x7b, 0x4e, 0x43, 0x11, 0x97, 0x43, 0x3d, 0x3a, - 0x66, 0xfe, 0xa9, 0xf8, 0x32, 0x0d, 0xd4, 0xb5, 0x20, 0xbe, 0xed, 0xb6, 0x0f, 0xf4, 0x1c, 0x0a, - 0x9c, 0x9c, 0x27, 0xc3, 0x45, 0xa6, 0xbe, 0x31, 0x39, 0x17, 0x5b, 0x2e, 0x14, 0x03, 0xfd, 0x11, - 0xc0, 0x71, 0xc3, 0x80, 0x08, 0x7b, 0x4e, 0xb9, 0xce, 0x53, 0xe6, 0x13, 0x87, 0x6b, 0xd4, 0x96, - 0x97, 0x14, 0x1b, 0x1d, 0x42, 0xc5, 0x26, 0x89, 0xd2, 0x8a, 0xb7, 0x77, 0x82, 0x41, 0x4f, 0xbb, - 0xa8, 0x4b, 0x17, 0xab, 0xeb, 0x56, 0x39, 0xb1, 0xe0, 0xb2, 0x4d, 0xb4, 0xf2, 0x0e, 0xa1, 0x26, - 0xe7, 0xec, 0xa9, 0x43, 0xcf, 0x49, 0xe4, 0x89, 0x50, 0x35, 0xad, 0x5b, 0xe6, 0x4a, 0x39, 0xf2, - 0x0d, 0x35, 0x4e, 0xdf, 0xab, 0x2a, 0x52, 0xb6, 0x8e, 0x0b, 0x10, 0x17, 0xf5, 0xfb, 0x95, 0x09, - 0x82, 0x82, 0x43, 0x04, 0x51, 0xca, 0xa8, 0x62, 0xb5, 0xee, 0x7f, 0xf8, 0xf6, 0xa6, 0x99, 0xfb, - 0xd7, 0x4d, 0x33, 0xf7, 0xef, 0x9b, 0xa6, 0xf1, 0x97, 0x55, 0xd3, 0x78, 0xbb, 0x6a, 0x1a, 0xff, - 0x5c, 0x35, 0x8d, 0x6f, 0x57, 0x4d, 0xe3, 0xac, 0xa8, 0xfe, 0xde, 0xfe, 0xf2, 0xbf, 0x01, 0x00, - 0x00, 0xff, 0xff, 0x2a, 0x90, 0x7c, 0x40, 0x3d, 0x0f, 0x00, 0x00, + 0x07, 0x9d, 0x3f, 0x17, 0xa0, 0x7c, 0xcc, 0x1c, 0x7a, 0x12, 0x50, 0x1b, 0x1d, 0x80, 0x49, 0x7c, + 0x9f, 0x09, 0x05, 0x08, 0x2d, 0xa3, 0x6d, 0xec, 0x99, 0xdd, 0xd6, 0xfe, 0xb7, 0x5f, 0xb9, 0xdf, + 0xdb, 0xc0, 0xfa, 0x85, 0xb7, 0xd7, 0xad, 0x1c, 0x4e, 0x33, 0xd1, 0x4f, 0xa1, 0xc0, 0x99, 0x47, + 0xad, 0x9d, 0xb6, 0xb1, 0xf7, 0xa0, 0xfb, 0x61, 0x96, 0x07, 0xf9, 0x52, 0xcc, 0x3c, 0x8a, 0x15, + 0x12, 0x1d, 0x00, 0x2c, 0xe8, 0xe2, 0x8c, 0xf2, 0x70, 0xee, 0x06, 0x56, 0x5e, 0xf1, 0x7e, 0x74, + 0x1b, 0x4f, 0x1e, 0x76, 0xff, 0x68, 0x0d, 0xc7, 0x29, 0x2a, 0x3a, 0x82, 0x2a, 0x59, 0x12, 0xd7, + 0x23, 0x67, 0xae, 0xe7, 0x8a, 0x4b, 0xab, 0xa0, 0x5c, 0x7d, 0xf2, 0x9d, 0xae, 0x7a, 0x29, 0x02, + 0xde, 0xa2, 0x77, 0x1c, 0x80, 0xcd, 0x8b, 0xd0, 0xc7, 0x50, 0x9a, 0x8c, 0x8e, 0x87, 0xe3, 0xe3, + 0x83, 0x7a, 0xae, 0xf1, 0xf8, 0xcd, 0x55, 0xfb, 0x5d, 0xe9, 0x63, 0x03, 0x98, 0x50, 0xdf, 0x71, + 0xfd, 0x19, 0xda, 0x83, 0x72, 0x6f, 0x30, 0x18, 0x4d, 0x4e, 0x47, 0xc3, 0xba, 0xd1, 0x68, 0xbc, + 0xb9, 0x6a, 0xbf, 0xb7, 0x0d, 0xec, 0xd9, 0x36, 0x0d, 0x04, 0x75, 0x1a, 0x85, 0x6f, 0xfe, 0xd2, + 0xcc, 0x75, 0xbe, 0x31, 0xa0, 0x9a, 0x3e, 0x04, 0xfa, 0x18, 0x8a, 0xbd, 0xc1, 0xe9, 0xf8, 0xd5, + 0xa8, 0x9e, 0xdb, 0xd0, 0xd3, 0x88, 0x9e, 0x2d, 0xdc, 0x25, 0x45, 0x4f, 0x61, 0x77, 0xd2, 0xfb, + 0xea, 0x64, 0x54, 0x37, 0x36, 0xc7, 0x49, 0xc3, 0x26, 0x24, 0x0a, 0x15, 0x6a, 0x88, 0x7b, 0xe3, + 0xe3, 0xfa, 0x4e, 0x36, 0x6a, 0xc8, 0x89, 0xeb, 0xeb, 0xa3, 0xdc, 0xe4, 0xc1, 0x3c, 0xa1, 0x7c, + 0xe9, 0xda, 0xf7, 0xac, 0x89, 0xcf, 0xa0, 0x20, 0x48, 0x78, 0xa1, 0x34, 0x61, 0x66, 0x6b, 0xe2, + 0x94, 0x84, 0x17, 0xf2, 0xa5, 0x9a, 0xae, 0xf0, 0x52, 0x19, 0x9c, 0x06, 0x9e, 0x6b, 0x13, 0x41, + 0x1d, 0xa5, 0x0c, 0xb3, 0xfb, 0xc3, 0x2c, 0x36, 0x5e, 0xa3, 0xf4, 0xf9, 0x5f, 0xe6, 0x70, 0x8a, + 0x8a, 0x5e, 0x40, 0x71, 0xe6, 0xb1, 0x33, 0xe2, 0x29, 0x4d, 0x98, 0xdd, 0x27, 0x59, 0x4e, 0x0e, + 0x14, 0x62, 0xe3, 0x40, 0x53, 0xd0, 0x73, 0x28, 0x46, 0x81, 0x43, 0x04, 0xb5, 0x8a, 0x8a, 0xdc, + 0xce, 0x22, 0x7f, 0xa5, 0x10, 0x03, 0xe6, 0x9f, 0xbb, 0x33, 0xac, 0xf1, 0xe8, 0x10, 0xca, 0x3e, + 0x15, 0x5f, 0x33, 0x7e, 0x11, 0x5a, 0xa5, 0x76, 0x7e, 0xcf, 0xec, 0x7e, 0x9a, 0x29, 0xc6, 0x18, + 0xd3, 0x13, 0x82, 0xd8, 0xf3, 0x05, 0xf5, 0x45, 0xec, 0xa6, 0xbf, 0x63, 0x19, 0x78, 0xed, 0x00, + 0xfd, 0x1a, 0xca, 0xd4, 0x77, 0x02, 0xe6, 0xfa, 0xc2, 0x2a, 0xdf, 0x7e, 0x90, 0x91, 0xc6, 0xc8, + 0x60, 0xe2, 0x35, 0xa3, 0x5f, 0x84, 0xc2, 0x82, 0x39, 0xb4, 0xf3, 0x0c, 0x1e, 0x7d, 0x2b, 0x58, + 0xa8, 0x01, 0x65, 0x1d, 0xac, 0x38, 0xcb, 0x05, 0xbc, 0xde, 0x77, 0x1e, 0x42, 0x6d, 0x2b, 0x30, + 0xaa, 0x6c, 0x24, 0xd9, 0x42, 0x3d, 0xa8, 0xd8, 0xcc, 0x17, 0xc4, 0xf5, 0x29, 0xd7, 0x02, 0xc9, + 0x8c, 0xed, 0x20, 0x01, 0x49, 0xd6, 0xcb, 0x1c, 0xde, 0xb0, 0xd0, 0xef, 0xa0, 0xc2, 0x69, 0xc8, + 0x22, 0x6e, 0xd3, 0x50, 0x2b, 0x64, 0x2f, 0x3b, 0xc7, 0x31, 0x08, 0xd3, 0x3f, 0x46, 0x2e, 0xa7, + 0x32, 0x4e, 0x21, 0xde, 0x50, 0xd1, 0x0b, 0x28, 0x71, 0x1a, 0x0a, 0xc2, 0xc5, 0x77, 0x25, 0x19, + 0xc7, 0x90, 0x09, 0xf3, 0x5c, 0xfb, 0x12, 0x27, 0x0c, 0xf4, 0x02, 0x2a, 0x81, 0x47, 0x6c, 0xe5, + 0xd5, 0xda, 0x55, 0xf4, 0x1f, 0x64, 0xd1, 0x27, 0x09, 0x08, 0x6f, 0xf0, 0xe8, 0x73, 0x00, 0x8f, + 0xcd, 0xa6, 0x0e, 0x77, 0x97, 0x94, 0x6b, 0x91, 0x34, 0xb2, 0xd8, 0x43, 0x85, 0xc0, 0x15, 0x8f, + 0xcd, 0xe2, 0x25, 0x3a, 0xf8, 0xbf, 0x14, 0x92, 0x52, 0xc7, 0x21, 0x00, 0x59, 0x3f, 0xd5, 0xfa, + 0xf8, 0xe4, 0x7b, 0xb9, 0xd2, 0x19, 0x49, 0xd1, 0xd1, 0x13, 0xa8, 0x9e, 0x33, 0x6e, 0xd3, 0xa9, + 0xd6, 0x7d, 0x45, 0x69, 0xc2, 0x54, 0xb6, 0x58, 0xe8, 0xfd, 0x0a, 0x94, 0x78, 0xe4, 0x0b, 0x77, + 0x41, 0x3b, 0x87, 0xf0, 0x6e, 0xa6, 0x53, 0xd4, 0x85, 0xea, 0x3a, 0xcd, 0x53, 0xd7, 0x51, 0xfa, + 0xa8, 0xf4, 0x1f, 0xae, 0xae, 0x5b, 0xe6, 0x5a, 0x0f, 0xe3, 0x21, 0x36, 0xd7, 0xa0, 0xb1, 0xd3, + 0xf9, 0x6b, 0x09, 0x6a, 0x5b, 0x62, 0x41, 0xef, 0xc0, 0xae, 0xbb, 0x20, 0x33, 0x1a, 0xd3, 0x71, + 0xbc, 0x41, 0x23, 0x28, 0x7a, 0xe4, 0x8c, 0x7a, 0x52, 0x32, 0x32, 0x6c, 0x3f, 0xb9, 0x53, 0x75, + 0xfb, 0x7f, 0x50, 0xf8, 0x91, 0x2f, 0xf8, 0x25, 0xd6, 0x64, 0x64, 0x41, 0xc9, 0x66, 0x8b, 0x05, + 0xf1, 0x65, 0x79, 0xc9, 0xef, 0x55, 0x70, 0xb2, 0x45, 0x08, 0x0a, 0x84, 0xcf, 0x42, 0xab, 0xa0, + 0xcc, 0x6a, 0x8d, 0xea, 0x90, 0xa7, 0xfe, 0xd2, 0xda, 0x55, 0x26, 0xb9, 0x94, 0x16, 0xc7, 0x8d, + 0x73, 0x5e, 0xc1, 0x72, 0x29, 0x79, 0x51, 0x48, 0xb9, 0x55, 0x52, 0x26, 0xb5, 0x46, 0xbf, 0x84, + 0xe2, 0x82, 0x45, 0xbe, 0x08, 0xad, 0xb2, 0x3a, 0xec, 0xe3, 0xac, 0xc3, 0x1e, 0x49, 0x84, 0x2e, + 0x7f, 0x1a, 0x8e, 0x5e, 0xc2, 0xa3, 0x50, 0xb0, 0x60, 0x3a, 0xe3, 0xc4, 0xa6, 0xd3, 0x80, 0x72, + 0x97, 0x39, 0x2a, 0x1b, 0xb7, 0x54, 0xd1, 0xa1, 0xee, 0xf0, 0xf8, 0xa1, 0xa4, 0x1d, 0x48, 0xd6, + 0x44, 0x91, 0xd0, 0x04, 0xaa, 0x41, 0xe4, 0x79, 0x53, 0x16, 0xc4, 0xc5, 0x1c, 0x94, 0x93, 0xef, + 0x11, 0xb5, 0x49, 0xe4, 0x79, 0x5f, 0xc6, 0x24, 0x6c, 0x06, 0x9b, 0x0d, 0x7a, 0x0f, 0x8a, 0x33, + 0xce, 0xa2, 0x20, 0xb4, 0x4c, 0x15, 0x0f, 0xbd, 0x43, 0x5f, 0x40, 0x29, 0xa4, 0x36, 0xa7, 0x22, + 0xb4, 0xaa, 0xea, 0xb6, 0x1f, 0x65, 0xbd, 0xe4, 0x44, 0x41, 0x30, 0x3d, 0xa7, 0x9c, 0xfa, 0x36, + 0xc5, 0x09, 0x07, 0x3d, 0x86, 0xbc, 0x10, 0x97, 0x56, 0xad, 0x6d, 0xec, 0x95, 0xfb, 0xa5, 0xd5, + 0x75, 0x2b, 0x7f, 0x7a, 0xfa, 0x1a, 0x4b, 0x9b, 0x2c, 0x53, 0x73, 0x16, 0x0a, 0x9f, 0x2c, 0xa8, + 0xf5, 0x40, 0x85, 0x77, 0xbd, 0x47, 0xaf, 0x01, 0x1c, 0x3f, 0x9c, 0xda, 0xea, 0xbb, 0xb0, 0x1e, + 0xaa, 0xdb, 0x7d, 0x7a, 0xf7, 0xed, 0x86, 0xc7, 0x27, 0xba, 0xd8, 0xd6, 0x56, 0xd7, 0xad, 0xca, + 0x7a, 0x8b, 0x2b, 0x8e, 0x1f, 0xc6, 0x4b, 0xd4, 0x07, 0x73, 0x4e, 0x89, 0x27, 0xe6, 0xf6, 0x9c, + 0xda, 0x17, 0x56, 0xfd, 0xf6, 0xda, 0xfb, 0x52, 0xc1, 0xb4, 0x87, 0x34, 0xa9, 0xf1, 0x39, 0x98, + 0x29, 0xf9, 0x49, 0xd9, 0x5c, 0xd0, 0x4b, 0xad, 0x68, 0xb9, 0x94, 0x2a, 0x5f, 0x12, 0x2f, 0x8a, + 0xe7, 0xa6, 0x0a, 0x8e, 0x37, 0xbf, 0xda, 0x79, 0x6e, 0x34, 0xba, 0x60, 0xa6, 0x72, 0x80, 0x3e, + 0x82, 0x1a, 0xa7, 0x33, 0x37, 0x14, 0xfc, 0x72, 0x4a, 0x22, 0x31, 0xb7, 0x7e, 0xab, 0x08, 0xd5, + 0xc4, 0xd8, 0x8b, 0xc4, 0xbc, 0x31, 0x85, 0xcd, 0x55, 0x50, 0x1b, 0x4c, 0x19, 0xa2, 0x90, 0xf2, + 0x25, 0xe5, 0xb2, 0xc0, 0xcb, 0x6c, 0xa5, 0x4d, 0x32, 0x95, 0x21, 0x25, 0xdc, 0x9e, 0xab, 0x8f, + 0xa9, 0x82, 0xf5, 0x4e, 0x7e, 0x1d, 0x89, 0x5e, 0xf4, 0xd7, 0xa1, 0xb7, 0x9d, 0xff, 0x18, 0x50, + 0x4d, 0x77, 0x1a, 0x34, 0x88, 0xfb, 0x8b, 0xba, 0xd2, 0x83, 0xee, 0xb3, 0xbb, 0x3a, 0x93, 0xaa, + 0xe6, 0x5e, 0x24, 0x9d, 0x1d, 0xc9, 0x69, 0x50, 0x91, 0xd1, 0x2f, 0x60, 0x37, 0x60, 0x5c, 0x24, + 0xdf, 0x74, 0x33, 0xb3, 0x02, 0x33, 0x9e, 0x54, 0xbf, 0x18, 0xdc, 0x99, 0xc3, 0x83, 0x6d, 0x6f, + 0xe8, 0x29, 0xe4, 0x5f, 0x8d, 0x27, 0xf5, 0x5c, 0xe3, 0x83, 0x37, 0x57, 0xed, 0xf7, 0xb7, 0x1f, + 0xbe, 0x72, 0xb9, 0x88, 0x88, 0x37, 0x9e, 0xa0, 0x1f, 0xc3, 0xee, 0xf0, 0xf8, 0x04, 0xe3, 0xba, + 0xd1, 0x68, 0xbd, 0xb9, 0x6a, 0x7f, 0xb0, 0x8d, 0x93, 0x8f, 0x58, 0xe4, 0x3b, 0x98, 0x9d, 0xad, + 0x07, 0xa4, 0xbf, 0xef, 0x80, 0xa9, 0x4b, 0xdd, 0xfd, 0x0e, 0x48, 0xbf, 0x81, 0x5a, 0xdc, 0x3d, + 0x12, 0x01, 0xef, 0xdc, 0xd9, 0x44, 0xaa, 0x31, 0x41, 0xe7, 0xf8, 0x09, 0x54, 0xdd, 0x60, 0xf9, + 0xd9, 0x94, 0xfa, 0xe4, 0xcc, 0xd3, 0xb3, 0x52, 0x19, 0x9b, 0xd2, 0x36, 0x8a, 0x4d, 0xf2, 0xeb, + 0x71, 0x7d, 0x41, 0xb9, 0xaf, 0xa7, 0xa0, 0x32, 0x5e, 0xef, 0xd1, 0x17, 0x50, 0x70, 0x03, 0xb2, + 0xd0, 0x9d, 0x2f, 0xf3, 0x06, 0xe3, 0x49, 0xef, 0x48, 0x6b, 0xb0, 0x5f, 0x5e, 0x5d, 0xb7, 0x0a, + 0xd2, 0x80, 0x15, 0x0d, 0x35, 0x93, 0xe6, 0x23, 0xdf, 0xa4, 0x8a, 0x61, 0x19, 0xa7, 0x2c, 0x9d, + 0xbf, 0x15, 0xc0, 0x1c, 0x78, 0x51, 0x28, 0x74, 0x49, 0xbf, 0xb7, 0xb8, 0xbd, 0x86, 0x47, 0x44, + 0x8d, 0xd3, 0xc4, 0x97, 0xf5, 0x51, 0x35, 0x75, 0x1d, 0xbb, 0xa7, 0x99, 0xee, 0xd6, 0xe0, 0x78, + 0x00, 0xe8, 0x17, 0xa5, 0x4f, 0xcb, 0xc0, 0x75, 0xf2, 0x3f, 0x4f, 0xd0, 0x09, 0xd4, 0x18, 0xb7, + 0xe7, 0x34, 0x14, 0x71, 0x49, 0xd5, 0xe3, 0x67, 0xe6, 0x8f, 0xc9, 0x97, 0x69, 0xa0, 0xae, 0x27, + 0xf1, 0x69, 0xb7, 0x7d, 0xa0, 0xe7, 0x50, 0xe0, 0xe4, 0x3c, 0x19, 0x50, 0x32, 0xf5, 0x8d, 0xc9, + 0xb9, 0xd8, 0x72, 0xa1, 0x18, 0xe8, 0xf7, 0x00, 0x8e, 0x1b, 0x06, 0x44, 0xd8, 0x73, 0xca, 0x75, + 0x9e, 0x32, 0xaf, 0x38, 0x5c, 0xa3, 0xb6, 0xbc, 0xa4, 0xd8, 0xe8, 0x10, 0x2a, 0x36, 0x49, 0x94, + 0x56, 0xbc, 0xbd, 0x9b, 0x0c, 0x7a, 0xda, 0x45, 0x5d, 0xba, 0x58, 0x5d, 0xb7, 0xca, 0x89, 0x05, + 0x97, 0x6d, 0xa2, 0x95, 0x77, 0x08, 0x35, 0x39, 0xab, 0x4f, 0x1d, 0x7a, 0x4e, 0x22, 0x4f, 0x84, + 0xaa, 0xf1, 0xdd, 0x52, 0x1f, 0xe5, 0xd8, 0x38, 0xd4, 0x38, 0x7d, 0xae, 0xaa, 0x48, 0xd9, 0x3a, + 0x2e, 0x40, 0xdc, 0x18, 0xee, 0x57, 0x26, 0x08, 0x0a, 0x0e, 0x11, 0x44, 0x29, 0xa3, 0x8a, 0xd5, + 0xba, 0xff, 0xe1, 0xdb, 0x9b, 0x66, 0xee, 0x9f, 0x37, 0xcd, 0xdc, 0xbf, 0x6f, 0x9a, 0xc6, 0x9f, + 0x56, 0x4d, 0xe3, 0xed, 0xaa, 0x69, 0xfc, 0x63, 0xd5, 0x34, 0xfe, 0xb5, 0x6a, 0x1a, 0x67, 0x45, + 0xf5, 0x8b, 0xfc, 0xf3, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x59, 0xc9, 0x0e, 0x81, 0x0f, + 0x00, 0x00, } diff --git a/vendor/src/github.com/docker/swarmkit/api/specs.proto b/vendor/src/github.com/docker/swarmkit/api/specs.proto index 36494ca45a..7889b30006 100644 --- a/vendor/src/github.com/docker/swarmkit/api/specs.proto +++ b/vendor/src/github.com/docker/swarmkit/api/specs.proto @@ -225,6 +225,12 @@ message ContainerSpec { // DNSConfig allows one to specify DNS related configuration in resolv.conf DNSConfig dns_config = 15 [(gogoproto.customname) = "DNSConfig"]; + + // Healthcheck describes how to check the container is healthy. If the + // container is considered unhealthy, it will be destroyed, its creating + // task will exit and a new task will be rescheduled elsewhere. A container + // is considered unhealthy after `Retries` number of consecutive failures. + HealthConfig healthcheck = 16; } // EndpointSpec defines the properties that can be configured to diff --git a/vendor/src/github.com/docker/swarmkit/api/types.pb.go b/vendor/src/github.com/docker/swarmkit/api/types.pb.go index 29b69ea29a..6a0eca980e 100644 --- a/vendor/src/github.com/docker/swarmkit/api/types.pb.go +++ b/vendor/src/github.com/docker/swarmkit/api/types.pb.go @@ -34,6 +34,7 @@ UpdateConfig UpdateStatus ContainerStatus + PortStatus TaskStatus NetworkAttachmentConfig IPAMConfig @@ -58,6 +59,7 @@ ManagerStatus SecretReference BlacklistedCertificate + HealthConfig NodeSpec ServiceSpec ReplicatedService @@ -515,7 +517,7 @@ func (x IPAMConfig_AddressFamily) String() string { return proto.EnumName(IPAMConfig_AddressFamily_name, int32(x)) } func (IPAMConfig_AddressFamily) EnumDescriptor() ([]byte, []int) { - return fileDescriptorTypes, []int{18, 0} + return fileDescriptorTypes, []int{19, 0} } type PortConfig_Protocol int32 @@ -537,7 +539,7 @@ var PortConfig_Protocol_value = map[string]int32{ func (x PortConfig_Protocol) String() string { return proto.EnumName(PortConfig_Protocol_name, int32(x)) } -func (PortConfig_Protocol) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{19, 0} } +func (PortConfig_Protocol) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{20, 0} } // PublishMode controls how ports are published on the swarm. type PortConfig_PublishMode int32 @@ -565,7 +567,7 @@ func (x PortConfig_PublishMode) String() string { return proto.EnumName(PortConfig_PublishMode_name, int32(x)) } func (PortConfig_PublishMode) EnumDescriptor() ([]byte, []int) { - return fileDescriptorTypes, []int{19, 1} + return fileDescriptorTypes, []int{20, 1} } type IssuanceStatus_State int32 @@ -605,7 +607,7 @@ var IssuanceStatus_State_value = map[string]int32{ func (x IssuanceStatus_State) String() string { return proto.EnumName(IssuanceStatus_State_name, int32(x)) } -func (IssuanceStatus_State) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{24, 0} } +func (IssuanceStatus_State) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{25, 0} } type ExternalCA_CAProtocol int32 @@ -624,7 +626,7 @@ func (x ExternalCA_CAProtocol) String() string { return proto.EnumName(ExternalCA_CAProtocol_name, int32(x)) } func (ExternalCA_CAProtocol) EnumDescriptor() ([]byte, []int) { - return fileDescriptorTypes, []int{26, 0} + return fileDescriptorTypes, []int{27, 0} } // Encryption algorithm that can implemented using this key @@ -645,7 +647,7 @@ func (x EncryptionKey_Algorithm) String() string { return proto.EnumName(EncryptionKey_Algorithm_name, int32(x)) } func (EncryptionKey_Algorithm) EnumDescriptor() ([]byte, []int) { - return fileDescriptorTypes, []int{36, 0} + return fileDescriptorTypes, []int{37, 0} } // Mode specifies how this secret should be exposed to the task. @@ -675,7 +677,7 @@ var SecretReference_Mode_value = map[string]int32{ func (x SecretReference_Mode) String() string { return proto.EnumName(SecretReference_Mode_name, int32(x)) } -func (SecretReference_Mode) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{38, 0} } +func (SecretReference_Mode) EnumDescriptor() ([]byte, []int) { return fileDescriptorTypes, []int{39, 0} } // Version tracks the last time an object in the store was updated. type Version struct { @@ -973,6 +975,16 @@ func (m *ContainerStatus) Reset() { *m = ContainerStatus{} } func (*ContainerStatus) ProtoMessage() {} func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{15} } +// PortStatus specifies the actual allocated runtime state of a list +// of port configs. +type PortStatus struct { + Ports []*PortConfig `protobuf:"bytes,1,rep,name=ports" json:"ports,omitempty"` +} + +func (m *PortStatus) Reset() { *m = PortStatus{} } +func (*PortStatus) ProtoMessage() {} +func (*PortStatus) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{16} } + type TaskStatus struct { Timestamp *docker_swarmkit_v1.Timestamp `protobuf:"bytes,1,opt,name=timestamp" json:"timestamp,omitempty"` // State expresses the current state of the task. @@ -1000,11 +1012,14 @@ type TaskStatus struct { // Types that are valid to be assigned to RuntimeStatus: // *TaskStatus_Container RuntimeStatus isTaskStatus_RuntimeStatus `protobuf_oneof:"runtime_status"` + // HostPorts provides a list of ports allocated at the host + // level. + PortStatus *PortStatus `protobuf:"bytes,6,opt,name=port_status,json=portStatus" json:"port_status,omitempty"` } func (m *TaskStatus) Reset() { *m = TaskStatus{} } func (*TaskStatus) ProtoMessage() {} -func (*TaskStatus) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{16} } +func (*TaskStatus) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{17} } type isTaskStatus_RuntimeStatus interface { isTaskStatus_RuntimeStatus() @@ -1106,7 +1121,7 @@ type NetworkAttachmentConfig struct { func (m *NetworkAttachmentConfig) Reset() { *m = NetworkAttachmentConfig{} } func (*NetworkAttachmentConfig) ProtoMessage() {} -func (*NetworkAttachmentConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{17} } +func (*NetworkAttachmentConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{18} } // IPAMConfig specifies parameters for IP Address Management. type IPAMConfig struct { @@ -1127,7 +1142,7 @@ type IPAMConfig struct { func (m *IPAMConfig) Reset() { *m = IPAMConfig{} } func (*IPAMConfig) ProtoMessage() {} -func (*IPAMConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{18} } +func (*IPAMConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{19} } // PortConfig specifies an exposed port which can be // addressed using the given name. This can be later queried @@ -1153,7 +1168,7 @@ type PortConfig struct { func (m *PortConfig) Reset() { *m = PortConfig{} } func (*PortConfig) ProtoMessage() {} -func (*PortConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{19} } +func (*PortConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{20} } // Driver is a generic driver type to be used throughout the API. For now, a // driver is simply a name and set of options. The field contents depend on the @@ -1166,7 +1181,7 @@ type Driver struct { func (m *Driver) Reset() { *m = Driver{} } func (*Driver) ProtoMessage() {} -func (*Driver) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{20} } +func (*Driver) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{21} } type IPAMOptions struct { Driver *Driver `protobuf:"bytes,1,opt,name=driver" json:"driver,omitempty"` @@ -1175,7 +1190,7 @@ type IPAMOptions struct { func (m *IPAMOptions) Reset() { *m = IPAMOptions{} } func (*IPAMOptions) ProtoMessage() {} -func (*IPAMOptions) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{21} } +func (*IPAMOptions) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{22} } // Peer should be used anywhere where we are describing a remote peer. type Peer struct { @@ -1185,7 +1200,7 @@ type Peer struct { func (m *Peer) Reset() { *m = Peer{} } func (*Peer) ProtoMessage() {} -func (*Peer) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{22} } +func (*Peer) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{23} } // WeightedPeer should be used anywhere where we are describing a remote peer // with a weight. @@ -1196,7 +1211,7 @@ type WeightedPeer struct { func (m *WeightedPeer) Reset() { *m = WeightedPeer{} } func (*WeightedPeer) ProtoMessage() {} -func (*WeightedPeer) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{23} } +func (*WeightedPeer) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{24} } type IssuanceStatus struct { State IssuanceStatus_State `protobuf:"varint,1,opt,name=state,proto3,enum=docker.swarmkit.v1.IssuanceStatus_State" json:"state,omitempty"` @@ -1208,7 +1223,7 @@ type IssuanceStatus struct { func (m *IssuanceStatus) Reset() { *m = IssuanceStatus{} } func (*IssuanceStatus) ProtoMessage() {} -func (*IssuanceStatus) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{24} } +func (*IssuanceStatus) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{25} } type AcceptancePolicy struct { Policies []*AcceptancePolicy_RoleAdmissionPolicy `protobuf:"bytes,1,rep,name=policies" json:"policies,omitempty"` @@ -1216,7 +1231,7 @@ type AcceptancePolicy struct { func (m *AcceptancePolicy) Reset() { *m = AcceptancePolicy{} } func (*AcceptancePolicy) ProtoMessage() {} -func (*AcceptancePolicy) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{25} } +func (*AcceptancePolicy) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{26} } type AcceptancePolicy_RoleAdmissionPolicy struct { Role NodeRole `protobuf:"varint,1,opt,name=role,proto3,enum=docker.swarmkit.v1.NodeRole" json:"role,omitempty"` @@ -1231,7 +1246,7 @@ type AcceptancePolicy_RoleAdmissionPolicy struct { func (m *AcceptancePolicy_RoleAdmissionPolicy) Reset() { *m = AcceptancePolicy_RoleAdmissionPolicy{} } func (*AcceptancePolicy_RoleAdmissionPolicy) ProtoMessage() {} func (*AcceptancePolicy_RoleAdmissionPolicy) Descriptor() ([]byte, []int) { - return fileDescriptorTypes, []int{25, 0} + return fileDescriptorTypes, []int{26, 0} } type AcceptancePolicy_RoleAdmissionPolicy_Secret struct { @@ -1246,7 +1261,7 @@ func (m *AcceptancePolicy_RoleAdmissionPolicy_Secret) Reset() { } func (*AcceptancePolicy_RoleAdmissionPolicy_Secret) ProtoMessage() {} func (*AcceptancePolicy_RoleAdmissionPolicy_Secret) Descriptor() ([]byte, []int) { - return fileDescriptorTypes, []int{25, 0, 0} + return fileDescriptorTypes, []int{26, 0, 0} } type ExternalCA struct { @@ -1261,7 +1276,7 @@ type ExternalCA struct { func (m *ExternalCA) Reset() { *m = ExternalCA{} } func (*ExternalCA) ProtoMessage() {} -func (*ExternalCA) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{26} } +func (*ExternalCA) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{27} } type CAConfig struct { // NodeCertExpiry is the duration certificates should be issued for @@ -1273,7 +1288,7 @@ type CAConfig struct { func (m *CAConfig) Reset() { *m = CAConfig{} } func (*CAConfig) ProtoMessage() {} -func (*CAConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{27} } +func (*CAConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{28} } // OrchestrationConfig defines cluster-level orchestration settings. type OrchestrationConfig struct { @@ -1284,7 +1299,7 @@ type OrchestrationConfig struct { func (m *OrchestrationConfig) Reset() { *m = OrchestrationConfig{} } func (*OrchestrationConfig) ProtoMessage() {} -func (*OrchestrationConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{28} } +func (*OrchestrationConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{29} } // TaskDefaults specifies default values for task creation. type TaskDefaults struct { @@ -1298,7 +1313,7 @@ type TaskDefaults struct { func (m *TaskDefaults) Reset() { *m = TaskDefaults{} } func (*TaskDefaults) ProtoMessage() {} -func (*TaskDefaults) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{29} } +func (*TaskDefaults) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{30} } // DispatcherConfig defines cluster-level dispatcher settings. type DispatcherConfig struct { @@ -1309,7 +1324,7 @@ type DispatcherConfig struct { func (m *DispatcherConfig) Reset() { *m = DispatcherConfig{} } func (*DispatcherConfig) ProtoMessage() {} -func (*DispatcherConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{30} } +func (*DispatcherConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{31} } // RaftConfig defines raft settings for the cluster. type RaftConfig struct { @@ -1331,7 +1346,7 @@ type RaftConfig struct { func (m *RaftConfig) Reset() { *m = RaftConfig{} } func (*RaftConfig) ProtoMessage() {} -func (*RaftConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{31} } +func (*RaftConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{32} } // Placement specifies task distribution constraints. type Placement struct { @@ -1341,7 +1356,7 @@ type Placement struct { func (m *Placement) Reset() { *m = Placement{} } func (*Placement) ProtoMessage() {} -func (*Placement) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{32} } +func (*Placement) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{33} } // JoinToken contains the join tokens for workers and managers. type JoinTokens struct { @@ -1353,7 +1368,7 @@ type JoinTokens struct { func (m *JoinTokens) Reset() { *m = JoinTokens{} } func (*JoinTokens) ProtoMessage() {} -func (*JoinTokens) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{33} } +func (*JoinTokens) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{34} } type RootCA struct { // CAKey is the root CA private key. @@ -1368,7 +1383,7 @@ type RootCA struct { func (m *RootCA) Reset() { *m = RootCA{} } func (*RootCA) ProtoMessage() {} -func (*RootCA) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{34} } +func (*RootCA) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{35} } type Certificate struct { Role NodeRole `protobuf:"varint,1,opt,name=role,proto3,enum=docker.swarmkit.v1.NodeRole" json:"role,omitempty"` @@ -1381,7 +1396,7 @@ type Certificate struct { func (m *Certificate) Reset() { *m = Certificate{} } func (*Certificate) ProtoMessage() {} -func (*Certificate) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{35} } +func (*Certificate) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{36} } // Symmetric keys to encrypt inter-agent communication. type EncryptionKey struct { @@ -1397,7 +1412,7 @@ type EncryptionKey struct { func (m *EncryptionKey) Reset() { *m = EncryptionKey{} } func (*EncryptionKey) ProtoMessage() {} -func (*EncryptionKey) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{36} } +func (*EncryptionKey) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{37} } // ManagerStatus provides informations about the state of a manager in the cluster. type ManagerStatus struct { @@ -1414,7 +1429,7 @@ type ManagerStatus struct { func (m *ManagerStatus) Reset() { *m = ManagerStatus{} } func (*ManagerStatus) ProtoMessage() {} -func (*ManagerStatus) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{37} } +func (*ManagerStatus) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{38} } // SecretReference is the linkage between a service and a secret that it uses. type SecretReference struct { @@ -1433,7 +1448,7 @@ type SecretReference struct { func (m *SecretReference) Reset() { *m = SecretReference{} } func (*SecretReference) ProtoMessage() {} -func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{38} } +func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{39} } // BlacklistedCertificate is a record for a blacklisted certificate. It does not // contain the certificate's CN, because these records are indexed by CN. @@ -1445,7 +1460,31 @@ type BlacklistedCertificate struct { func (m *BlacklistedCertificate) Reset() { *m = BlacklistedCertificate{} } func (*BlacklistedCertificate) ProtoMessage() {} -func (*BlacklistedCertificate) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{39} } +func (*BlacklistedCertificate) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{40} } + +// HealthConfig holds configuration settings for the HEALTHCHECK feature. +type HealthConfig struct { + // Test is the test to perform to check that the container is healthy. + // An empty slice means to inherit the default. + // The options are: + // {} : inherit healthcheck + // {"NONE"} : disable healthcheck + // {"CMD", args...} : exec arguments directly + // {"CMD-SHELL", command} : run command with system's default shell + Test []string `protobuf:"bytes,1,rep,name=test" json:"test,omitempty"` + // Interval is the time to wait between checks. Zero means inherit. + Interval *docker_swarmkit_v11.Duration `protobuf:"bytes,2,opt,name=interval" json:"interval,omitempty"` + // Timeout is the time to wait before considering the check to have hung. + // Zero means inherit. + Timeout *docker_swarmkit_v11.Duration `protobuf:"bytes,3,opt,name=timeout" json:"timeout,omitempty"` + // Retries is the number of consecutive failures needed to consider a + // container as unhealthy. Zero means inherit. + Retries int32 `protobuf:"varint,4,opt,name=retries,proto3" json:"retries,omitempty"` +} + +func (m *HealthConfig) Reset() { *m = HealthConfig{} } +func (*HealthConfig) ProtoMessage() {} +func (*HealthConfig) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{41} } func init() { proto.RegisterType((*Version)(nil), "docker.swarmkit.v1.Version") @@ -1467,6 +1506,7 @@ func init() { proto.RegisterType((*UpdateConfig)(nil), "docker.swarmkit.v1.UpdateConfig") proto.RegisterType((*UpdateStatus)(nil), "docker.swarmkit.v1.UpdateStatus") proto.RegisterType((*ContainerStatus)(nil), "docker.swarmkit.v1.ContainerStatus") + proto.RegisterType((*PortStatus)(nil), "docker.swarmkit.v1.PortStatus") proto.RegisterType((*TaskStatus)(nil), "docker.swarmkit.v1.TaskStatus") proto.RegisterType((*NetworkAttachmentConfig)(nil), "docker.swarmkit.v1.NetworkAttachmentConfig") proto.RegisterType((*IPAMConfig)(nil), "docker.swarmkit.v1.IPAMConfig") @@ -1493,6 +1533,7 @@ func init() { proto.RegisterType((*ManagerStatus)(nil), "docker.swarmkit.v1.ManagerStatus") proto.RegisterType((*SecretReference)(nil), "docker.swarmkit.v1.SecretReference") proto.RegisterType((*BlacklistedCertificate)(nil), "docker.swarmkit.v1.BlacklistedCertificate") + proto.RegisterType((*HealthConfig)(nil), "docker.swarmkit.v1.HealthConfig") proto.RegisterEnum("docker.swarmkit.v1.TaskState", TaskState_name, TaskState_value) proto.RegisterEnum("docker.swarmkit.v1.NodeRole", NodeRole_name, NodeRole_value) proto.RegisterEnum("docker.swarmkit.v1.RaftMemberStatus_Reachability", RaftMemberStatus_Reachability_name, RaftMemberStatus_Reachability_value) @@ -1797,16 +1838,34 @@ func (m *ContainerStatus) Copy() *ContainerStatus { return o } +func (m *PortStatus) Copy() *PortStatus { + if m == nil { + return nil + } + + o := &PortStatus{} + + if m.Ports != nil { + o.Ports = make([]*PortConfig, 0, len(m.Ports)) + for _, v := range m.Ports { + o.Ports = append(o.Ports, v.Copy()) + } + } + + return o +} + func (m *TaskStatus) Copy() *TaskStatus { if m == nil { return nil } o := &TaskStatus{ - Timestamp: m.Timestamp.Copy(), - State: m.State, - Message: m.Message, - Err: m.Err, + Timestamp: m.Timestamp.Copy(), + State: m.State, + Message: m.Message, + Err: m.Err, + PortStatus: m.PortStatus.Copy(), } switch m.RuntimeStatus.(type) { @@ -2209,6 +2268,25 @@ func (m *BlacklistedCertificate) Copy() *BlacklistedCertificate { return o } +func (m *HealthConfig) Copy() *HealthConfig { + if m == nil { + return nil + } + + o := &HealthConfig{ + Interval: m.Interval.Copy(), + Timeout: m.Timeout.Copy(), + Retries: m.Retries, + } + + if m.Test != nil { + o.Test = make([]string, 0, len(m.Test)) + o.Test = append(o.Test, m.Test...) + } + + return o +} + func (this *Version) GoString() string { if this == nil { return "nil" @@ -2499,11 +2577,23 @@ func (this *ContainerStatus) GoString() string { s = append(s, "}") return strings.Join(s, "") } +func (this *PortStatus) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 5) + s = append(s, "&api.PortStatus{") + if this.Ports != nil { + s = append(s, "Ports: "+fmt.Sprintf("%#v", this.Ports)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} func (this *TaskStatus) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 9) + s := make([]string, 0, 10) s = append(s, "&api.TaskStatus{") if this.Timestamp != nil { s = append(s, "Timestamp: "+fmt.Sprintf("%#v", this.Timestamp)+",\n") @@ -2514,6 +2604,9 @@ func (this *TaskStatus) GoString() string { if this.RuntimeStatus != nil { s = append(s, "RuntimeStatus: "+fmt.Sprintf("%#v", this.RuntimeStatus)+",\n") } + if this.PortStatus != nil { + s = append(s, "PortStatus: "+fmt.Sprintf("%#v", this.PortStatus)+",\n") + } s = append(s, "}") return strings.Join(s, "") } @@ -2873,6 +2966,23 @@ func (this *BlacklistedCertificate) GoString() string { s = append(s, "}") return strings.Join(s, "") } +func (this *HealthConfig) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 8) + s = append(s, "&api.HealthConfig{") + s = append(s, "Test: "+fmt.Sprintf("%#v", this.Test)+",\n") + if this.Interval != nil { + s = append(s, "Interval: "+fmt.Sprintf("%#v", this.Interval)+",\n") + } + if this.Timeout != nil { + s = append(s, "Timeout: "+fmt.Sprintf("%#v", this.Timeout)+",\n") + } + s = append(s, "Retries: "+fmt.Sprintf("%#v", this.Retries)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} func valueToGoStringTypes(v interface{}, typ string) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -3651,6 +3761,36 @@ func (m *ContainerStatus) MarshalTo(data []byte) (int, error) { return i, nil } +func (m *PortStatus) Marshal() (data []byte, err error) { + size := m.Size() + data = make([]byte, size) + n, err := m.MarshalTo(data) + if err != nil { + return nil, err + } + return data[:n], nil +} + +func (m *PortStatus) MarshalTo(data []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Ports) > 0 { + for _, msg := range m.Ports { + data[i] = 0xa + i++ + i = encodeVarintTypes(data, i, uint64(msg.Size())) + n, err := msg.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + func (m *TaskStatus) Marshal() (data []byte, err error) { size := m.Size() data = make([]byte, size) @@ -3700,6 +3840,16 @@ func (m *TaskStatus) MarshalTo(data []byte) (int, error) { } i += nn17 } + if m.PortStatus != nil { + data[i] = 0x32 + i++ + i = encodeVarintTypes(data, i, uint64(m.PortStatus.Size())) + n18, err := m.PortStatus.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n18 + } return i, nil } @@ -3709,11 +3859,11 @@ func (m *TaskStatus_Container) MarshalTo(data []byte) (int, error) { data[i] = 0x2a i++ i = encodeVarintTypes(data, i, uint64(m.Container.Size())) - n18, err := m.Container.MarshalTo(data[i:]) + n19, err := m.Container.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n18 + i += n19 } return i, nil } @@ -3933,11 +4083,11 @@ func (m *IPAMOptions) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintTypes(data, i, uint64(m.Driver.Size())) - n19, err := m.Driver.MarshalTo(data[i:]) + n20, err := m.Driver.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n19 + i += n20 } if len(m.Configs) > 0 { for _, msg := range m.Configs { @@ -4003,11 +4153,11 @@ func (m *WeightedPeer) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintTypes(data, i, uint64(m.Peer.Size())) - n20, err := m.Peer.MarshalTo(data[i:]) + n21, err := m.Peer.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n20 + i += n21 } if m.Weight != 0 { data[i] = 0x10 @@ -4110,11 +4260,11 @@ func (m *AcceptancePolicy_RoleAdmissionPolicy) MarshalTo(data []byte) (int, erro data[i] = 0x1a i++ i = encodeVarintTypes(data, i, uint64(m.Secret.Size())) - n21, err := m.Secret.MarshalTo(data[i:]) + n22, err := m.Secret.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n21 + i += n22 } return i, nil } @@ -4214,11 +4364,11 @@ func (m *CAConfig) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintTypes(data, i, uint64(m.NodeCertExpiry.Size())) - n22, err := m.NodeCertExpiry.MarshalTo(data[i:]) + n23, err := m.NodeCertExpiry.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n22 + i += n23 } if len(m.ExternalCAs) > 0 { for _, msg := range m.ExternalCAs { @@ -4277,11 +4427,11 @@ func (m *TaskDefaults) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintTypes(data, i, uint64(m.LogDriver.Size())) - n23, err := m.LogDriver.MarshalTo(data[i:]) + n24, err := m.LogDriver.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n23 + i += n24 } return i, nil } @@ -4305,11 +4455,11 @@ func (m *DispatcherConfig) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintTypes(data, i, uint64(m.HeartbeatPeriod.Size())) - n24, err := m.HeartbeatPeriod.MarshalTo(data[i:]) + n25, err := m.HeartbeatPeriod.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n24 + i += n25 } return i, nil } @@ -4456,11 +4606,11 @@ func (m *RootCA) MarshalTo(data []byte) (int, error) { data[i] = 0x22 i++ i = encodeVarintTypes(data, i, uint64(m.JoinTokens.Size())) - n25, err := m.JoinTokens.MarshalTo(data[i:]) + n26, err := m.JoinTokens.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n25 + i += n26 return i, nil } @@ -4493,11 +4643,11 @@ func (m *Certificate) MarshalTo(data []byte) (int, error) { data[i] = 0x1a i++ i = encodeVarintTypes(data, i, uint64(m.Status.Size())) - n26, err := m.Status.MarshalTo(data[i:]) + n27, err := m.Status.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n26 + i += n27 if len(m.Certificate) > 0 { data[i] = 0x22 i++ @@ -4657,11 +4807,69 @@ func (m *BlacklistedCertificate) MarshalTo(data []byte) (int, error) { data[i] = 0xa i++ i = encodeVarintTypes(data, i, uint64(m.Expiry.Size())) - n27, err := m.Expiry.MarshalTo(data[i:]) + n28, err := m.Expiry.MarshalTo(data[i:]) if err != nil { return 0, err } - i += n27 + i += n28 + } + return i, nil +} + +func (m *HealthConfig) Marshal() (data []byte, err error) { + size := m.Size() + data = make([]byte, size) + n, err := m.MarshalTo(data) + if err != nil { + return nil, err + } + return data[:n], nil +} + +func (m *HealthConfig) MarshalTo(data []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Test) > 0 { + for _, s := range m.Test { + data[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + data[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + data[i] = uint8(l) + i++ + i += copy(data[i:], s) + } + } + if m.Interval != nil { + data[i] = 0x12 + i++ + i = encodeVarintTypes(data, i, uint64(m.Interval.Size())) + n29, err := m.Interval.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n29 + } + if m.Timeout != nil { + data[i] = 0x1a + i++ + i = encodeVarintTypes(data, i, uint64(m.Timeout.Size())) + n30, err := m.Timeout.MarshalTo(data[i:]) + if err != nil { + return 0, err + } + i += n30 + } + if m.Retries != 0 { + data[i] = 0x20 + i++ + i = encodeVarintTypes(data, i, uint64(m.Retries)) } return i, nil } @@ -5012,6 +5220,18 @@ func (m *ContainerStatus) Size() (n int) { return n } +func (m *PortStatus) Size() (n int) { + var l int + _ = l + if len(m.Ports) > 0 { + for _, e := range m.Ports { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + return n +} + func (m *TaskStatus) Size() (n int) { var l int _ = l @@ -5033,6 +5253,10 @@ func (m *TaskStatus) Size() (n int) { if m.RuntimeStatus != nil { n += m.RuntimeStatus.Size() } + if m.PortStatus != nil { + l = m.PortStatus.Size() + n += 1 + l + sovTypes(uint64(l)) + } return n } @@ -5460,6 +5684,29 @@ func (m *BlacklistedCertificate) Size() (n int) { return n } +func (m *HealthConfig) Size() (n int) { + var l int + _ = l + if len(m.Test) > 0 { + for _, s := range m.Test { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.Interval != nil { + l = m.Interval.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.Timeout != nil { + l = m.Timeout.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.Retries != 0 { + n += 1 + sovTypes(uint64(m.Retries)) + } + return n +} + func sovTypes(x uint64) (n int) { for { n++ @@ -5727,6 +5974,16 @@ func (this *ContainerStatus) String() string { }, "") return s } +func (this *PortStatus) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PortStatus{`, + `Ports:` + strings.Replace(fmt.Sprintf("%v", this.Ports), "PortConfig", "PortConfig", 1) + `,`, + `}`, + }, "") + return s +} func (this *TaskStatus) String() string { if this == nil { return "nil" @@ -5737,6 +5994,7 @@ func (this *TaskStatus) String() string { `Message:` + fmt.Sprintf("%v", this.Message) + `,`, `Err:` + fmt.Sprintf("%v", this.Err) + `,`, `RuntimeStatus:` + fmt.Sprintf("%v", this.RuntimeStatus) + `,`, + `PortStatus:` + strings.Replace(fmt.Sprintf("%v", this.PortStatus), "PortStatus", "PortStatus", 1) + `,`, `}`, }, "") return s @@ -6073,6 +6331,19 @@ func (this *BlacklistedCertificate) String() string { }, "") return s } +func (this *HealthConfig) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&HealthConfig{`, + `Test:` + fmt.Sprintf("%v", this.Test) + `,`, + `Interval:` + strings.Replace(fmt.Sprintf("%v", this.Interval), "Duration", "docker_swarmkit_v11.Duration", 1) + `,`, + `Timeout:` + strings.Replace(fmt.Sprintf("%v", this.Timeout), "Duration", "docker_swarmkit_v11.Duration", 1) + `,`, + `Retries:` + fmt.Sprintf("%v", this.Retries) + `,`, + `}`, + }, "") + return s +} func valueToStringTypes(v interface{}) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -8686,6 +8957,87 @@ func (m *ContainerStatus) Unmarshal(data []byte) error { } return nil } +func (m *PortStatus) Unmarshal(data []byte) error { + l := len(data) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PortStatus: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PortStatus: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ports", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Ports = append(m.Ports, &PortConfig{}) + if err := m.Ports[len(m.Ports)-1].Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(data[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *TaskStatus) Unmarshal(data []byte) error { l := len(data) iNdEx := 0 @@ -8857,6 +9209,39 @@ func (m *TaskStatus) Unmarshal(data []byte) error { } m.RuntimeStatus = &TaskStatus_Container{v} iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PortStatus", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.PortStatus == nil { + m.PortStatus = &PortStatus{} + } + if err := m.PortStatus.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(data[iNdEx:]) @@ -12152,6 +12537,170 @@ func (m *BlacklistedCertificate) Unmarshal(data []byte) error { } return nil } +func (m *HealthConfig) Unmarshal(data []byte) error { + l := len(data) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: HealthConfig: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: HealthConfig: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Test", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Test = append(m.Test, string(data[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Interval", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Interval == nil { + m.Interval = &docker_swarmkit_v11.Duration{} + } + if err := m.Interval.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Timeout", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Timeout == nil { + m.Timeout = &docker_swarmkit_v11.Duration{} + } + if err := m.Timeout.Unmarshal(data[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Retries", wireType) + } + m.Retries = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + m.Retries |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTypes(data[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTypes(data []byte) (n int, err error) { l := len(data) iNdEx := 0 @@ -12260,236 +12809,242 @@ var ( func init() { proto.RegisterFile("types.proto", fileDescriptorTypes) } var fileDescriptorTypes = []byte{ - // 3694 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x59, 0xcd, 0x6f, 0x23, 0x47, - 0x76, 0x17, 0x3f, 0x45, 0x3e, 0x52, 0x52, 0x4f, 0xcd, 0xec, 0x58, 0x43, 0x8f, 0x25, 0xba, 0xc7, - 0xb3, 0x1e, 0xcf, 0x3a, 0xb4, 0x2d, 0xef, 0x1a, 0xb3, 0x9e, 0xcd, 0xda, 0x2d, 0x92, 0x1a, 0x71, - 0x47, 0x22, 0x89, 0x22, 0x39, 0x03, 0x23, 0x40, 0x88, 0x52, 0x77, 0x89, 0x6a, 0xab, 0xd9, 0xcd, - 0x74, 0x17, 0xa5, 0x61, 0x82, 0x00, 0x93, 0x1c, 0x92, 0x40, 0xa7, 0xdc, 0x03, 0x61, 0x11, 0x24, - 0xc8, 0x21, 0xff, 0x40, 0x80, 0x9c, 0x7c, 0xf4, 0x2d, 0x9b, 0x04, 0x08, 0x16, 0x1b, 0x64, 0x10, - 0x2b, 0xe7, 0x00, 0x7b, 0x09, 0x72, 0x48, 0x0e, 0x41, 0x7d, 0x74, 0xb3, 0xc9, 0xa1, 0x34, 0xe3, - 0xac, 0x2f, 0x64, 0xd7, 0xab, 0xdf, 0x7b, 0xf5, 0xaa, 0xea, 0xd5, 0xab, 0x5f, 0x55, 0x41, 0x81, - 0x4d, 0x46, 0x34, 0xa8, 0x8c, 0x7c, 0x8f, 0x79, 0x08, 0x59, 0x9e, 0x79, 0x4c, 0xfd, 0x4a, 0x70, - 0x4a, 0xfc, 0xe1, 0xb1, 0xcd, 0x2a, 0x27, 0x1f, 0x95, 0x6e, 0x31, 0x7b, 0x48, 0x03, 0x46, 0x86, - 0xa3, 0x0f, 0xa2, 0x2f, 0x09, 0x2f, 0xbd, 0x61, 0x8d, 0x7d, 0xc2, 0x6c, 0xcf, 0xfd, 0x20, 0xfc, - 0x50, 0x15, 0x37, 0x06, 0xde, 0xc0, 0x13, 0x9f, 0x1f, 0xf0, 0x2f, 0x29, 0xd5, 0x37, 0x61, 0xf9, - 0x09, 0xf5, 0x03, 0xdb, 0x73, 0xd1, 0x0d, 0xc8, 0xd8, 0xae, 0x45, 0x9f, 0xad, 0x27, 0xca, 0x89, - 0x7b, 0x69, 0x2c, 0x0b, 0xfa, 0x5f, 0x26, 0xa0, 0x60, 0xb8, 0xae, 0xc7, 0x84, 0xad, 0x00, 0x21, - 0x48, 0xbb, 0x64, 0x48, 0x05, 0x28, 0x8f, 0xc5, 0x37, 0xaa, 0x42, 0xd6, 0x21, 0x07, 0xd4, 0x09, - 0xd6, 0x93, 0xe5, 0xd4, 0xbd, 0xc2, 0xd6, 0x0f, 0x2a, 0x2f, 0xfb, 0x5c, 0x89, 0x19, 0xa9, 0xec, - 0x09, 0x74, 0xdd, 0x65, 0xfe, 0x04, 0x2b, 0xd5, 0xd2, 0x8f, 0xa1, 0x10, 0x13, 0x23, 0x0d, 0x52, - 0xc7, 0x74, 0xa2, 0x9a, 0xe1, 0x9f, 0xdc, 0xbf, 0x13, 0xe2, 0x8c, 0xe9, 0x7a, 0x52, 0xc8, 0x64, - 0xe1, 0xd3, 0xe4, 0x83, 0x84, 0xfe, 0x05, 0xe4, 0x31, 0x0d, 0xbc, 0xb1, 0x6f, 0xd2, 0x00, 0xbd, - 0x07, 0x79, 0x97, 0xb8, 0x5e, 0xdf, 0x1c, 0x8d, 0x03, 0xa1, 0x9e, 0xda, 0x2e, 0x5e, 0xbc, 0xd8, - 0xcc, 0x35, 0x89, 0xeb, 0x55, 0xdb, 0xbd, 0x00, 0xe7, 0x78, 0x75, 0x75, 0x34, 0x0e, 0xd0, 0xdb, - 0x50, 0x1c, 0xd2, 0xa1, 0xe7, 0x4f, 0xfa, 0x07, 0x13, 0x46, 0x03, 0x61, 0x38, 0x85, 0x0b, 0x52, - 0xb6, 0xcd, 0x45, 0xfa, 0x9f, 0x27, 0xe0, 0x46, 0x68, 0x1b, 0xd3, 0xdf, 0x1b, 0xdb, 0x3e, 0x1d, - 0x52, 0x97, 0x05, 0xe8, 0x47, 0x90, 0x75, 0xec, 0xa1, 0xcd, 0x64, 0x1b, 0x85, 0xad, 0xb7, 0x16, - 0xf5, 0x39, 0xf2, 0x0a, 0x2b, 0x30, 0x32, 0xa0, 0xe8, 0xd3, 0x80, 0xfa, 0x27, 0x72, 0x24, 0x44, - 0x93, 0xaf, 0x54, 0x9e, 0x51, 0xd1, 0x77, 0x20, 0xd7, 0x76, 0x08, 0x3b, 0xf4, 0xfc, 0x21, 0xd2, - 0xa1, 0x48, 0x7c, 0xf3, 0xc8, 0x66, 0xd4, 0x64, 0x63, 0x3f, 0x9c, 0x95, 0x19, 0x19, 0xba, 0x09, - 0x49, 0x4f, 0x36, 0x94, 0xdf, 0xce, 0x5e, 0xbc, 0xd8, 0x4c, 0xb6, 0x3a, 0x38, 0xe9, 0x05, 0xfa, - 0x43, 0xb8, 0xd6, 0x76, 0xc6, 0x03, 0xdb, 0xad, 0xd1, 0xc0, 0xf4, 0xed, 0x11, 0xb7, 0xce, 0xa7, - 0x97, 0x07, 0x5f, 0x38, 0xbd, 0xfc, 0x3b, 0x9a, 0xf2, 0xe4, 0x74, 0xca, 0xf5, 0x3f, 0x4d, 0xc2, - 0xb5, 0xba, 0x3b, 0xb0, 0x5d, 0x1a, 0xd7, 0xbe, 0x0b, 0xab, 0x54, 0x08, 0xfb, 0x27, 0x32, 0xa8, - 0x94, 0x9d, 0x15, 0x29, 0x0d, 0x23, 0xad, 0x31, 0x17, 0x2f, 0x1f, 0x2d, 0xea, 0xfe, 0x4b, 0xd6, - 0x17, 0x45, 0x0d, 0xaa, 0xc3, 0xf2, 0x48, 0x74, 0x22, 0x58, 0x4f, 0x09, 0x5b, 0x77, 0x17, 0xd9, - 0x7a, 0xa9, 0x9f, 0xdb, 0xe9, 0xaf, 0x5f, 0x6c, 0x2e, 0xe1, 0x50, 0xf7, 0x37, 0x09, 0xbe, 0xff, - 0x48, 0xc0, 0x5a, 0xd3, 0xb3, 0x66, 0xc6, 0xa1, 0x04, 0xb9, 0x23, 0x2f, 0x60, 0xb1, 0x85, 0x12, - 0x95, 0xd1, 0x03, 0xc8, 0x8d, 0xd4, 0xf4, 0xa9, 0xd9, 0xbf, 0xbd, 0xd8, 0x65, 0x89, 0xc1, 0x11, - 0x1a, 0x3d, 0x84, 0xbc, 0x1f, 0xc6, 0xc4, 0x7a, 0xea, 0x75, 0x02, 0x67, 0x8a, 0x47, 0xbf, 0x0d, - 0x59, 0x39, 0x09, 0xeb, 0x69, 0xa1, 0x79, 0xf7, 0xb5, 0xc6, 0x1c, 0x2b, 0x25, 0xfd, 0x97, 0x09, - 0xd0, 0x30, 0x39, 0x64, 0xfb, 0x74, 0x78, 0x40, 0xfd, 0x0e, 0x23, 0x6c, 0x1c, 0xa0, 0x9b, 0x90, - 0x75, 0x28, 0xb1, 0xa8, 0x2f, 0x3a, 0x99, 0xc3, 0xaa, 0x84, 0x7a, 0x3c, 0xc8, 0x89, 0x79, 0x44, - 0x0e, 0x6c, 0xc7, 0x66, 0x13, 0xd1, 0xcd, 0xd5, 0xc5, 0xb3, 0x3c, 0x6f, 0xb3, 0x82, 0x63, 0x8a, - 0x78, 0xc6, 0x0c, 0x5a, 0x87, 0xe5, 0x21, 0x0d, 0x02, 0x32, 0xa0, 0xa2, 0xf7, 0x79, 0x1c, 0x16, - 0xf5, 0x87, 0x50, 0x8c, 0xeb, 0xa1, 0x02, 0x2c, 0xf7, 0x9a, 0x8f, 0x9b, 0xad, 0xa7, 0x4d, 0x6d, - 0x09, 0xad, 0x41, 0xa1, 0xd7, 0xc4, 0x75, 0xa3, 0xba, 0x6b, 0x6c, 0xef, 0xd5, 0xb5, 0x04, 0x5a, - 0x81, 0xfc, 0xb4, 0x98, 0xd4, 0x7f, 0x9e, 0x00, 0xe0, 0x13, 0xa8, 0x3a, 0xf5, 0x29, 0x64, 0x02, - 0x46, 0x98, 0x9c, 0xb8, 0xd5, 0xad, 0x77, 0x16, 0x79, 0x3d, 0x85, 0x57, 0xf8, 0x1f, 0xc5, 0x52, - 0x25, 0xee, 0x61, 0x72, 0xde, 0xc3, 0x8c, 0x40, 0xce, 0xba, 0x96, 0x83, 0x74, 0x8d, 0x7f, 0x25, - 0x50, 0x1e, 0x32, 0xb8, 0x6e, 0xd4, 0xbe, 0xd0, 0x92, 0x48, 0x83, 0x62, 0xad, 0xd1, 0xa9, 0xb6, - 0x9a, 0xcd, 0x7a, 0xb5, 0x5b, 0xaf, 0x69, 0x29, 0xfd, 0x2e, 0x64, 0x1a, 0x43, 0x32, 0xa0, 0xe8, - 0x36, 0x8f, 0x80, 0x43, 0xea, 0x53, 0xd7, 0x0c, 0x03, 0x6b, 0x2a, 0xd0, 0x7f, 0x91, 0x87, 0xcc, - 0xbe, 0x37, 0x76, 0x19, 0xda, 0x8a, 0xad, 0xe2, 0xd5, 0xad, 0x8d, 0x45, 0x5d, 0x10, 0xc0, 0x4a, - 0x77, 0x32, 0xa2, 0x6a, 0x95, 0xdf, 0x84, 0xac, 0x8c, 0x15, 0xe5, 0xba, 0x2a, 0x71, 0x39, 0x23, - 0xfe, 0x80, 0x32, 0x35, 0xe8, 0xaa, 0x84, 0xee, 0x41, 0xce, 0xa7, 0xc4, 0xf2, 0x5c, 0x67, 0x22, - 0x42, 0x2a, 0x27, 0xd3, 0x2c, 0xa6, 0xc4, 0x6a, 0xb9, 0xce, 0x04, 0x47, 0xb5, 0x68, 0x17, 0x8a, - 0x07, 0xb6, 0x6b, 0xf5, 0xbd, 0x91, 0xcc, 0x79, 0x99, 0xcb, 0x03, 0x50, 0x7a, 0xb5, 0x6d, 0xbb, - 0x56, 0x4b, 0x82, 0x71, 0xe1, 0x60, 0x5a, 0x40, 0x4d, 0x58, 0x3d, 0xf1, 0x9c, 0xf1, 0x90, 0x46, - 0xb6, 0xb2, 0xc2, 0xd6, 0xbb, 0x97, 0xdb, 0x7a, 0x22, 0xf0, 0xa1, 0xb5, 0x95, 0x93, 0x78, 0x11, - 0x3d, 0x86, 0x15, 0x36, 0x1c, 0x1d, 0x06, 0x91, 0xb9, 0x65, 0x61, 0xee, 0xfb, 0x57, 0x0c, 0x18, - 0x87, 0x87, 0xd6, 0x8a, 0x2c, 0x56, 0x2a, 0xfd, 0x71, 0x0a, 0x0a, 0x31, 0xcf, 0x51, 0x07, 0x0a, - 0x23, 0xdf, 0x1b, 0x91, 0x81, 0xc8, 0xdb, 0x6a, 0x2e, 0x3e, 0x7a, 0xad, 0x5e, 0x57, 0xda, 0x53, - 0x45, 0x1c, 0xb7, 0xa2, 0x9f, 0x27, 0xa1, 0x10, 0xab, 0x44, 0xf7, 0x21, 0x87, 0xdb, 0xb8, 0xf1, - 0xc4, 0xe8, 0xd6, 0xb5, 0xa5, 0xd2, 0xed, 0xb3, 0xf3, 0xf2, 0xba, 0xb0, 0x16, 0x37, 0xd0, 0xf6, - 0xed, 0x13, 0x1e, 0x7a, 0xf7, 0x60, 0x39, 0x84, 0x26, 0x4a, 0x6f, 0x9e, 0x9d, 0x97, 0xdf, 0x98, - 0x87, 0xc6, 0x90, 0xb8, 0xb3, 0x6b, 0xe0, 0x7a, 0x4d, 0x4b, 0x2e, 0x46, 0xe2, 0xce, 0x11, 0xf1, - 0xa9, 0x85, 0xbe, 0x0f, 0x59, 0x05, 0x4c, 0x95, 0x4a, 0x67, 0xe7, 0xe5, 0x9b, 0xf3, 0xc0, 0x29, - 0x0e, 0x77, 0xf6, 0x8c, 0x27, 0x75, 0x2d, 0xbd, 0x18, 0x87, 0x3b, 0x0e, 0x39, 0xa1, 0xe8, 0x1d, - 0xc8, 0x48, 0x58, 0xa6, 0x74, 0xeb, 0xec, 0xbc, 0xfc, 0xbd, 0x97, 0xcc, 0x71, 0x54, 0x69, 0xfd, - 0xcf, 0xfe, 0x6a, 0x63, 0xe9, 0xef, 0xff, 0x7a, 0x43, 0x9b, 0xaf, 0x2e, 0xfd, 0x6f, 0x02, 0x56, - 0x66, 0xa6, 0x1c, 0xe9, 0x90, 0x75, 0x3d, 0xd3, 0x1b, 0xc9, 0x74, 0x9e, 0xdb, 0x86, 0x8b, 0x17, - 0x9b, 0xd9, 0xa6, 0x57, 0xf5, 0x46, 0x13, 0xac, 0x6a, 0xd0, 0xe3, 0xb9, 0x0d, 0xe9, 0xe3, 0xd7, - 0x8c, 0xa7, 0x85, 0x5b, 0xd2, 0x67, 0xb0, 0x62, 0xf9, 0xf6, 0x09, 0xf5, 0xfb, 0xa6, 0xe7, 0x1e, - 0xda, 0x03, 0x95, 0xaa, 0x4b, 0x8b, 0x6c, 0xd6, 0x04, 0x10, 0x17, 0xa5, 0x42, 0x55, 0xe0, 0x7f, - 0x83, 0xcd, 0xa8, 0xf4, 0x04, 0x8a, 0xf1, 0x08, 0x45, 0x6f, 0x01, 0x04, 0xf6, 0xef, 0x53, 0xc5, - 0x6f, 0x04, 0x1b, 0xc2, 0x79, 0x2e, 0x11, 0xec, 0x06, 0xbd, 0x0b, 0xe9, 0xa1, 0x67, 0x49, 0x3b, - 0x99, 0xed, 0xeb, 0x7c, 0x4f, 0xfc, 0xd5, 0x8b, 0xcd, 0x82, 0x17, 0x54, 0x76, 0x6c, 0x87, 0xee, - 0x7b, 0x16, 0xc5, 0x02, 0xa0, 0x9f, 0x40, 0x9a, 0xa7, 0x0a, 0xf4, 0x26, 0xa4, 0xb7, 0x1b, 0xcd, - 0x9a, 0xb6, 0x54, 0xba, 0x76, 0x76, 0x5e, 0x5e, 0x11, 0x43, 0xc2, 0x2b, 0x78, 0xec, 0xa2, 0x4d, - 0xc8, 0x3e, 0x69, 0xed, 0xf5, 0xf6, 0x79, 0x78, 0x5d, 0x3f, 0x3b, 0x2f, 0xaf, 0x45, 0xd5, 0x72, - 0xd0, 0xd0, 0x5b, 0x90, 0xe9, 0xee, 0xb7, 0x77, 0x3a, 0x5a, 0xb2, 0x84, 0xce, 0xce, 0xcb, 0xab, - 0x51, 0xbd, 0xf0, 0xb9, 0x74, 0x4d, 0xcd, 0x6a, 0x3e, 0x92, 0xeb, 0xff, 0x93, 0x84, 0x15, 0xcc, - 0xf9, 0xad, 0xcf, 0xda, 0x9e, 0x63, 0x9b, 0x13, 0xd4, 0x86, 0xbc, 0xe9, 0xb9, 0x96, 0x1d, 0x5b, - 0x53, 0x5b, 0x97, 0x6c, 0x82, 0x53, 0xad, 0xb0, 0x54, 0x0d, 0x35, 0xf1, 0xd4, 0x08, 0xda, 0x82, - 0x8c, 0x45, 0x1d, 0x32, 0xb9, 0x6a, 0x37, 0xae, 0x29, 0x2e, 0x8d, 0x25, 0x54, 0x30, 0x47, 0xf2, - 0xac, 0x4f, 0x18, 0xa3, 0xc3, 0x11, 0x93, 0xbb, 0x71, 0x1a, 0x17, 0x86, 0xe4, 0x99, 0xa1, 0x44, - 0xe8, 0x87, 0x90, 0x3d, 0xb5, 0x5d, 0xcb, 0x3b, 0x55, 0x1b, 0xee, 0xd5, 0x76, 0x15, 0x56, 0x3f, - 0xe3, 0xfb, 0xec, 0x9c, 0xb3, 0x7c, 0xd4, 0x9b, 0xad, 0x66, 0x3d, 0x1c, 0x75, 0x55, 0xdf, 0x72, - 0x9b, 0x9e, 0xcb, 0x57, 0x0c, 0xb4, 0x9a, 0xfd, 0x1d, 0xa3, 0xb1, 0xd7, 0xc3, 0x7c, 0xe4, 0x6f, - 0x9c, 0x9d, 0x97, 0xb5, 0x08, 0xb2, 0x43, 0x6c, 0x87, 0x93, 0xc0, 0x5b, 0x90, 0x32, 0x9a, 0x5f, - 0x68, 0xc9, 0x92, 0x76, 0x76, 0x5e, 0x2e, 0x46, 0xd5, 0x86, 0x3b, 0x99, 0x2e, 0xa6, 0xf9, 0x76, - 0xf5, 0x7f, 0x4b, 0x42, 0xb1, 0x37, 0xb2, 0x08, 0xa3, 0x32, 0x32, 0x51, 0x19, 0x0a, 0x23, 0xe2, - 0x13, 0xc7, 0xa1, 0x8e, 0x1d, 0x0c, 0xd5, 0x41, 0x21, 0x2e, 0x42, 0x0f, 0xbe, 0xc5, 0x60, 0x2a, - 0x12, 0xa6, 0x86, 0xb4, 0x07, 0xab, 0x87, 0xd2, 0xd9, 0x3e, 0x31, 0xc5, 0xec, 0xa6, 0xc4, 0xec, - 0x56, 0x16, 0x99, 0x88, 0x7b, 0x55, 0x51, 0x7d, 0x34, 0x84, 0x16, 0x5e, 0x39, 0x8c, 0x17, 0xd1, - 0x27, 0xb0, 0x3c, 0xf4, 0x5c, 0x9b, 0x79, 0xfe, 0x6b, 0xcd, 0x43, 0x08, 0x46, 0xf7, 0xe1, 0x1a, - 0x9f, 0xe1, 0xd0, 0x25, 0x51, 0x2d, 0x76, 0xae, 0x24, 0x5e, 0x1b, 0x92, 0x67, 0xaa, 0x4d, 0xcc, - 0xc5, 0xfa, 0x27, 0xb0, 0x32, 0xe3, 0x03, 0xdf, 0xcd, 0xdb, 0x46, 0xaf, 0x53, 0xd7, 0x96, 0x50, - 0x11, 0x72, 0xd5, 0x56, 0xb3, 0xdb, 0x68, 0xf6, 0x38, 0xf5, 0x28, 0x42, 0x0e, 0xb7, 0xf6, 0xf6, - 0xb6, 0x8d, 0xea, 0x63, 0x2d, 0xa9, 0xff, 0x57, 0x34, 0xbe, 0x8a, 0x7b, 0x6c, 0xcf, 0x72, 0x8f, - 0xf7, 0x2f, 0xef, 0xba, 0x62, 0x1f, 0xd3, 0x42, 0xc4, 0x41, 0x7e, 0x02, 0x20, 0xa6, 0x91, 0x5a, - 0x7d, 0xc2, 0xae, 0x3a, 0x5f, 0x74, 0xc3, 0x93, 0x23, 0xce, 0x2b, 0x05, 0x83, 0xa1, 0xcf, 0xa1, - 0x68, 0x7a, 0xc3, 0x91, 0x43, 0x95, 0x7e, 0xea, 0x75, 0xf4, 0x0b, 0x91, 0x8a, 0xc1, 0xe2, 0x1c, - 0x28, 0x3d, 0xcb, 0x81, 0xfe, 0x24, 0x01, 0x85, 0x98, 0xc3, 0xb3, 0x54, 0xa8, 0x08, 0xb9, 0x5e, - 0xbb, 0x66, 0x74, 0x1b, 0xcd, 0x47, 0x5a, 0x02, 0x01, 0x64, 0xc5, 0x00, 0xd6, 0xb4, 0x24, 0xa7, - 0x6b, 0xd5, 0xd6, 0x7e, 0x7b, 0xaf, 0x2e, 0xc8, 0x10, 0xba, 0x01, 0x5a, 0x38, 0x84, 0xfd, 0x4e, - 0xd7, 0xc0, 0x5c, 0x9a, 0x46, 0xd7, 0x61, 0x2d, 0x92, 0x2a, 0xcd, 0x0c, 0xba, 0x09, 0x28, 0x12, - 0x4e, 0x4d, 0x64, 0xf5, 0x3f, 0x84, 0xb5, 0xaa, 0xe7, 0x32, 0x62, 0xbb, 0x11, 0x95, 0xdd, 0xe2, - 0xfd, 0x56, 0xa2, 0xbe, 0x6d, 0xc9, 0x6c, 0xbb, 0xbd, 0x76, 0xf1, 0x62, 0xb3, 0x10, 0x41, 0x1b, - 0x35, 0xde, 0xd3, 0xb0, 0x60, 0xf1, 0x35, 0x35, 0xb2, 0x2d, 0x95, 0x3c, 0x97, 0x2f, 0x5e, 0x6c, - 0xa6, 0xda, 0x8d, 0x1a, 0xe6, 0x32, 0xf4, 0x26, 0xe4, 0xe9, 0x33, 0x9b, 0xf5, 0x4d, 0x9e, 0x5d, - 0xf9, 0x18, 0x66, 0x70, 0x8e, 0x0b, 0xaa, 0x3c, 0x99, 0xfe, 0x51, 0x12, 0xa0, 0x4b, 0x82, 0x63, - 0xd5, 0xf4, 0x43, 0xc8, 0x47, 0x87, 0xf8, 0xab, 0x0e, 0x93, 0xb1, 0xf9, 0x8a, 0xf0, 0xe8, 0xe3, - 0x30, 0x62, 0x24, 0xc7, 0x5e, 0xac, 0xa8, 0xda, 0x5a, 0x44, 0x53, 0x67, 0x89, 0x34, 0xdf, 0x6b, - 0xa8, 0xef, 0xab, 0x89, 0xe3, 0x9f, 0xa8, 0x2a, 0xf2, 0xad, 0xec, 0xb3, 0x62, 0x6e, 0x77, 0x16, - 0x35, 0x32, 0x37, 0xa0, 0xbb, 0x4b, 0x78, 0xaa, 0xb7, 0xad, 0xc1, 0xaa, 0x3f, 0x76, 0xb9, 0xd7, - 0xfd, 0x40, 0x54, 0xeb, 0x36, 0xbc, 0xd1, 0xa4, 0xec, 0xd4, 0xf3, 0x8f, 0x0d, 0xc6, 0x88, 0x79, - 0xc4, 0x0f, 0xd5, 0x2a, 0xc9, 0x4c, 0x09, 0x67, 0x62, 0x86, 0x70, 0xae, 0xc3, 0x32, 0x71, 0x6c, - 0x12, 0x50, 0xb9, 0x4b, 0xe7, 0x71, 0x58, 0xe4, 0xb4, 0x98, 0x58, 0x96, 0x4f, 0x83, 0x80, 0xca, - 0x63, 0x60, 0x1e, 0x4f, 0x05, 0xfa, 0x3f, 0x27, 0x01, 0x1a, 0x6d, 0x63, 0x5f, 0x99, 0xaf, 0x41, - 0xf6, 0x90, 0x0c, 0x6d, 0x67, 0x72, 0xd5, 0x22, 0x9b, 0xe2, 0x2b, 0x86, 0x34, 0xb4, 0x23, 0x74, - 0xb0, 0xd2, 0x15, 0x6c, 0x79, 0x7c, 0xe0, 0x52, 0x16, 0xb1, 0x65, 0x51, 0xe2, 0x5b, 0xb3, 0x4f, - 0xdc, 0x68, 0x60, 0x65, 0x81, 0xbb, 0x3e, 0x20, 0x8c, 0x9e, 0x92, 0x49, 0xb8, 0x26, 0x54, 0x11, - 0xed, 0x72, 0x16, 0xcd, 0x0f, 0xf7, 0xd4, 0x5a, 0xcf, 0x08, 0xee, 0xf1, 0x2a, 0x7f, 0xb0, 0x82, - 0x4b, 0xd2, 0x11, 0x69, 0x97, 0x1e, 0x8a, 0x9d, 0x72, 0x5a, 0xf5, 0xad, 0x0e, 0xb1, 0x1f, 0xc2, - 0xca, 0x4c, 0x3f, 0x5f, 0x3a, 0xa6, 0x34, 0xda, 0x4f, 0x7e, 0xa8, 0xa5, 0xd5, 0xd7, 0x27, 0x5a, - 0x56, 0xff, 0xdb, 0x14, 0x40, 0xdb, 0xf3, 0xc3, 0x49, 0x5b, 0x7c, 0x2d, 0x94, 0x13, 0x97, 0x4c, - 0xa6, 0xe7, 0xa8, 0xf0, 0x5c, 0xc8, 0xd3, 0xa7, 0x56, 0x38, 0xed, 0x15, 0x70, 0x1c, 0x29, 0xa2, - 0x4d, 0x28, 0xc8, 0xf9, 0xef, 0x8f, 0x3c, 0x5f, 0xe6, 0xa3, 0x15, 0x0c, 0x52, 0xc4, 0x35, 0xd1, - 0x5d, 0x58, 0x1d, 0x8d, 0x0f, 0x1c, 0x3b, 0x38, 0xa2, 0x96, 0xc4, 0xa4, 0x05, 0x66, 0x25, 0x92, - 0x0a, 0xd8, 0x3e, 0x14, 0x95, 0xa0, 0x2f, 0x28, 0x4f, 0x46, 0x38, 0x74, 0xff, 0x55, 0x0e, 0x49, - 0x15, 0xc1, 0x84, 0x0a, 0xa3, 0x69, 0x41, 0xaf, 0x41, 0x2e, 0x74, 0x16, 0xad, 0x43, 0xaa, 0x5b, - 0x6d, 0x6b, 0x4b, 0xa5, 0xb5, 0xb3, 0xf3, 0x72, 0x21, 0x14, 0x77, 0xab, 0x6d, 0x5e, 0xd3, 0xab, - 0xb5, 0xb5, 0xc4, 0x6c, 0x4d, 0xaf, 0xd6, 0x2e, 0xa5, 0xf9, 0xa6, 0xab, 0x1f, 0x42, 0x21, 0xd6, - 0x02, 0xba, 0x03, 0xcb, 0x8d, 0xe6, 0x23, 0x5c, 0xef, 0x74, 0xb4, 0xa5, 0xd2, 0xcd, 0xb3, 0xf3, - 0x32, 0x8a, 0xd5, 0x36, 0xdc, 0x01, 0x9f, 0x1f, 0xf4, 0x16, 0xa4, 0x77, 0x5b, 0x9d, 0x6e, 0xc8, - 0xb1, 0x62, 0x88, 0x5d, 0x2f, 0x60, 0xa5, 0xeb, 0x6a, 0x37, 0x8f, 0x1b, 0xd6, 0xff, 0x22, 0x01, - 0x59, 0x49, 0x35, 0x17, 0x4e, 0x94, 0x01, 0xcb, 0xe1, 0x01, 0x48, 0xf2, 0xdf, 0x77, 0x2f, 0xe7, - 0xaa, 0x15, 0x45, 0x2d, 0x65, 0xf8, 0x85, 0x7a, 0xa5, 0x4f, 0xa1, 0x18, 0xaf, 0xf8, 0x56, 0xc1, - 0xf7, 0x07, 0x50, 0xe0, 0xf1, 0x1d, 0x72, 0xd6, 0x2d, 0xc8, 0x4a, 0x3a, 0xac, 0x92, 0xe1, 0x55, - 0xc4, 0x59, 0x21, 0xd1, 0x03, 0x58, 0x96, 0x64, 0x3b, 0xbc, 0x06, 0xda, 0xb8, 0x7a, 0x15, 0xe1, - 0x10, 0xae, 0x7f, 0x06, 0xe9, 0x36, 0xa5, 0x3e, 0x1f, 0x7b, 0xd7, 0xb3, 0xe8, 0x34, 0xf7, 0xab, - 0x73, 0x82, 0x45, 0x1b, 0x35, 0x7e, 0x4e, 0xb0, 0x68, 0xc3, 0xe2, 0x83, 0xc7, 0xf3, 0x4a, 0x78, - 0x13, 0xc6, 0xbf, 0xf5, 0x2e, 0x14, 0x9f, 0x52, 0x7b, 0x70, 0xc4, 0xa8, 0x25, 0x0c, 0xbd, 0x0f, - 0xe9, 0x11, 0x8d, 0x9c, 0x5f, 0x5f, 0x18, 0x60, 0x94, 0xfa, 0x58, 0xa0, 0x78, 0x1e, 0x39, 0x15, - 0xda, 0xea, 0xf2, 0x51, 0x95, 0xf4, 0x7f, 0x4a, 0xc2, 0x6a, 0x23, 0x08, 0xc6, 0xc4, 0x35, 0x43, - 0x72, 0xf0, 0xd3, 0x59, 0x72, 0x70, 0x6f, 0x61, 0x0f, 0x67, 0x54, 0x66, 0x2f, 0x27, 0x54, 0x6e, - 0x4f, 0x46, 0xb9, 0x5d, 0xff, 0xcf, 0x44, 0x78, 0x2b, 0x71, 0x37, 0xb6, 0xdc, 0x4b, 0xeb, 0x67, - 0xe7, 0xe5, 0x1b, 0x71, 0x4b, 0xb4, 0xe7, 0x1e, 0xbb, 0xde, 0xa9, 0x8b, 0xde, 0x86, 0x0c, 0xae, - 0x37, 0xeb, 0x4f, 0xb5, 0x84, 0x0c, 0xcf, 0x19, 0x10, 0xa6, 0x2e, 0x3d, 0xe5, 0x96, 0xda, 0xf5, - 0x66, 0x8d, 0x6f, 0xe3, 0xc9, 0x05, 0x96, 0xda, 0xd4, 0xb5, 0x6c, 0x77, 0x80, 0xee, 0x40, 0xb6, - 0xd1, 0xe9, 0xf4, 0xc4, 0xb9, 0xf1, 0x8d, 0xb3, 0xf3, 0xf2, 0xf5, 0x19, 0x14, 0x2f, 0x50, 0x8b, - 0x83, 0x38, 0xaf, 0xe5, 0x1b, 0xfc, 0x02, 0x10, 0xa7, 0x5c, 0x12, 0x84, 0x5b, 0x5d, 0x7e, 0xa8, - 0xcd, 0x2c, 0x00, 0x61, 0x8f, 0xff, 0xaa, 0xe5, 0xf6, 0xaf, 0x49, 0xd0, 0x0c, 0xd3, 0xa4, 0x23, - 0xc6, 0xeb, 0xd5, 0x81, 0xa2, 0x0b, 0xb9, 0x11, 0xff, 0xb2, 0xc5, 0x01, 0x89, 0xc7, 0xce, 0x83, - 0x85, 0xd7, 0xd7, 0x73, 0x7a, 0x15, 0xec, 0x39, 0xd4, 0xb0, 0x86, 0x76, 0x10, 0xf0, 0x83, 0xb3, - 0x90, 0xe1, 0xc8, 0x52, 0xe9, 0xd7, 0x09, 0xb8, 0xbe, 0x00, 0x81, 0x3e, 0x84, 0xb4, 0xef, 0x39, - 0xe1, 0x1c, 0xde, 0xbe, 0xec, 0x72, 0x89, 0xab, 0x62, 0x81, 0x44, 0x1b, 0x00, 0x64, 0xcc, 0x3c, - 0x22, 0xda, 0x17, 0xb3, 0x97, 0xc3, 0x31, 0x09, 0x7a, 0x0a, 0xd9, 0x80, 0x9a, 0x3e, 0x0d, 0xb9, - 0xda, 0x67, 0xff, 0x5f, 0xef, 0x2b, 0x1d, 0x61, 0x06, 0x2b, 0x73, 0xa5, 0x0a, 0x64, 0xa5, 0x84, - 0x87, 0xbd, 0x45, 0x18, 0x11, 0x4e, 0x17, 0xb1, 0xf8, 0xe6, 0xd1, 0x44, 0x9c, 0x41, 0x18, 0x4d, - 0xc4, 0x19, 0xe8, 0x3f, 0x4f, 0x02, 0xd4, 0x9f, 0x31, 0xea, 0xbb, 0xc4, 0xa9, 0x1a, 0xa8, 0x1e, - 0xcb, 0xfe, 0xb2, 0xb7, 0xef, 0x2d, 0xbc, 0x72, 0x8c, 0x34, 0x2a, 0x55, 0x63, 0x41, 0xfe, 0xbf, - 0x05, 0xa9, 0xb1, 0xef, 0xa8, 0xeb, 0x6b, 0x41, 0xb2, 0x7a, 0x78, 0x0f, 0x73, 0x19, 0xaa, 0x4f, - 0xd3, 0x56, 0xea, 0xf2, 0x77, 0x87, 0x58, 0x03, 0xdf, 0x7d, 0xea, 0x7a, 0x1f, 0x60, 0xea, 0x35, - 0xda, 0x80, 0x4c, 0x75, 0xa7, 0xd3, 0xd9, 0xd3, 0x96, 0x64, 0x6e, 0x9e, 0x56, 0x09, 0xb1, 0xfe, - 0x37, 0x09, 0xc8, 0x55, 0x0d, 0xb5, 0x63, 0xee, 0x80, 0x26, 0x12, 0x8e, 0x49, 0x7d, 0xd6, 0xa7, - 0xcf, 0x46, 0xb6, 0x3f, 0x51, 0x39, 0xe3, 0xea, 0x13, 0xca, 0x2a, 0xd7, 0xaa, 0x52, 0x9f, 0xd5, - 0x85, 0x0e, 0xc2, 0x50, 0xa4, 0xaa, 0x8b, 0x7d, 0x93, 0x84, 0x19, 0x7c, 0xe3, 0xea, 0xa1, 0x90, - 0xcc, 0x76, 0x5a, 0x0e, 0x70, 0x21, 0x34, 0x52, 0x25, 0x81, 0xfe, 0x04, 0xae, 0xb7, 0x7c, 0xf3, - 0x88, 0x06, 0x4c, 0x36, 0xaa, 0x5c, 0xfe, 0x0c, 0x6e, 0x33, 0x12, 0x1c, 0xf7, 0x8f, 0xec, 0x80, - 0x79, 0xfe, 0xa4, 0xef, 0x53, 0x46, 0x5d, 0x5e, 0xdf, 0x17, 0xaf, 0x1b, 0xea, 0x7e, 0xe1, 0x16, - 0xc7, 0xec, 0x4a, 0x08, 0x0e, 0x11, 0x7b, 0x1c, 0xa0, 0x37, 0xa0, 0xc8, 0xc9, 0x68, 0x8d, 0x1e, - 0x92, 0xb1, 0xc3, 0x02, 0xf4, 0x63, 0x00, 0xc7, 0x1b, 0xf4, 0x5f, 0x3b, 0xdd, 0xe7, 0x1d, 0x6f, - 0x20, 0x3f, 0xf5, 0xdf, 0x01, 0xad, 0x66, 0x07, 0x23, 0xc2, 0xcc, 0xa3, 0xf0, 0xe2, 0x04, 0x3d, - 0x02, 0xed, 0x88, 0x12, 0x9f, 0x1d, 0x50, 0xc2, 0xfa, 0x23, 0xea, 0xdb, 0x9e, 0xf5, 0x5a, 0x43, - 0xba, 0x16, 0x69, 0xb5, 0x85, 0x92, 0xfe, 0xdf, 0x09, 0x00, 0x4c, 0x0e, 0x43, 0x72, 0xf3, 0x03, - 0xb8, 0x16, 0xb8, 0x64, 0x14, 0x1c, 0x79, 0xac, 0x6f, 0xbb, 0x8c, 0xfa, 0x27, 0xc4, 0x51, 0x87, - 0x5f, 0x2d, 0xac, 0x68, 0x28, 0x39, 0x7a, 0x1f, 0xd0, 0x31, 0xa5, 0xa3, 0xbe, 0xe7, 0x58, 0xfd, - 0xb0, 0x52, 0x3e, 0xbf, 0xa4, 0xb1, 0xc6, 0x6b, 0x5a, 0x8e, 0xd5, 0x09, 0xe5, 0x68, 0x1b, 0x36, - 0xf8, 0x08, 0x50, 0x97, 0xf9, 0x36, 0x0d, 0xfa, 0x87, 0x9e, 0xdf, 0x0f, 0x1c, 0xef, 0xb4, 0x7f, - 0xe8, 0x39, 0x8e, 0x77, 0x4a, 0xfd, 0xf0, 0x6a, 0xa1, 0xe4, 0x78, 0x83, 0xba, 0x04, 0xed, 0x78, - 0x7e, 0xc7, 0xf1, 0x4e, 0x77, 0x42, 0x04, 0x67, 0x40, 0xd3, 0x6e, 0x33, 0xdb, 0x3c, 0x0e, 0x19, - 0x50, 0x24, 0xed, 0xda, 0xe6, 0x31, 0xba, 0x03, 0x2b, 0xd4, 0xa1, 0xe2, 0x80, 0x2a, 0x51, 0x19, - 0x81, 0x2a, 0x86, 0x42, 0x0e, 0xd2, 0x7f, 0x0b, 0xf2, 0x6d, 0x87, 0x98, 0xe2, 0x91, 0x8b, 0x1f, - 0xf7, 0x4d, 0xcf, 0xe5, 0x41, 0x60, 0xbb, 0x4c, 0x66, 0xc7, 0x3c, 0x8e, 0x8b, 0xf4, 0x9f, 0x02, - 0xfc, 0xcc, 0xb3, 0xdd, 0xae, 0x77, 0x4c, 0x5d, 0xf1, 0x1e, 0xc0, 0x19, 0xbd, 0x9a, 0xca, 0x3c, - 0x56, 0x25, 0x71, 0xde, 0x20, 0x2e, 0x19, 0x50, 0x3f, 0xba, 0x16, 0x97, 0x45, 0xfd, 0xeb, 0x04, - 0x64, 0xb1, 0xe7, 0xb1, 0xaa, 0x81, 0xca, 0x90, 0x35, 0x49, 0x3f, 0x5c, 0x79, 0xc5, 0xed, 0xfc, - 0xc5, 0x8b, 0xcd, 0x4c, 0xd5, 0x78, 0x4c, 0x27, 0x38, 0x63, 0x92, 0xc7, 0x74, 0xc2, 0xb7, 0x68, - 0x93, 0x88, 0xf5, 0x22, 0xcc, 0x14, 0xe5, 0x16, 0x5d, 0x35, 0xf8, 0x62, 0xc0, 0x59, 0x93, 0xf0, - 0x7f, 0xf4, 0x21, 0x14, 0x15, 0xa8, 0x7f, 0x44, 0x82, 0x23, 0xc9, 0xc3, 0xb7, 0x57, 0x2f, 0x5e, - 0x6c, 0x82, 0x44, 0xee, 0x92, 0xe0, 0x08, 0x83, 0x44, 0xf3, 0x6f, 0x54, 0x87, 0xc2, 0x97, 0x9e, - 0xed, 0xf6, 0x99, 0xe8, 0x84, 0xba, 0x25, 0x58, 0xb8, 0x7e, 0xa6, 0x5d, 0x55, 0x57, 0x17, 0xf0, - 0x65, 0x24, 0xd1, 0xff, 0x25, 0x01, 0x05, 0x6e, 0xd3, 0x3e, 0xb4, 0x4d, 0xbe, 0xa5, 0x7e, 0xfb, - 0x4c, 0x7f, 0x0b, 0x52, 0x66, 0xe0, 0xab, 0xbe, 0x89, 0x54, 0x57, 0xed, 0x60, 0xcc, 0x65, 0xe8, - 0x73, 0xc8, 0xca, 0x83, 0x93, 0x4a, 0xf2, 0xfa, 0xab, 0x37, 0x7f, 0xe5, 0xa2, 0xd2, 0x13, 0x73, - 0x39, 0xf5, 0x4e, 0xf4, 0xb2, 0x88, 0xe3, 0x22, 0x74, 0x13, 0x92, 0xa6, 0x2b, 0x82, 0x42, 0xbd, - 0x13, 0x56, 0x9b, 0x38, 0x69, 0xba, 0xfa, 0x3f, 0x26, 0x60, 0xa5, 0xee, 0x9a, 0xfe, 0x44, 0x24, - 0x49, 0x3e, 0x11, 0xb7, 0x21, 0x1f, 0x8c, 0x0f, 0x82, 0x49, 0xc0, 0xe8, 0x30, 0x7c, 0x86, 0x88, - 0x04, 0xa8, 0x01, 0x79, 0xe2, 0x0c, 0x3c, 0xdf, 0x66, 0x47, 0x43, 0xc5, 0xfb, 0x17, 0x27, 0xe6, - 0xb8, 0xcd, 0x8a, 0x11, 0xaa, 0xe0, 0xa9, 0x76, 0x98, 0x8a, 0x53, 0xc2, 0x59, 0x91, 0x8a, 0xdf, - 0x86, 0xa2, 0x43, 0x86, 0x9c, 0xe6, 0xf7, 0xf9, 0x71, 0x52, 0xf4, 0x23, 0x8d, 0x0b, 0x4a, 0xc6, - 0x8f, 0xc8, 0xba, 0x0e, 0xf9, 0xc8, 0x18, 0x5a, 0x83, 0x82, 0x51, 0xef, 0xf4, 0x3f, 0xda, 0x7a, - 0xd0, 0x7f, 0x54, 0xdd, 0xd7, 0x96, 0x14, 0x13, 0xf8, 0xbb, 0x04, 0xac, 0xec, 0xcb, 0x18, 0x54, - 0xec, 0xea, 0x0e, 0x2c, 0xfb, 0xe4, 0x90, 0x85, 0xfc, 0x2f, 0x2d, 0x83, 0x8b, 0x27, 0x01, 0xce, - 0xff, 0x78, 0xd5, 0x62, 0xfe, 0x17, 0x7b, 0x04, 0x4b, 0x5d, 0xf9, 0x08, 0x96, 0xfe, 0x4e, 0x1e, - 0xc1, 0xf4, 0x5f, 0x25, 0x60, 0x4d, 0x6d, 0xd4, 0xe1, 0xc3, 0x0f, 0x7a, 0x0f, 0xf2, 0x72, 0xcf, - 0x9e, 0xb2, 0x57, 0xf1, 0x16, 0x23, 0x71, 0x8d, 0x1a, 0xce, 0xc9, 0xea, 0x86, 0x85, 0x7e, 0x12, - 0xbb, 0xf1, 0xbd, 0x84, 0x43, 0xce, 0x59, 0xaf, 0x4c, 0xaf, 0x81, 0x2f, 0x7d, 0x0b, 0xda, 0x84, - 0x82, 0x72, 0x40, 0x9c, 0x2d, 0xe4, 0x19, 0x17, 0xa4, 0xa8, 0x49, 0x86, 0x54, 0xbf, 0x0b, 0x69, - 0x71, 0xc2, 0x01, 0xc8, 0x76, 0xbe, 0xe8, 0x74, 0xeb, 0xfb, 0xf2, 0x54, 0xb9, 0xd3, 0x10, 0x0f, - 0x72, 0xcb, 0x90, 0xaa, 0x37, 0x9f, 0x68, 0x49, 0xbd, 0x05, 0x37, 0xb7, 0x1d, 0x62, 0x1e, 0x3b, - 0x76, 0xc0, 0xa8, 0x15, 0x5f, 0x4d, 0x3f, 0x82, 0xec, 0xcc, 0x1e, 0xf9, 0x8a, 0x1b, 0x12, 0x05, - 0xbe, 0xff, 0x0f, 0x29, 0xc8, 0x47, 0xd7, 0x1f, 0x7c, 0x81, 0x71, 0xf2, 0xba, 0x24, 0x2f, 0x41, - 0x23, 0x79, 0x93, 0x9e, 0xa2, 0xb7, 0xa7, 0xb4, 0xf5, 0x73, 0x79, 0x85, 0x1a, 0x55, 0x87, 0x94, - 0xf5, 0x1d, 0xc8, 0x19, 0x9d, 0x4e, 0xe3, 0x51, 0xb3, 0x5e, 0xd3, 0xbe, 0x4a, 0x94, 0xbe, 0x77, - 0x76, 0x5e, 0xbe, 0x16, 0x81, 0x8c, 0x20, 0xb0, 0x07, 0x2e, 0xb5, 0x04, 0xaa, 0x5a, 0xad, 0xb7, - 0xbb, 0xf5, 0x9a, 0xf6, 0x3c, 0x39, 0x8f, 0x12, 0x34, 0x4c, 0x3c, 0x87, 0xe4, 0xdb, 0xb8, 0xde, - 0x36, 0x30, 0x6f, 0xf0, 0xab, 0xa4, 0x64, 0xd3, 0xd3, 0x16, 0x7d, 0x3a, 0x22, 0x3e, 0x6f, 0x73, - 0x23, 0x7c, 0x16, 0x7c, 0x9e, 0x92, 0x57, 0xe6, 0xd3, 0xbb, 0x1c, 0x4a, 0xac, 0x09, 0x6f, 0x4d, - 0xdc, 0x81, 0x09, 0x33, 0xa9, 0xb9, 0xd6, 0x3a, 0x8c, 0xf8, 0x8c, 0x5b, 0xd1, 0x61, 0x19, 0xf7, - 0x9a, 0x4d, 0x0e, 0x7a, 0x9e, 0x9e, 0xeb, 0x1d, 0x1e, 0xbb, 0x2e, 0xc7, 0xdc, 0x85, 0x5c, 0x78, - 0x45, 0xa6, 0x7d, 0x95, 0x9e, 0x73, 0xa8, 0x1a, 0xde, 0xef, 0x89, 0x06, 0x77, 0x7b, 0x5d, 0xf1, - 0x6a, 0xf9, 0x3c, 0x33, 0xdf, 0xe0, 0xd1, 0x98, 0x59, 0xfc, 0x9c, 0x50, 0x8e, 0x88, 0xfb, 0x57, - 0x19, 0x49, 0x85, 0x22, 0x8c, 0x62, 0xed, 0xef, 0x40, 0x0e, 0xd7, 0x7f, 0x26, 0x1f, 0x38, 0x9f, - 0x67, 0xe7, 0xec, 0x60, 0xfa, 0x25, 0x35, 0x19, 0xb5, 0xa6, 0x2f, 0x02, 0x51, 0xd5, 0xfd, 0xdf, - 0x85, 0x5c, 0x98, 0x36, 0xd1, 0x06, 0x64, 0x9f, 0xb6, 0xf0, 0xe3, 0x3a, 0xd6, 0x96, 0xe4, 0xe8, - 0x84, 0x35, 0x4f, 0xe5, 0xbe, 0x53, 0x86, 0xe5, 0x7d, 0xa3, 0x69, 0x3c, 0xaa, 0xe3, 0xf0, 0xb4, - 0x1c, 0x02, 0xd4, 0xda, 0x2f, 0x69, 0xaa, 0x81, 0xc8, 0xe6, 0xf6, 0xed, 0xaf, 0xbf, 0xd9, 0x58, - 0xfa, 0xe5, 0x37, 0x1b, 0x4b, 0xbf, 0xfe, 0x66, 0x23, 0xf1, 0xfc, 0x62, 0x23, 0xf1, 0xf5, 0xc5, - 0x46, 0xe2, 0x17, 0x17, 0x1b, 0x89, 0x7f, 0xbf, 0xd8, 0x48, 0x1c, 0x64, 0x05, 0x2f, 0xfd, 0xf8, - 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xb4, 0x2d, 0x4d, 0x67, 0xa2, 0x23, 0x00, 0x00, + // 3787 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x59, 0x4d, 0x6c, 0x23, 0x47, + 0x76, 0x16, 0x7f, 0x45, 0x3e, 0x52, 0x52, 0x4f, 0xcd, 0xec, 0x58, 0x43, 0x8f, 0x25, 0xba, 0xc7, + 0xb3, 0x1e, 0xcf, 0x3a, 0xb4, 0x2d, 0x7b, 0x8d, 0x59, 0xcf, 0x66, 0xc7, 0xcd, 0x1f, 0x8d, 0xb8, + 0x23, 0x51, 0x44, 0x91, 0x9a, 0x81, 0x11, 0x20, 0x44, 0xa9, 0xbb, 0x44, 0xb5, 0xd5, 0xec, 0x66, + 0xba, 0x8b, 0xd2, 0x30, 0x41, 0x80, 0x41, 0x0e, 0x49, 0xa0, 0x53, 0xee, 0x81, 0xb0, 0x08, 0x12, + 0xe4, 0x90, 0x43, 0xae, 0x01, 0x72, 0x32, 0x72, 0xf2, 0x2d, 0x9b, 0x04, 0x08, 0x16, 0x1b, 0x64, + 0x10, 0x2b, 0xe7, 0x00, 0x7b, 0x09, 0x72, 0x48, 0x0e, 0x41, 0xfd, 0x74, 0xb3, 0xc9, 0xa1, 0x34, + 0xf2, 0xae, 0x2f, 0x64, 0xd7, 0xab, 0xef, 0xbd, 0xfa, 0x7b, 0xf5, 0xea, 0x7b, 0x55, 0x50, 0x60, + 0xe3, 0x21, 0x0d, 0x2a, 0x43, 0xdf, 0x63, 0x1e, 0x42, 0x96, 0x67, 0x1e, 0x51, 0xbf, 0x12, 0x9c, + 0x10, 0x7f, 0x70, 0x64, 0xb3, 0xca, 0xf1, 0x47, 0xa5, 0x5b, 0xcc, 0x1e, 0xd0, 0x80, 0x91, 0xc1, + 0xf0, 0x83, 0xe8, 0x4b, 0xc2, 0x4b, 0x6f, 0x58, 0x23, 0x9f, 0x30, 0xdb, 0x73, 0x3f, 0x08, 0x3f, + 0x54, 0xc5, 0x8d, 0xbe, 0xd7, 0xf7, 0xc4, 0xe7, 0x07, 0xfc, 0x4b, 0x4a, 0xf5, 0x75, 0x58, 0x7c, + 0x4a, 0xfd, 0xc0, 0xf6, 0x5c, 0x74, 0x03, 0x32, 0xb6, 0x6b, 0xd1, 0xe7, 0xab, 0x89, 0x72, 0xe2, + 0x5e, 0x1a, 0xcb, 0x82, 0xfe, 0x17, 0x09, 0x28, 0x18, 0xae, 0xeb, 0x31, 0x61, 0x2b, 0x40, 0x08, + 0xd2, 0x2e, 0x19, 0x50, 0x01, 0xca, 0x63, 0xf1, 0x8d, 0x6a, 0x90, 0x75, 0xc8, 0x3e, 0x75, 0x82, + 0xd5, 0x64, 0x39, 0x75, 0xaf, 0xb0, 0xf1, 0x83, 0xca, 0xab, 0x7d, 0xae, 0xc4, 0x8c, 0x54, 0xb6, + 0x05, 0xba, 0xe1, 0x32, 0x7f, 0x8c, 0x95, 0x6a, 0xe9, 0x47, 0x50, 0x88, 0x89, 0x91, 0x06, 0xa9, + 0x23, 0x3a, 0x56, 0xcd, 0xf0, 0x4f, 0xde, 0xbf, 0x63, 0xe2, 0x8c, 0xe8, 0x6a, 0x52, 0xc8, 0x64, + 0xe1, 0xb3, 0xe4, 0x83, 0x84, 0xfe, 0x05, 0xe4, 0x31, 0x0d, 0xbc, 0x91, 0x6f, 0xd2, 0x00, 0xbd, + 0x07, 0x79, 0x97, 0xb8, 0x5e, 0xcf, 0x1c, 0x8e, 0x02, 0xa1, 0x9e, 0xaa, 0x16, 0xcf, 0x5f, 0xae, + 0xe7, 0x5a, 0xc4, 0xf5, 0x6a, 0xed, 0xbd, 0x00, 0xe7, 0x78, 0x75, 0x6d, 0x38, 0x0a, 0xd0, 0xdb, + 0x50, 0x1c, 0xd0, 0x81, 0xe7, 0x8f, 0x7b, 0xfb, 0x63, 0x46, 0x03, 0x61, 0x38, 0x85, 0x0b, 0x52, + 0x56, 0xe5, 0x22, 0xfd, 0xcf, 0x12, 0x70, 0x23, 0xb4, 0x8d, 0xe9, 0xef, 0x8d, 0x6c, 0x9f, 0x0e, + 0xa8, 0xcb, 0x02, 0xf4, 0x43, 0xc8, 0x3a, 0xf6, 0xc0, 0x66, 0xb2, 0x8d, 0xc2, 0xc6, 0x5b, 0xf3, + 0xc6, 0x1c, 0xf5, 0x0a, 0x2b, 0x30, 0x32, 0xa0, 0xe8, 0xd3, 0x80, 0xfa, 0xc7, 0x72, 0x26, 0x44, + 0x93, 0xaf, 0x55, 0x9e, 0x52, 0xd1, 0x37, 0x21, 0xd7, 0x76, 0x08, 0x3b, 0xf0, 0xfc, 0x01, 0xd2, + 0xa1, 0x48, 0x7c, 0xf3, 0xd0, 0x66, 0xd4, 0x64, 0x23, 0x3f, 0x5c, 0x95, 0x29, 0x19, 0xba, 0x09, + 0x49, 0x4f, 0x36, 0x94, 0xaf, 0x66, 0xcf, 0x5f, 0xae, 0x27, 0x77, 0x3b, 0x38, 0xe9, 0x05, 0xfa, + 0x43, 0xb8, 0xd6, 0x76, 0x46, 0x7d, 0xdb, 0xad, 0xd3, 0xc0, 0xf4, 0xed, 0x21, 0xb7, 0xce, 0x97, + 0x97, 0x3b, 0x5f, 0xb8, 0xbc, 0xfc, 0x3b, 0x5a, 0xf2, 0xe4, 0x64, 0xc9, 0xf5, 0x3f, 0x49, 0xc2, + 0xb5, 0x86, 0xdb, 0xb7, 0x5d, 0x1a, 0xd7, 0xbe, 0x0b, 0xcb, 0x54, 0x08, 0x7b, 0xc7, 0xd2, 0xa9, + 0x94, 0x9d, 0x25, 0x29, 0x0d, 0x3d, 0xad, 0x39, 0xe3, 0x2f, 0x1f, 0xcd, 0x1b, 0xfe, 0x2b, 0xd6, + 0xe7, 0x79, 0x0d, 0x6a, 0xc0, 0xe2, 0x50, 0x0c, 0x22, 0x58, 0x4d, 0x09, 0x5b, 0x77, 0xe7, 0xd9, + 0x7a, 0x65, 0x9c, 0xd5, 0xf4, 0xd7, 0x2f, 0xd7, 0x17, 0x70, 0xa8, 0xfb, 0x9b, 0x38, 0xdf, 0x7f, + 0x26, 0x60, 0xa5, 0xe5, 0x59, 0x53, 0xf3, 0x50, 0x82, 0xdc, 0xa1, 0x17, 0xb0, 0xd8, 0x46, 0x89, + 0xca, 0xe8, 0x01, 0xe4, 0x86, 0x6a, 0xf9, 0xd4, 0xea, 0xdf, 0x9e, 0xdf, 0x65, 0x89, 0xc1, 0x11, + 0x1a, 0x3d, 0x84, 0xbc, 0x1f, 0xfa, 0xc4, 0x6a, 0xea, 0x2a, 0x8e, 0x33, 0xc1, 0xa3, 0xdf, 0x86, + 0xac, 0x5c, 0x84, 0xd5, 0xb4, 0xd0, 0xbc, 0x7b, 0xa5, 0x39, 0xc7, 0x4a, 0x49, 0xff, 0x45, 0x02, + 0x34, 0x4c, 0x0e, 0xd8, 0x0e, 0x1d, 0xec, 0x53, 0xbf, 0xc3, 0x08, 0x1b, 0x05, 0xe8, 0x26, 0x64, + 0x1d, 0x4a, 0x2c, 0xea, 0x8b, 0x41, 0xe6, 0xb0, 0x2a, 0xa1, 0x3d, 0xee, 0xe4, 0xc4, 0x3c, 0x24, + 0xfb, 0xb6, 0x63, 0xb3, 0xb1, 0x18, 0xe6, 0xf2, 0xfc, 0x55, 0x9e, 0xb5, 0x59, 0xc1, 0x31, 0x45, + 0x3c, 0x65, 0x06, 0xad, 0xc2, 0xe2, 0x80, 0x06, 0x01, 0xe9, 0x53, 0x31, 0xfa, 0x3c, 0x0e, 0x8b, + 0xfa, 0x43, 0x28, 0xc6, 0xf5, 0x50, 0x01, 0x16, 0xf7, 0x5a, 0x4f, 0x5a, 0xbb, 0xcf, 0x5a, 0xda, + 0x02, 0x5a, 0x81, 0xc2, 0x5e, 0x0b, 0x37, 0x8c, 0xda, 0x96, 0x51, 0xdd, 0x6e, 0x68, 0x09, 0xb4, + 0x04, 0xf9, 0x49, 0x31, 0xa9, 0xff, 0x2c, 0x01, 0xc0, 0x17, 0x50, 0x0d, 0xea, 0x33, 0xc8, 0x04, + 0x8c, 0x30, 0xb9, 0x70, 0xcb, 0x1b, 0xef, 0xcc, 0xeb, 0xf5, 0x04, 0x5e, 0xe1, 0x7f, 0x14, 0x4b, + 0x95, 0x78, 0x0f, 0x93, 0xb3, 0x3d, 0xcc, 0x08, 0xe4, 0x74, 0xd7, 0x72, 0x90, 0xae, 0xf3, 0xaf, + 0x04, 0xca, 0x43, 0x06, 0x37, 0x8c, 0xfa, 0x17, 0x5a, 0x12, 0x69, 0x50, 0xac, 0x37, 0x3b, 0xb5, + 0xdd, 0x56, 0xab, 0x51, 0xeb, 0x36, 0xea, 0x5a, 0x4a, 0xbf, 0x0b, 0x99, 0xe6, 0x80, 0xf4, 0x29, + 0xba, 0xcd, 0x3d, 0xe0, 0x80, 0xfa, 0xd4, 0x35, 0x43, 0xc7, 0x9a, 0x08, 0xf4, 0x9f, 0xe7, 0x21, + 0xb3, 0xe3, 0x8d, 0x5c, 0x86, 0x36, 0x62, 0xbb, 0x78, 0x79, 0x63, 0x6d, 0xde, 0x10, 0x04, 0xb0, + 0xd2, 0x1d, 0x0f, 0xa9, 0xda, 0xe5, 0x37, 0x21, 0x2b, 0x7d, 0x45, 0x75, 0x5d, 0x95, 0xb8, 0x9c, + 0x11, 0xbf, 0x4f, 0x99, 0x9a, 0x74, 0x55, 0x42, 0xf7, 0x20, 0xe7, 0x53, 0x62, 0x79, 0xae, 0x33, + 0x16, 0x2e, 0x95, 0x93, 0x61, 0x16, 0x53, 0x62, 0xed, 0xba, 0xce, 0x18, 0x47, 0xb5, 0x68, 0x0b, + 0x8a, 0xfb, 0xb6, 0x6b, 0xf5, 0xbc, 0xa1, 0x8c, 0x79, 0x99, 0x8b, 0x1d, 0x50, 0xf6, 0xaa, 0x6a, + 0xbb, 0xd6, 0xae, 0x04, 0xe3, 0xc2, 0xfe, 0xa4, 0x80, 0x5a, 0xb0, 0x7c, 0xec, 0x39, 0xa3, 0x01, + 0x8d, 0x6c, 0x65, 0x85, 0xad, 0x77, 0x2f, 0xb6, 0xf5, 0x54, 0xe0, 0x43, 0x6b, 0x4b, 0xc7, 0xf1, + 0x22, 0x7a, 0x02, 0x4b, 0x6c, 0x30, 0x3c, 0x08, 0x22, 0x73, 0x8b, 0xc2, 0xdc, 0xf7, 0x2f, 0x99, + 0x30, 0x0e, 0x0f, 0xad, 0x15, 0x59, 0xac, 0x54, 0xfa, 0xa3, 0x14, 0x14, 0x62, 0x3d, 0x47, 0x1d, + 0x28, 0x0c, 0x7d, 0x6f, 0x48, 0xfa, 0x22, 0x6e, 0xab, 0xb5, 0xf8, 0xe8, 0x4a, 0xa3, 0xae, 0xb4, + 0x27, 0x8a, 0x38, 0x6e, 0x45, 0x3f, 0x4b, 0x42, 0x21, 0x56, 0x89, 0xee, 0x43, 0x0e, 0xb7, 0x71, + 0xf3, 0xa9, 0xd1, 0x6d, 0x68, 0x0b, 0xa5, 0xdb, 0xa7, 0x67, 0xe5, 0x55, 0x61, 0x2d, 0x6e, 0xa0, + 0xed, 0xdb, 0xc7, 0xdc, 0xf5, 0xee, 0xc1, 0x62, 0x08, 0x4d, 0x94, 0xde, 0x3c, 0x3d, 0x2b, 0xbf, + 0x31, 0x0b, 0x8d, 0x21, 0x71, 0x67, 0xcb, 0xc0, 0x8d, 0xba, 0x96, 0x9c, 0x8f, 0xc4, 0x9d, 0x43, + 0xe2, 0x53, 0x0b, 0x7d, 0x1f, 0xb2, 0x0a, 0x98, 0x2a, 0x95, 0x4e, 0xcf, 0xca, 0x37, 0x67, 0x81, + 0x13, 0x1c, 0xee, 0x6c, 0x1b, 0x4f, 0x1b, 0x5a, 0x7a, 0x3e, 0x0e, 0x77, 0x1c, 0x72, 0x4c, 0xd1, + 0x3b, 0x90, 0x91, 0xb0, 0x4c, 0xe9, 0xd6, 0xe9, 0x59, 0xf9, 0x7b, 0xaf, 0x98, 0xe3, 0xa8, 0xd2, + 0xea, 0x9f, 0xfe, 0xe5, 0xda, 0xc2, 0xdf, 0xff, 0xd5, 0x9a, 0x36, 0x5b, 0x5d, 0xfa, 0xbf, 0x04, + 0x2c, 0x4d, 0x2d, 0x39, 0xd2, 0x21, 0xeb, 0x7a, 0xa6, 0x37, 0x94, 0xe1, 0x3c, 0x57, 0x85, 0xf3, + 0x97, 0xeb, 0xd9, 0x96, 0x57, 0xf3, 0x86, 0x63, 0xac, 0x6a, 0xd0, 0x93, 0x99, 0x03, 0xe9, 0xe3, + 0x2b, 0xfa, 0xd3, 0xdc, 0x23, 0xe9, 0x11, 0x2c, 0x59, 0xbe, 0x7d, 0x4c, 0xfd, 0x9e, 0xe9, 0xb9, + 0x07, 0x76, 0x5f, 0x85, 0xea, 0xd2, 0x3c, 0x9b, 0x75, 0x01, 0xc4, 0x45, 0xa9, 0x50, 0x13, 0xf8, + 0xdf, 0xe0, 0x30, 0x2a, 0x3d, 0x85, 0x62, 0xdc, 0x43, 0xd1, 0x5b, 0x00, 0x81, 0xfd, 0xfb, 0x54, + 0xf1, 0x1b, 0xc1, 0x86, 0x70, 0x9e, 0x4b, 0x04, 0xbb, 0x41, 0xef, 0x42, 0x7a, 0xe0, 0x59, 0xd2, + 0x4e, 0xa6, 0x7a, 0x9d, 0x9f, 0x89, 0xbf, 0x7c, 0xb9, 0x5e, 0xf0, 0x82, 0xca, 0xa6, 0xed, 0xd0, + 0x1d, 0xcf, 0xa2, 0x58, 0x00, 0xf4, 0x63, 0x48, 0xf3, 0x50, 0x81, 0xde, 0x84, 0x74, 0xb5, 0xd9, + 0xaa, 0x6b, 0x0b, 0xa5, 0x6b, 0xa7, 0x67, 0xe5, 0x25, 0x31, 0x25, 0xbc, 0x82, 0xfb, 0x2e, 0x5a, + 0x87, 0xec, 0xd3, 0xdd, 0xed, 0xbd, 0x1d, 0xee, 0x5e, 0xd7, 0x4f, 0xcf, 0xca, 0x2b, 0x51, 0xb5, + 0x9c, 0x34, 0xf4, 0x16, 0x64, 0xba, 0x3b, 0xed, 0xcd, 0x8e, 0x96, 0x2c, 0xa1, 0xd3, 0xb3, 0xf2, + 0x72, 0x54, 0x2f, 0xfa, 0x5c, 0xba, 0xa6, 0x56, 0x35, 0x1f, 0xc9, 0xf5, 0xff, 0x4d, 0xc2, 0x12, + 0xe6, 0xfc, 0xd6, 0x67, 0x6d, 0xcf, 0xb1, 0xcd, 0x31, 0x6a, 0x43, 0xde, 0xf4, 0x5c, 0xcb, 0x8e, + 0xed, 0xa9, 0x8d, 0x0b, 0x0e, 0xc1, 0x89, 0x56, 0x58, 0xaa, 0x85, 0x9a, 0x78, 0x62, 0x04, 0x6d, + 0x40, 0xc6, 0xa2, 0x0e, 0x19, 0x5f, 0x76, 0x1a, 0xd7, 0x15, 0x97, 0xc6, 0x12, 0x2a, 0x98, 0x23, + 0x79, 0xde, 0x23, 0x8c, 0xd1, 0xc1, 0x90, 0xc9, 0xd3, 0x38, 0x8d, 0x0b, 0x03, 0xf2, 0xdc, 0x50, + 0x22, 0xf4, 0x09, 0x64, 0x4f, 0x6c, 0xd7, 0xf2, 0x4e, 0xd4, 0x81, 0x7b, 0xb9, 0x5d, 0x85, 0xd5, + 0x4f, 0xf9, 0x39, 0x3b, 0xd3, 0x59, 0x3e, 0xeb, 0xad, 0xdd, 0x56, 0x23, 0x9c, 0x75, 0x55, 0xbf, + 0xeb, 0xb6, 0x3c, 0x97, 0xef, 0x18, 0xd8, 0x6d, 0xf5, 0x36, 0x8d, 0xe6, 0xf6, 0x1e, 0xe6, 0x33, + 0x7f, 0xe3, 0xf4, 0xac, 0xac, 0x45, 0x90, 0x4d, 0x62, 0x3b, 0x9c, 0x04, 0xde, 0x82, 0x94, 0xd1, + 0xfa, 0x42, 0x4b, 0x96, 0xb4, 0xd3, 0xb3, 0x72, 0x31, 0xaa, 0x36, 0xdc, 0xf1, 0x64, 0x33, 0xcd, + 0xb6, 0xab, 0xff, 0x7b, 0x12, 0x8a, 0x7b, 0x43, 0x8b, 0x30, 0x2a, 0x3d, 0x13, 0x95, 0xa1, 0x30, + 0x24, 0x3e, 0x71, 0x1c, 0xea, 0xd8, 0xc1, 0x40, 0x25, 0x0a, 0x71, 0x11, 0x7a, 0xf0, 0x2d, 0x26, + 0x53, 0x91, 0x30, 0x35, 0xa5, 0x7b, 0xb0, 0x7c, 0x20, 0x3b, 0xdb, 0x23, 0xa6, 0x58, 0xdd, 0x94, + 0x58, 0xdd, 0xca, 0x3c, 0x13, 0xf1, 0x5e, 0x55, 0xd4, 0x18, 0x0d, 0xa1, 0x85, 0x97, 0x0e, 0xe2, + 0x45, 0xf4, 0x29, 0x2c, 0x0e, 0x3c, 0xd7, 0x66, 0x9e, 0x7f, 0xa5, 0x75, 0x08, 0xc1, 0xe8, 0x3e, + 0x5c, 0xe3, 0x2b, 0x1c, 0x76, 0x49, 0x54, 0x8b, 0x93, 0x2b, 0x89, 0x57, 0x06, 0xe4, 0xb9, 0x6a, + 0x13, 0x73, 0xb1, 0xfe, 0x29, 0x2c, 0x4d, 0xf5, 0x81, 0x9f, 0xe6, 0x6d, 0x63, 0xaf, 0xd3, 0xd0, + 0x16, 0x50, 0x11, 0x72, 0xb5, 0xdd, 0x56, 0xb7, 0xd9, 0xda, 0xe3, 0xd4, 0xa3, 0x08, 0x39, 0xbc, + 0xbb, 0xbd, 0x5d, 0x35, 0x6a, 0x4f, 0xb4, 0xa4, 0xfe, 0xdf, 0xd1, 0xfc, 0x2a, 0xee, 0x51, 0x9d, + 0xe6, 0x1e, 0xef, 0x5f, 0x3c, 0x74, 0xc5, 0x3e, 0x26, 0x85, 0x88, 0x83, 0xfc, 0x18, 0x40, 0x2c, + 0x23, 0xb5, 0x7a, 0x84, 0x5d, 0x96, 0x5f, 0x74, 0xc3, 0xcc, 0x11, 0xe7, 0x95, 0x82, 0xc1, 0xd0, + 0xe7, 0x50, 0x34, 0xbd, 0xc1, 0xd0, 0xa1, 0x4a, 0x3f, 0x75, 0x15, 0xfd, 0x42, 0xa4, 0x62, 0xb0, + 0x38, 0x07, 0x4a, 0x4f, 0x73, 0xa0, 0x3f, 0x4e, 0x40, 0x21, 0xd6, 0xe1, 0x69, 0x2a, 0x54, 0x84, + 0xdc, 0x5e, 0xbb, 0x6e, 0x74, 0x9b, 0xad, 0xc7, 0x5a, 0x02, 0x01, 0x64, 0xc5, 0x04, 0xd6, 0xb5, + 0x24, 0xa7, 0x6b, 0xb5, 0xdd, 0x9d, 0xf6, 0x76, 0x43, 0x90, 0x21, 0x74, 0x03, 0xb4, 0x70, 0x0a, + 0x7b, 0x9d, 0xae, 0x81, 0xb9, 0x34, 0x8d, 0xae, 0xc3, 0x4a, 0x24, 0x55, 0x9a, 0x19, 0x74, 0x13, + 0x50, 0x24, 0x9c, 0x98, 0xc8, 0xea, 0x7f, 0x08, 0x2b, 0x35, 0xcf, 0x65, 0xc4, 0x76, 0x23, 0x2a, + 0xbb, 0xc1, 0xc7, 0xad, 0x44, 0x3d, 0xdb, 0x92, 0xd1, 0xb6, 0xba, 0x72, 0xfe, 0x72, 0xbd, 0x10, + 0x41, 0x9b, 0x75, 0x3e, 0xd2, 0xb0, 0x60, 0xf1, 0x3d, 0x35, 0xb4, 0x2d, 0x15, 0x3c, 0x17, 0xcf, + 0x5f, 0xae, 0xa7, 0xda, 0xcd, 0x3a, 0xe6, 0x32, 0xf4, 0x26, 0xe4, 0xe9, 0x73, 0x9b, 0xf5, 0x4c, + 0x1e, 0x5d, 0xf9, 0x1c, 0x66, 0x70, 0x8e, 0x0b, 0x6a, 0x3c, 0x98, 0x56, 0x01, 0xda, 0x9e, 0xcf, + 0x54, 0xcb, 0x9f, 0x40, 0x66, 0xe8, 0xf9, 0x22, 0x8f, 0xe4, 0x47, 0xcf, 0x5c, 0xb2, 0xc6, 0xe1, + 0xd2, 0xd9, 0xb1, 0x04, 0xeb, 0xff, 0x90, 0x04, 0xe8, 0x92, 0xe0, 0x48, 0x19, 0x79, 0x08, 0xf9, + 0xe8, 0x22, 0xe0, 0xb2, 0x84, 0x34, 0xb6, 0xe6, 0x11, 0x1e, 0x7d, 0x1c, 0x7a, 0x9d, 0xe4, 0xe9, + 0xf3, 0x15, 0x55, 0x5b, 0xf3, 0xa8, 0xee, 0x34, 0x19, 0xe7, 0xe7, 0x15, 0xf5, 0x7d, 0xb5, 0xf8, + 0xfc, 0x13, 0xd5, 0x44, 0xcc, 0x96, 0xf3, 0xa6, 0xd8, 0xdf, 0x9d, 0x79, 0x8d, 0xcc, 0x2c, 0xca, + 0xd6, 0x02, 0x9e, 0xe8, 0xa1, 0x47, 0x50, 0xe0, 0x43, 0xef, 0x05, 0xa2, 0x4e, 0x11, 0xbf, 0x0b, + 0x67, 0x4b, 0x5a, 0xc0, 0x30, 0x8c, 0xbe, 0xab, 0x1a, 0x2c, 0xfb, 0x23, 0x97, 0x0f, 0x5b, 0xd9, + 0xd0, 0x6d, 0x78, 0xa3, 0x45, 0xd9, 0x89, 0xe7, 0x1f, 0x19, 0x8c, 0x11, 0xf3, 0x90, 0x67, 0xf6, + 0x2a, 0xd2, 0x4d, 0x58, 0x6f, 0x62, 0x8a, 0xf5, 0xae, 0xc2, 0x22, 0x71, 0x6c, 0x12, 0x50, 0x49, + 0x15, 0xf2, 0x38, 0x2c, 0x72, 0x6e, 0x4e, 0x2c, 0xcb, 0xa7, 0x41, 0x40, 0x65, 0x2e, 0x9a, 0xc7, + 0x13, 0x81, 0xfe, 0x2f, 0x49, 0x80, 0x66, 0xdb, 0xd8, 0x51, 0xe6, 0xeb, 0x90, 0x3d, 0x20, 0x03, + 0xdb, 0x19, 0x5f, 0xb6, 0xd3, 0x27, 0xf8, 0x8a, 0x21, 0x0d, 0x6d, 0x0a, 0x1d, 0xac, 0x74, 0x05, + 0x65, 0x1f, 0xed, 0xbb, 0x94, 0x45, 0x94, 0x5d, 0x94, 0x38, 0x3f, 0xf0, 0x89, 0x1b, 0xad, 0x8c, + 0x2c, 0xf0, 0xae, 0xf7, 0x09, 0xa3, 0x27, 0x64, 0x1c, 0x6e, 0x4c, 0x55, 0x44, 0x5b, 0x9c, 0xca, + 0x07, 0xd4, 0x3f, 0xa6, 0xd6, 0x6a, 0x46, 0x78, 0xe1, 0xeb, 0xfa, 0x83, 0x15, 0x5c, 0x32, 0x9f, + 0x48, 0xbb, 0xf4, 0x50, 0x1c, 0xd7, 0x93, 0xaa, 0x6f, 0x95, 0x49, 0x7f, 0x08, 0x4b, 0x53, 0xe3, + 0x7c, 0x25, 0x57, 0x6a, 0xb6, 0x9f, 0x7e, 0xa2, 0xa5, 0xd5, 0xd7, 0xa7, 0x5a, 0x56, 0xff, 0x9b, + 0x94, 0xdc, 0x4a, 0x6a, 0x56, 0xe7, 0xdf, 0x4d, 0xe5, 0xc4, 0x4d, 0x97, 0xe9, 0x39, 0xca, 0xbf, + 0xdf, 0xbd, 0x7c, 0x87, 0x71, 0xee, 0x2d, 0xe0, 0x38, 0x52, 0x44, 0xeb, 0x50, 0x90, 0xeb, 0xdf, + 0xe3, 0xfe, 0x24, 0xa6, 0x75, 0x09, 0x83, 0x14, 0x71, 0x4d, 0x74, 0x17, 0x96, 0x87, 0xa3, 0x7d, + 0xc7, 0x0e, 0x0e, 0xa9, 0x25, 0x31, 0x69, 0x81, 0x59, 0x8a, 0xa4, 0x02, 0xb6, 0x03, 0x45, 0x25, + 0xe8, 0x09, 0xde, 0x95, 0x11, 0x1d, 0xba, 0xff, 0xba, 0x0e, 0x49, 0x15, 0x41, 0xc7, 0x0a, 0xc3, + 0x49, 0x41, 0xaf, 0x43, 0x2e, 0xec, 0x2c, 0x5a, 0x85, 0x54, 0xb7, 0xd6, 0xd6, 0x16, 0x4a, 0x2b, + 0xa7, 0x67, 0xe5, 0x42, 0x28, 0xee, 0xd6, 0xda, 0xbc, 0x66, 0xaf, 0xde, 0xd6, 0x12, 0xd3, 0x35, + 0x7b, 0xf5, 0x76, 0x29, 0xcd, 0x4f, 0x7e, 0xfd, 0x00, 0x0a, 0xb1, 0x16, 0xd0, 0x1d, 0x58, 0x6c, + 0xb6, 0x1e, 0xe3, 0x46, 0xa7, 0xa3, 0x2d, 0x94, 0x6e, 0x9e, 0x9e, 0x95, 0x51, 0xac, 0xb6, 0xe9, + 0xf6, 0xf9, 0xfa, 0xa0, 0xb7, 0x20, 0xbd, 0xb5, 0xdb, 0xe9, 0x86, 0x44, 0x2f, 0x86, 0xd8, 0xf2, + 0x02, 0x56, 0xba, 0xae, 0x28, 0x45, 0xdc, 0xb0, 0xfe, 0xe7, 0x09, 0xc8, 0x4a, 0xbe, 0x3b, 0x77, + 0xa1, 0x0c, 0x58, 0x0c, 0xb3, 0x30, 0x49, 0xc2, 0xdf, 0xbd, 0x98, 0x30, 0x57, 0x14, 0xbf, 0x95, + 0xee, 0x17, 0xea, 0x95, 0x3e, 0x83, 0x62, 0xbc, 0xe2, 0x5b, 0x39, 0xdf, 0x1f, 0x40, 0x81, 0xfb, + 0x77, 0x48, 0x9c, 0x37, 0x20, 0x2b, 0x39, 0xb9, 0x8a, 0xa6, 0x97, 0xb1, 0x77, 0x85, 0x44, 0x0f, + 0x60, 0x51, 0x32, 0xfe, 0xf0, 0x2e, 0x6a, 0xed, 0xf2, 0x5d, 0x84, 0x43, 0xb8, 0xfe, 0x08, 0xd2, + 0x6d, 0x4a, 0x7d, 0x3e, 0xf7, 0xae, 0x67, 0xd1, 0xc9, 0x01, 0xa4, 0x92, 0x15, 0x8b, 0x36, 0xeb, + 0x3c, 0x59, 0xb1, 0x68, 0xd3, 0xe2, 0x93, 0xc7, 0xe3, 0x4a, 0x78, 0x1d, 0xc7, 0xbf, 0xf5, 0x2e, + 0x14, 0x9f, 0x51, 0xbb, 0x7f, 0xc8, 0xa8, 0x25, 0x0c, 0xbd, 0x0f, 0xe9, 0x21, 0x8d, 0x3a, 0xbf, + 0x3a, 0xd7, 0xc1, 0x28, 0xf5, 0xb1, 0x40, 0xf1, 0x38, 0x72, 0x22, 0xb4, 0xd5, 0x0d, 0xa8, 0x2a, + 0xe9, 0xff, 0x9c, 0x84, 0xe5, 0x66, 0x10, 0x8c, 0x88, 0x6b, 0x86, 0x0c, 0xe5, 0x27, 0xd3, 0x0c, + 0xe5, 0xde, 0xdc, 0x11, 0x4e, 0xa9, 0x4c, 0xdf, 0x90, 0xa8, 0xc3, 0x21, 0x19, 0x1d, 0x0e, 0xfa, + 0x7f, 0x25, 0xc2, 0xab, 0x91, 0xbb, 0xb1, 0xed, 0x5e, 0x5a, 0x3d, 0x3d, 0x2b, 0xdf, 0x88, 0x5b, + 0xa2, 0x7b, 0xee, 0x91, 0xeb, 0x9d, 0xb8, 0xe8, 0x6d, 0xc8, 0xe0, 0x46, 0xab, 0xf1, 0x4c, 0x4b, + 0x48, 0xf7, 0x9c, 0x02, 0x61, 0xea, 0xd2, 0x13, 0x6e, 0xa9, 0xdd, 0x68, 0xd5, 0x39, 0x97, 0x48, + 0xce, 0xb1, 0xd4, 0xa6, 0xae, 0x65, 0xbb, 0x7d, 0x74, 0x07, 0xb2, 0xcd, 0x4e, 0x67, 0x4f, 0x24, + 0xaf, 0x6f, 0x9c, 0x9e, 0x95, 0xaf, 0x4f, 0xa1, 0x78, 0x81, 0x5a, 0x1c, 0xc4, 0xc9, 0x35, 0x67, + 0x19, 0x73, 0x40, 0x9c, 0xf7, 0x49, 0x10, 0xde, 0xed, 0xf2, 0xcc, 0x3a, 0x33, 0x07, 0x84, 0x3d, + 0xfe, 0xab, 0xb6, 0xdb, 0xbf, 0x25, 0x41, 0x33, 0x4c, 0x93, 0x0e, 0x19, 0xaf, 0x57, 0x59, 0x4d, + 0x17, 0x72, 0x43, 0xfe, 0x65, 0xd3, 0x90, 0x07, 0x3c, 0x98, 0x7b, 0x87, 0x3e, 0xa3, 0x57, 0xc1, + 0x9e, 0x43, 0x0d, 0x6b, 0x60, 0x07, 0x01, 0xcf, 0xde, 0x85, 0x0c, 0x47, 0x96, 0x4a, 0xbf, 0x4a, + 0xc0, 0xf5, 0x39, 0x08, 0xf4, 0x21, 0xa4, 0x7d, 0xcf, 0x09, 0xd7, 0xf0, 0xf6, 0x45, 0x37, 0x5c, + 0x5c, 0x15, 0x0b, 0x24, 0x5a, 0x03, 0x20, 0x23, 0xe6, 0x11, 0xd1, 0xbe, 0x58, 0xbd, 0x1c, 0x8e, + 0x49, 0xd0, 0x33, 0xc8, 0x06, 0xd4, 0xf4, 0x69, 0x48, 0x18, 0x1f, 0xfd, 0xba, 0xbd, 0xaf, 0x74, + 0x84, 0x19, 0xac, 0xcc, 0x95, 0x2a, 0x90, 0x95, 0x12, 0xee, 0xf6, 0x16, 0x61, 0x44, 0x74, 0xba, + 0x88, 0xc5, 0x37, 0xf7, 0x26, 0xe2, 0xf4, 0x43, 0x6f, 0x22, 0x4e, 0x5f, 0xff, 0x59, 0x12, 0xa0, + 0xf1, 0x9c, 0x51, 0xdf, 0x25, 0x4e, 0xcd, 0x40, 0x8d, 0x58, 0xf4, 0x97, 0xa3, 0x7d, 0x6f, 0xee, + 0xbd, 0x67, 0xa4, 0x51, 0xa9, 0x19, 0x73, 0xe2, 0xff, 0x2d, 0x48, 0x8d, 0x7c, 0x47, 0xdd, 0xa1, + 0x0b, 0xa6, 0xb7, 0x87, 0xb7, 0x31, 0x97, 0xa1, 0xc6, 0x24, 0x6c, 0xa5, 0x2e, 0x7e, 0xfc, 0x88, + 0x35, 0xf0, 0xdd, 0x87, 0xae, 0xf7, 0x01, 0x26, 0xbd, 0x46, 0x6b, 0x90, 0xa9, 0x6d, 0x76, 0x3a, + 0xdb, 0xda, 0x82, 0x8c, 0xcd, 0x93, 0x2a, 0x21, 0xd6, 0xff, 0x3a, 0x01, 0xb9, 0x9a, 0xa1, 0x4e, + 0xcc, 0x4d, 0xd0, 0x44, 0xc0, 0x31, 0xa9, 0xcf, 0x7a, 0xf4, 0xf9, 0xd0, 0xf6, 0xc7, 0x2a, 0x66, + 0x5c, 0x9e, 0x26, 0x2d, 0x73, 0xad, 0x1a, 0xf5, 0x59, 0x43, 0xe8, 0x20, 0x0c, 0x45, 0xaa, 0x86, + 0xd8, 0x33, 0x49, 0x18, 0xc1, 0xd7, 0x2e, 0x9f, 0x0a, 0x49, 0xaf, 0x27, 0xe5, 0x00, 0x17, 0x42, + 0x23, 0x35, 0x12, 0xe8, 0x4f, 0xe1, 0xfa, 0xae, 0x6f, 0x1e, 0xd2, 0x80, 0xc9, 0x46, 0x55, 0x97, + 0x1f, 0xc1, 0x6d, 0x46, 0x82, 0xa3, 0xde, 0xa1, 0x1d, 0x30, 0xcf, 0x1f, 0xf7, 0x7c, 0xca, 0xa8, + 0xcb, 0xeb, 0x7b, 0xe2, 0x89, 0x45, 0x5d, 0x72, 0xdc, 0xe2, 0x98, 0x2d, 0x09, 0xc1, 0x21, 0x62, + 0x9b, 0x03, 0xf4, 0x26, 0x14, 0x39, 0x9b, 0xad, 0xd3, 0x03, 0x32, 0x72, 0x58, 0x80, 0x7e, 0x04, + 0xe0, 0x78, 0xfd, 0xde, 0x95, 0xc3, 0x7d, 0xde, 0xf1, 0xfa, 0xf2, 0x53, 0xff, 0x1d, 0xd0, 0xea, + 0x76, 0x30, 0x24, 0xcc, 0x3c, 0x0c, 0x6f, 0x6f, 0xd0, 0x63, 0xd0, 0x0e, 0x29, 0xf1, 0xd9, 0x3e, + 0x25, 0xac, 0x37, 0xa4, 0xbe, 0xed, 0x59, 0x57, 0x9a, 0xd2, 0x95, 0x48, 0xab, 0x2d, 0x94, 0xf4, + 0xff, 0x49, 0x00, 0x60, 0x72, 0x10, 0x92, 0x9b, 0x1f, 0xc0, 0xb5, 0xc0, 0x25, 0xc3, 0xe0, 0xd0, + 0x63, 0x3d, 0xdb, 0x65, 0xd4, 0x3f, 0x26, 0x8e, 0xca, 0xc0, 0xb5, 0xb0, 0xa2, 0xa9, 0xe4, 0xe8, + 0x7d, 0x40, 0x47, 0x94, 0x0e, 0x7b, 0x9e, 0x63, 0xf5, 0xc2, 0x4a, 0xf9, 0x06, 0x94, 0xc6, 0x1a, + 0xaf, 0xd9, 0x75, 0xac, 0x4e, 0x28, 0x47, 0x55, 0x58, 0xe3, 0x33, 0x40, 0x5d, 0xe6, 0xdb, 0x34, + 0xe8, 0x1d, 0x78, 0x7e, 0x2f, 0x70, 0xbc, 0x93, 0xde, 0x81, 0xe7, 0x38, 0xde, 0x09, 0xf5, 0xc3, + 0xfb, 0x8d, 0x92, 0xe3, 0xf5, 0x1b, 0x12, 0xb4, 0xe9, 0xf9, 0x1d, 0xc7, 0x3b, 0xd9, 0x0c, 0x11, + 0x9c, 0x01, 0x4d, 0x86, 0xcd, 0x6c, 0xf3, 0x28, 0x64, 0x40, 0x91, 0xb4, 0x6b, 0x9b, 0x47, 0xe8, + 0x0e, 0x2c, 0x51, 0x87, 0x8a, 0x2c, 0x59, 0xa2, 0x32, 0x02, 0x55, 0x0c, 0x85, 0x1c, 0xa4, 0xff, + 0x16, 0xe4, 0xdb, 0x0e, 0x31, 0xc5, 0x4b, 0x1b, 0x2a, 0x03, 0x4f, 0xba, 0xb8, 0x13, 0xd8, 0xae, + 0xca, 0x92, 0xf2, 0x38, 0x2e, 0xd2, 0x7f, 0x02, 0xf0, 0x53, 0xcf, 0x76, 0xbb, 0xde, 0x11, 0x75, + 0xc5, 0xa3, 0x04, 0x67, 0xf4, 0x6a, 0x29, 0xf3, 0x58, 0x95, 0x44, 0xc2, 0x42, 0x5c, 0xd2, 0xa7, + 0x7e, 0x74, 0x37, 0x2f, 0x8b, 0xfa, 0xd7, 0x09, 0xc8, 0x62, 0xcf, 0x63, 0x35, 0x03, 0x95, 0x21, + 0x6b, 0x92, 0x5e, 0xb8, 0xf3, 0x8a, 0xd5, 0xfc, 0xf9, 0xcb, 0xf5, 0x4c, 0xcd, 0x78, 0x42, 0xc7, + 0x38, 0x63, 0x92, 0x27, 0x74, 0xcc, 0x8f, 0x68, 0x93, 0x88, 0xfd, 0x22, 0xcc, 0x14, 0xe5, 0x11, + 0x5d, 0x33, 0xf8, 0x66, 0xc0, 0x59, 0x93, 0xf0, 0x7f, 0xf4, 0x21, 0x14, 0x15, 0xa8, 0x77, 0x48, + 0x82, 0x43, 0xc9, 0xc3, 0xab, 0xcb, 0xe7, 0x2f, 0xd7, 0x41, 0x22, 0xb7, 0x48, 0x70, 0x88, 0x41, + 0xa2, 0xf9, 0x37, 0x6a, 0x40, 0xe1, 0x4b, 0xcf, 0x76, 0x7b, 0x4c, 0x0c, 0x42, 0x5d, 0x55, 0xcc, + 0xdd, 0x3f, 0x93, 0xa1, 0xaa, 0xfb, 0x13, 0xf8, 0x32, 0x92, 0xe8, 0xff, 0x9a, 0x80, 0x02, 0xb7, + 0x69, 0x1f, 0xd8, 0x26, 0x3f, 0x52, 0xbf, 0x7d, 0xa4, 0xbf, 0x05, 0x29, 0x33, 0xf0, 0xd5, 0xd8, + 0x44, 0xa8, 0xab, 0x75, 0x30, 0xe6, 0x32, 0xf4, 0x39, 0x64, 0x55, 0xf2, 0x25, 0x83, 0xbc, 0xfe, + 0xfa, 0xc3, 0x5f, 0x75, 0x51, 0xe9, 0x89, 0xb5, 0x9c, 0xf4, 0x4e, 0x8c, 0xb2, 0x88, 0xe3, 0x22, + 0x74, 0x13, 0x92, 0xa6, 0x2b, 0x9c, 0x42, 0x3d, 0x56, 0xd6, 0x5a, 0x38, 0x69, 0xba, 0xfa, 0x3f, + 0x25, 0x60, 0xa9, 0xe1, 0x9a, 0xfe, 0x58, 0x04, 0x49, 0xbe, 0x10, 0xb7, 0x21, 0x1f, 0x8c, 0xf6, + 0x83, 0x71, 0xc0, 0xe8, 0x20, 0x7c, 0x0b, 0x89, 0x04, 0xa8, 0x09, 0x79, 0xe2, 0xf4, 0x3d, 0xdf, + 0x66, 0x87, 0x03, 0xc5, 0xfb, 0xe7, 0x07, 0xe6, 0xb8, 0xcd, 0x8a, 0x11, 0xaa, 0xe0, 0x89, 0x76, + 0x18, 0x8a, 0x53, 0xa2, 0xb3, 0x22, 0x14, 0xbf, 0x0d, 0x45, 0x87, 0x0c, 0x44, 0x36, 0xca, 0xd3, + 0x49, 0x31, 0x8e, 0x34, 0x2e, 0x28, 0x19, 0xcf, 0xb1, 0x75, 0x1d, 0xf2, 0x91, 0x31, 0xb4, 0x02, + 0x05, 0xa3, 0xd1, 0xe9, 0x7d, 0xb4, 0xf1, 0xa0, 0xf7, 0xb8, 0xb6, 0xa3, 0x2d, 0x28, 0x26, 0xf0, + 0x77, 0x09, 0x58, 0xda, 0x91, 0x3e, 0xa8, 0xd8, 0xd5, 0x1d, 0x58, 0xf4, 0xc9, 0x01, 0x0b, 0xf9, + 0x5f, 0x5a, 0x3a, 0x17, 0x0f, 0x02, 0x9c, 0xff, 0xf1, 0xaa, 0xf9, 0xfc, 0x2f, 0xf6, 0x12, 0x97, + 0xba, 0xf4, 0x25, 0x2e, 0xfd, 0x9d, 0xbc, 0xc4, 0xe9, 0xbf, 0x4c, 0xc0, 0x8a, 0x3a, 0xa8, 0xc3, + 0xd7, 0x27, 0xf4, 0x1e, 0xe4, 0xe5, 0x99, 0x3d, 0x61, 0xaf, 0xe2, 0x41, 0x48, 0xe2, 0x9a, 0x75, + 0x9c, 0x93, 0xd5, 0x4d, 0x0b, 0xfd, 0x38, 0x76, 0xed, 0x7c, 0x01, 0x87, 0x9c, 0xb1, 0x5e, 0x99, + 0xdc, 0x45, 0x5f, 0xf8, 0x20, 0xb5, 0x0e, 0x05, 0xd5, 0x01, 0x91, 0x5b, 0xc8, 0x1c, 0x17, 0xa4, + 0xa8, 0x45, 0x06, 0x54, 0xbf, 0x0b, 0x69, 0x91, 0xe1, 0x00, 0x64, 0x3b, 0x5f, 0x74, 0xba, 0x8d, + 0x1d, 0x99, 0x55, 0x6e, 0x36, 0xc5, 0xab, 0xe0, 0x22, 0xa4, 0x1a, 0xad, 0xa7, 0x5a, 0x52, 0xdf, + 0x85, 0x9b, 0x55, 0x87, 0x98, 0x47, 0x8e, 0x1d, 0x30, 0x6a, 0xc5, 0x77, 0xd3, 0x0f, 0x21, 0x3b, + 0x75, 0x46, 0xbe, 0xe6, 0x8a, 0x45, 0x81, 0xf5, 0xbf, 0x4d, 0x40, 0x71, 0x8b, 0x12, 0x87, 0x1d, + 0x4e, 0xf2, 0x54, 0x46, 0x03, 0xa6, 0x62, 0x99, 0xf8, 0x46, 0x0f, 0x20, 0x17, 0x45, 0xf5, 0xab, + 0x5c, 0x44, 0x47, 0x68, 0xf4, 0x29, 0x2c, 0x72, 0x2f, 0xf4, 0x46, 0x21, 0xf9, 0x7a, 0xcd, 0x0d, + 0xa7, 0x02, 0xf3, 0x80, 0xe8, 0x53, 0x11, 0xcc, 0xc5, 0x5c, 0x65, 0x70, 0x58, 0xbc, 0xff, 0x8f, + 0x29, 0xc8, 0x47, 0x17, 0x3e, 0x3c, 0x22, 0x70, 0xb6, 0xbd, 0x20, 0xaf, 0x8e, 0x23, 0x79, 0x8b, + 0x9e, 0xa0, 0xb7, 0x27, 0x3c, 0xfb, 0x73, 0x79, 0xf1, 0x1c, 0x55, 0x87, 0x1c, 0xfb, 0x1d, 0xc8, + 0x19, 0x9d, 0x4e, 0xf3, 0x71, 0xab, 0x51, 0xd7, 0xbe, 0x4a, 0x94, 0xbe, 0x77, 0x7a, 0x56, 0xbe, + 0x16, 0x81, 0x8c, 0x20, 0xb0, 0xfb, 0x2e, 0xb5, 0x04, 0xaa, 0x56, 0x6b, 0xb4, 0xbb, 0x8d, 0xba, + 0xf6, 0x22, 0x39, 0x8b, 0x12, 0xbc, 0x51, 0x3c, 0x22, 0xe5, 0xdb, 0xb8, 0xd1, 0x36, 0x30, 0x6f, + 0xf0, 0xab, 0xa4, 0xa4, 0xff, 0x93, 0x16, 0x7d, 0x3a, 0x24, 0x3e, 0x6f, 0x73, 0x2d, 0x7c, 0x4c, + 0x7d, 0x91, 0x92, 0x0f, 0x0d, 0x93, 0xdb, 0x2b, 0x4a, 0xac, 0x31, 0x6f, 0x4d, 0xdc, 0x1c, 0x0a, + 0x33, 0xa9, 0x99, 0xd6, 0x3a, 0x8c, 0xf8, 0x8c, 0x5b, 0xd1, 0x61, 0x11, 0xef, 0xb5, 0x5a, 0x1c, + 0xf4, 0x22, 0x3d, 0x33, 0x3a, 0x3c, 0x72, 0x5d, 0x8e, 0xb9, 0x0b, 0xb9, 0xf0, 0x62, 0x51, 0xfb, + 0x2a, 0x3d, 0xd3, 0xa1, 0x5a, 0x78, 0x2b, 0x2a, 0x1a, 0xdc, 0xda, 0xeb, 0x8a, 0xb7, 0xde, 0x17, + 0x99, 0xd9, 0x06, 0x0f, 0x47, 0xcc, 0xe2, 0x89, 0x4d, 0x39, 0xca, 0x34, 0xbe, 0xca, 0x48, 0xee, + 0x16, 0x61, 0x54, 0x9a, 0xf1, 0x0e, 0xe4, 0x70, 0xe3, 0xa7, 0xf2, 0x59, 0xf8, 0x45, 0x76, 0xc6, + 0x0e, 0xa6, 0x5f, 0x52, 0x93, 0x51, 0x6b, 0xf2, 0x8e, 0x12, 0x55, 0xdd, 0xff, 0x5d, 0xc8, 0x85, + 0x71, 0x1e, 0xad, 0x41, 0xf6, 0xd9, 0x2e, 0x7e, 0xd2, 0xc0, 0xda, 0x82, 0x9c, 0x9d, 0xb0, 0xe6, + 0x99, 0x3c, 0x28, 0xcb, 0xb0, 0xb8, 0x63, 0xb4, 0x8c, 0xc7, 0x0d, 0x1c, 0xa6, 0xf7, 0x21, 0x40, + 0x05, 0xab, 0x92, 0xa6, 0x1a, 0x88, 0x6c, 0x56, 0x6f, 0x7f, 0xfd, 0xcd, 0xda, 0xc2, 0x2f, 0xbe, + 0x59, 0x5b, 0xf8, 0xd5, 0x37, 0x6b, 0x89, 0x17, 0xe7, 0x6b, 0x89, 0xaf, 0xcf, 0xd7, 0x12, 0x3f, + 0x3f, 0x5f, 0x4b, 0xfc, 0xc7, 0xf9, 0x5a, 0x62, 0x3f, 0x2b, 0x88, 0xf4, 0xc7, 0xff, 0x1f, 0x00, + 0x00, 0xff, 0xff, 0x24, 0x7a, 0x55, 0x47, 0xd8, 0x24, 0x00, 0x00, } diff --git a/vendor/src/github.com/docker/swarmkit/api/types.proto b/vendor/src/github.com/docker/swarmkit/api/types.proto index 5d3e24323b..2c6067674b 100644 --- a/vendor/src/github.com/docker/swarmkit/api/types.proto +++ b/vendor/src/github.com/docker/swarmkit/api/types.proto @@ -408,6 +408,12 @@ message ContainerStatus { int32 exit_code = 3; } +// PortStatus specifies the actual allocated runtime state of a list +// of port configs. +message PortStatus { + repeated PortConfig ports = 1; +} + message TaskStatus { Timestamp timestamp = 1; @@ -438,6 +444,10 @@ message TaskStatus { oneof runtime_status { ContainerStatus container = 5; } + + // HostPorts provides a list of ports allocated at the host + // level. + PortStatus port_status = 6; } // NetworkAttachmentConfig specifies how a service should be attached to a particular network. @@ -807,3 +817,26 @@ message BlacklistedCertificate { // was issued for the given CN. Timestamp expiry = 1; } + +// HealthConfig holds configuration settings for the HEALTHCHECK feature. +message HealthConfig { + // Test is the test to perform to check that the container is healthy. + // An empty slice means to inherit the default. + // The options are: + // {} : inherit healthcheck + // {"NONE"} : disable healthcheck + // {"CMD", args...} : exec arguments directly + // {"CMD-SHELL", command} : run command with system's default shell + repeated string test = 1; + + // Interval is the time to wait between checks. Zero means inherit. + Duration interval = 2; + + // Timeout is the time to wait before considering the check to have hung. + // Zero means inherit. + Duration timeout = 3; + + // Retries is the number of consecutive failures needed to consider a + // container as unhealthy. Zero means inherit. + int32 retries = 4; +} diff --git a/vendor/src/github.com/docker/swarmkit/manager/allocator/network.go b/vendor/src/github.com/docker/swarmkit/manager/allocator/network.go index 65de37dfbd..0da215131b 100644 --- a/vendor/src/github.com/docker/swarmkit/manager/allocator/network.go +++ b/vendor/src/github.com/docker/swarmkit/manager/allocator/network.go @@ -489,6 +489,28 @@ func taskUpdateEndpoint(t *api.Task, endpoint *api.Endpoint) { t.Endpoint = endpoint.Copy() } +func isIngressNetworkNeeded(s *api.Service) bool { + if s == nil { + return false + } + + if s.Spec.Endpoint == nil { + return false + } + + for _, p := range s.Spec.Endpoint.Ports { + // The service to which this task belongs is trying to + // expose ports with PublishMode as Ingress to the + // external world. Automatically attach the task to + // the ingress network. + if p.PublishMode == api.PublishModeIngress { + return true + } + } + + return false +} + func (a *Allocator) taskCreateNetworkAttachments(t *api.Task, s *api.Service) { // If task network attachments have already been filled in no // need to do anything else. @@ -497,11 +519,7 @@ func (a *Allocator) taskCreateNetworkAttachments(t *api.Task, s *api.Service) { } var networks []*api.NetworkAttachment - - // The service to which this task belongs is trying to expose - // ports to the external world. Automatically attach the task - // to the ingress network. - if s != nil && s.Spec.Endpoint != nil && len(s.Spec.Endpoint.Ports) != 0 { + if isIngressNetworkNeeded(s) { networks = append(networks, &api.NetworkAttachment{Network: a.netCtx.ingressNetwork}) } @@ -638,7 +656,7 @@ func (a *Allocator) allocateService(ctx context.Context, s *api.Service) error { // The service is trying to expose ports to the external // world. Automatically attach the service to the ingress // network only if it is not already done. - if len(s.Spec.Endpoint.Ports) != 0 { + if isIngressNetworkNeeded(s) { var found bool for _, vip := range s.Endpoint.VirtualIPs { if vip.NetworkID == nc.ingressNetwork.ID { @@ -668,7 +686,7 @@ func (a *Allocator) allocateService(ctx context.Context, s *api.Service) error { // If the service doesn't expose ports any more and if we have // any lingering virtual IP references for ingress network // clean them up here. - if s.Spec.Endpoint == nil || len(s.Spec.Endpoint.Ports) == 0 { + if !isIngressNetworkNeeded(s) { if s.Endpoint != nil { for i, vip := range s.Endpoint.VirtualIPs { if vip.NetworkID == nc.ingressNetwork.ID { @@ -755,7 +773,10 @@ func (a *Allocator) allocateTask(ctx context.Context, t *api.Task) (err error) { return } - taskUpdateEndpoint(t, s.Endpoint) + if s.Endpoint != nil { + taskUpdateEndpoint(t, s.Endpoint) + taskUpdated = true + } } for _, na := range t.Networks { @@ -781,6 +802,7 @@ func (a *Allocator) allocateTask(ctx context.Context, t *api.Task) (err error) { taskUpdated = true } }) + if err != nil { return err } diff --git a/vendor/src/github.com/docker/swarmkit/manager/allocator/networkallocator/portallocator.go b/vendor/src/github.com/docker/swarmkit/manager/allocator/networkallocator/portallocator.go index cbc12575f1..21546d72b2 100644 --- a/vendor/src/github.com/docker/swarmkit/manager/allocator/networkallocator/portallocator.go +++ b/vendor/src/github.com/docker/swarmkit/manager/allocator/networkallocator/portallocator.go @@ -128,8 +128,12 @@ func (pa *portAllocator) serviceAllocatePorts(s *api.Service) (err error) { for _, portConfig := range portConfigs { // Make a copy of port config to create runtime state portState := portConfig.Copy() - if err = pa.portSpaces[portState.Protocol].allocate(portState); err != nil { - return + + // Do an actual allocation only if the PublishMode is Ingress + if portConfig.PublishMode == api.PublishModeIngress { + if err = pa.portSpaces[portState.Protocol].allocate(portState); err != nil { + return + } } if s.Endpoint == nil { @@ -148,6 +152,12 @@ func (pa *portAllocator) serviceDeallocatePorts(s *api.Service) { } for _, portState := range s.Endpoint.Ports { + // Do an actual free only if the PublishMode is + // Ingress + if portState.PublishMode != api.PublishModeIngress { + continue + } + pa.portSpaces[portState.Protocol].free(portState) } @@ -177,6 +187,11 @@ func (pa *portAllocator) isPortsAllocated(s *api.Service) bool { } for i, portConfig := range s.Spec.Endpoint.Ports { + // Ignore ports which are not PublishModeIngress + if portConfig.PublishMode != api.PublishModeIngress { + continue + } + // The port configuration slice and port state slice // are expected to be in the same order. portState := s.Endpoint.Ports[i] diff --git a/vendor/src/github.com/docker/swarmkit/manager/manager.go b/vendor/src/github.com/docker/swarmkit/manager/manager.go index 21bc8265c5..b73061b1a5 100644 --- a/vendor/src/github.com/docker/swarmkit/manager/manager.go +++ b/vendor/src/github.com/docker/swarmkit/manager/manager.go @@ -131,11 +131,13 @@ func New(config *Config) (*Manager, error) { // externally-reachable address. tcpAddr := config.AdvertiseAddr + var tcpAddrPort string if tcpAddr == "" { // Otherwise, we know we are joining an existing swarm. Use a // wildcard address to trigger remote autodetection of our // address. - _, tcpAddrPort, err := net.SplitHostPort(config.ProtoAddr["tcp"]) + var err error + _, tcpAddrPort, err = net.SplitHostPort(config.ProtoAddr["tcp"]) if err != nil { return nil, fmt.Errorf("missing or invalid listen address %s", config.ProtoAddr["tcp"]) } @@ -189,7 +191,7 @@ func New(config *Config) (*Manager, error) { } else if err != nil { return nil, err } - if proto == "tcp" { + if proto == "tcp" && tcpAddrPort == "0" { // in case of 0 port tcpAddr = l.Addr().String() }