From 74c45bd64ce879a646f755f091f6d33aa7332ca3 Mon Sep 17 00:00:00 2001 From: Tim Gross Date: Tue, 15 Jun 2021 11:36:36 -0400 Subject: [PATCH] docker: generate /etc/hosts file for bridge network mode When `network.mode = "bridge"`, we create a pause container in Docker with no networking so that we have a process to hold the network namespace we create in Nomad. The default `/etc/hosts` file of that pause container is then used for all the Docker tasks that share that network namespace. Some applications rely on this file being populated. This changeset generates a `/etc/hosts` file and bind-mounts it to the container when Nomad owns the network, so that the container's hostname has an IP in the file as expected. The hosts file will include the entries added by the Docker driver's `extra_hosts` field. In this changeset, only the Docker task driver will take advantage of this option, as the `exec`/`java` drivers currently copy the host's `/etc/hosts` file and this can't be changed without breaking backwards compatibility. But the fields are available in the task driver protobuf for community task drivers to use if they'd like. --- CHANGELOG.md | 1 + client/allocrunner/network_hook.go | 18 +- drivers/docker/driver.go | 28 + drivers/shared/hostnames/mount.go | 76 +++ drivers/shared/hostnames/mount_unix_test.go | 120 ++++ plugins/drivers/driver.go | 12 +- plugins/drivers/proto/driver.pb.go | 573 +++++++++++--------- plugins/drivers/proto/driver.proto | 7 + plugins/drivers/utils.go | 36 +- website/content/docs/drivers/docker.mdx | 12 +- 10 files changed, 612 insertions(+), 271 deletions(-) create mode 100644 drivers/shared/hostnames/mount.go create mode 100644 drivers/shared/hostnames/mount_unix_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 54d7cd17d964..202c219eab92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ IMPROVEMENTS: * cli: Added `-monitor` flag to `deployment status` command and automatically monitor deployments from `job run` command. [[GH-10661](https://github.com/hashicorp/nomad/pull/10661)] +* docker: Tasks using `network.mode = "bridge"` that don't set their `network_mode` will receive a `/etc/hosts` file that includes the pause container's hostname and any `extra_hosts`. [[GH-10766](https://github.com/hashicorp/nomad/issues/10766)] BUG FIXES: * quotas (Enterprise): Fixed a bug where quotas were evaluated before constraints, resulting in quota capacity being used up by filtered nodes. [[GH-10753](https://github.com/hashicorp/nomad/issues/10753)] diff --git a/client/allocrunner/network_hook.go b/client/allocrunner/network_hook.go index 4b751b95b274..70f82111c6d8 100644 --- a/client/allocrunner/network_hook.go +++ b/client/allocrunner/network_hook.go @@ -9,6 +9,11 @@ import ( "github.com/hashicorp/nomad/plugins/drivers" ) +// We create a pause container to own the network namespace, and the +// NetworkIsolationSpec we get back from CreateNetwork has this label set as +// the container ID. We'll use this to generate a hostname for the task. +const dockerNetSpecLabelKey = "docker_sandbox_container_id" + type networkIsolationSetter interface { SetNetworkIsolation(*drivers.NetworkIsolationSpec) } @@ -106,7 +111,18 @@ func (h *networkHook) Prerun() error { if err != nil { return fmt.Errorf("failed to configure networking for alloc: %v", err) } - + if hostname, ok := spec.Labels[dockerNetSpecLabelKey]; ok { + if len(hostname) > 12 { + // the docker_sandbox_container_id is the full ID of the pause + // container, whereas we want the shortened name that dockerd + // sets as the pause container's hostname + hostname = hostname[:12] + } + h.spec.HostsConfig = &drivers.HostsConfig{ + Address: status.Address, + Hostname: hostname, + } + } h.networkStatusSetter.SetNetworkStatus(status) } return nil diff --git a/drivers/docker/driver.go b/drivers/docker/driver.go index 7234d34672b8..1f567ba5bb55 100644 --- a/drivers/docker/driver.go +++ b/drivers/docker/driver.go @@ -24,6 +24,7 @@ import ( "github.com/hashicorp/nomad/drivers/docker/docklog" "github.com/hashicorp/nomad/drivers/shared/capabilities" "github.com/hashicorp/nomad/drivers/shared/eventer" + "github.com/hashicorp/nomad/drivers/shared/hostnames" "github.com/hashicorp/nomad/drivers/shared/resolvconf" nstructs "github.com/hashicorp/nomad/nomad/structs" "github.com/hashicorp/nomad/plugins/base" @@ -954,6 +955,33 @@ func (d *Driver) createContainerConfig(task *drivers.TaskConfig, driverConfig *T hostConfig.Mounts = append(hostConfig.Mounts, *hm) } + // Setup /etc/hosts + // If the task's network_mode is unset our hostname and IP will come from + // the Nomad-owned network (if in use), so we need to generate an + // /etc/hosts file that matches the network rather than the default one + // that comes from the pause container + if task.NetworkIsolation != nil && driverConfig.NetworkMode == "" { + etcHostMount, err := hostnames.GenerateEtcHostsMount( + task.TaskDir().Dir, task.NetworkIsolation, driverConfig.ExtraHosts) + if err != nil { + return c, fmt.Errorf("failed to build mount for /etc/hosts: %v", err) + } + if etcHostMount != nil { + // erase the extra_hosts field if we have a mount so we don't get + // conflicting options error from dockerd + driverConfig.ExtraHosts = nil + hostConfig.Mounts = append(hostConfig.Mounts, docker.HostMount{ + Target: etcHostMount.TaskPath, + Source: etcHostMount.HostPath, + Type: "bind", + ReadOnly: etcHostMount.Readonly, + BindOptions: &docker.BindOptions{ + Propagation: etcHostMount.PropagationMode, + }, + }) + } + } + // Setup DNS // If task DNS options are configured Nomad will manage the resolv.conf file // Docker driver dns options are not compatible with task dns options diff --git a/drivers/shared/hostnames/mount.go b/drivers/shared/hostnames/mount.go new file mode 100644 index 000000000000..32e23240c14c --- /dev/null +++ b/drivers/shared/hostnames/mount.go @@ -0,0 +1,76 @@ +package hostnames + +import ( + "fmt" + "io/ioutil" + "net" + "path/filepath" + "strings" + + "github.com/hashicorp/nomad/plugins/drivers" +) + +// GenerateEtcHostsMount writes a /etc/hosts file using the network spec's +// hosts configuration, and returns a mount config so that task drivers can +// bind-mount it into the resulting task's filesystem. The extraHosts +// parameter is expected to be the same format as the extra_hosts field from +// the Docker or containerd drivers: []string{":"} +func GenerateEtcHostsMount(taskDir string, conf *drivers.NetworkIsolationSpec, extraHosts []string) (*drivers.MountConfig, error) { + if conf == nil || conf.Mode != drivers.NetIsolationModeGroup { + return nil, nil + } + hostsCfg := conf.HostsConfig + if hostsCfg == nil || hostsCfg.Address == "" || hostsCfg.Hostname == "" { + return nil, nil + } + + var content strings.Builder + fmt.Fprintf(&content, `# this file was generated by Nomad +127.0.0.1 localhost +::1 localhost +::1 ip6-localhost ip6-loopback +fe00::0 ip6-localnet +ff00::0 ip6-mcastprefix +ff02::1 ip6-allnodes +ff02::2 ip6-allrouters +ff02::3 ip6-allhosts + +# this entry is the IP address and hostname of the allocation +# shared with tasks in the task group's network +%s %s +`, hostsCfg.Address, hostsCfg.Hostname) + + if len(extraHosts) > 0 { + content.WriteString("\n# these entries are extra hosts added by the task config") + for _, hostLine := range extraHosts { + hostsEntry := strings.SplitN(hostLine, ":", 2) + if len(hostsEntry) != 2 { + return nil, fmt.Errorf("invalid hosts entry %q", hostLine) + } + if net.ParseIP(hostsEntry[1]) == nil { + return nil, fmt.Errorf("invalid IP address %q", hostLine) + } + content.WriteString(fmt.Sprintf("\n%s %s", hostsEntry[1], hostsEntry[0])) + } + content.WriteString("\n") + } + + path := filepath.Join(taskDir, "hosts") + err := ioutil.WriteFile(path, []byte(content.String()), 0644) + if err != nil { + return nil, err + } + + // Note that we're not setting readonly. The file is in the task dir + // anyways, so this lets the task overwrite its own hosts file if the + // application knows better than Nomad here. Task drivers may override + // this behavior. + mount := &drivers.MountConfig{ + TaskPath: "/etc/hosts", + HostPath: path, + Readonly: false, + PropagationMode: "private", + } + + return mount, nil +} diff --git a/drivers/shared/hostnames/mount_unix_test.go b/drivers/shared/hostnames/mount_unix_test.go new file mode 100644 index 000000000000..e7273b1d803e --- /dev/null +++ b/drivers/shared/hostnames/mount_unix_test.go @@ -0,0 +1,120 @@ +// +build !windows + +package hostnames + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/hashicorp/nomad/plugins/drivers" + "github.com/stretchr/testify/require" +) + +func TestGenerateEtcHostsMount(t *testing.T) { + + testCases := []struct { + name string + spec *drivers.NetworkIsolationSpec + extraHosts []string + expected []string + expectedErr string + }{ + { + name: "no-spec", + }, + { + name: "no-hosts-config", + spec: &drivers.NetworkIsolationSpec{Mode: drivers.NetIsolationModeGroup}, + }, + { + name: "base-case", + spec: &drivers.NetworkIsolationSpec{ + Mode: drivers.NetIsolationModeGroup, + HostsConfig: &drivers.HostsConfig{ + Address: "192.168.1.1", + Hostname: "xyzzy", + }, + }, + expected: []string{ + "192.168.1.1 xyzzy", + }, + }, + { + name: "with-valid-extra-hosts", + spec: &drivers.NetworkIsolationSpec{ + Mode: drivers.NetIsolationModeGroup, + HostsConfig: &drivers.HostsConfig{ + Address: "192.168.1.1", + Hostname: "xyzzy", + }, + }, + extraHosts: []string{ + "apple:192.168.1.2", + "banana:2001:0db8:85a3:0000:0000:8a2e:0370:7334", + }, + expected: []string{ + "192.168.1.1 xyzzy", + "192.168.1.2 apple", + "2001:0db8:85a3:0000:0000:8a2e:0370:7334 banana", + }, + }, + { + name: "invalid-extra-hosts-syntax", + spec: &drivers.NetworkIsolationSpec{ + Mode: drivers.NetIsolationModeGroup, + HostsConfig: &drivers.HostsConfig{ + Address: "192.168.1.1", + Hostname: "xyzzy", + }, + }, + extraHosts: []string{"apple192.168.1.2"}, + expectedErr: "invalid hosts entry \"apple192.168.1.2\"", + }, + { + name: "invalid-extra-hosts-bad-ip", + spec: &drivers.NetworkIsolationSpec{ + Mode: drivers.NetIsolationModeGroup, + HostsConfig: &drivers.HostsConfig{ + Address: "192.168.1.1", + Hostname: "xyzzy", + }, + }, + extraHosts: []string{"apple:192.168.1.256"}, + expectedErr: "invalid IP address \"apple:192.168.1.256\"", + }, + } + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + require := require.New(t) + + taskDir, err := ioutil.TempDir("", + fmt.Sprintf("generateEtcHosts_Test-%s", tc.name)) + defer os.RemoveAll(taskDir) + require.NoError(err) + dest := filepath.Join(taskDir, "hosts") + + got, err := GenerateEtcHostsMount(taskDir, tc.spec, tc.extraHosts) + + if tc.expectedErr != "" { + require.EqualError(err, tc.expectedErr) + } else { + require.NoError(err) + } + if len(tc.expected) == 0 { + require.Nil(got) + } else { + require.NotNil(got) + require.FileExists(dest) + tmpHosts, err := ioutil.ReadFile(dest) + require.NoError(err) + for _, line := range tc.expected { + require.Contains(string(tmpHosts), line) + } + } + }) + } +} diff --git a/plugins/drivers/driver.go b/plugins/drivers/driver.go index d103652b6aab..c84d42166252 100644 --- a/plugins/drivers/driver.go +++ b/plugins/drivers/driver.go @@ -200,9 +200,15 @@ var ( ) type NetworkIsolationSpec struct { - Mode NetIsolationMode - Path string - Labels map[string]string + Mode NetIsolationMode + Path string + Labels map[string]string + HostsConfig *HostsConfig +} + +type HostsConfig struct { + Hostname string + Address string } // MountConfigSupport is an enum that defaults to "all" for backwards diff --git a/plugins/drivers/proto/driver.pb.go b/plugins/drivers/proto/driver.pb.go index 9b73c93acc12..b682661b373a 100644 --- a/plugins/drivers/proto/driver.pb.go +++ b/plugins/drivers/proto/driver.pb.go @@ -233,7 +233,7 @@ func (x CPUUsage_Fields) String() string { } func (CPUUsage_Fields) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{53, 0} + return fileDescriptor_4a8f45747846a74d, []int{54, 0} } type MemoryUsage_Fields int32 @@ -273,7 +273,7 @@ func (x MemoryUsage_Fields) String() string { } func (MemoryUsage_Fields) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{54, 0} + return fileDescriptor_4a8f45747846a74d, []int{55, 0} } type TaskConfigSchemaRequest struct { @@ -1923,6 +1923,7 @@ type NetworkIsolationSpec struct { Mode NetworkIsolationSpec_NetworkIsolationMode `protobuf:"varint,1,opt,name=mode,proto3,enum=hashicorp.nomad.plugins.drivers.proto.NetworkIsolationSpec_NetworkIsolationMode" json:"mode,omitempty"` Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` Labels map[string]string `protobuf:"bytes,3,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + HostsConfig *HostsConfig `protobuf:"bytes,4,opt,name=hostsConfig,proto3" json:"hostsConfig,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1974,6 +1975,60 @@ func (m *NetworkIsolationSpec) GetLabels() map[string]string { return nil } +func (m *NetworkIsolationSpec) GetHostsConfig() *HostsConfig { + if m != nil { + return m.HostsConfig + } + return nil +} + +type HostsConfig struct { + Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *HostsConfig) Reset() { *m = HostsConfig{} } +func (m *HostsConfig) String() string { return proto.CompactTextString(m) } +func (*HostsConfig) ProtoMessage() {} +func (*HostsConfig) Descriptor() ([]byte, []int) { + return fileDescriptor_4a8f45747846a74d, []int{34} +} + +func (m *HostsConfig) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_HostsConfig.Unmarshal(m, b) +} +func (m *HostsConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_HostsConfig.Marshal(b, m, deterministic) +} +func (m *HostsConfig) XXX_Merge(src proto.Message) { + xxx_messageInfo_HostsConfig.Merge(m, src) +} +func (m *HostsConfig) XXX_Size() int { + return xxx_messageInfo_HostsConfig.Size(m) +} +func (m *HostsConfig) XXX_DiscardUnknown() { + xxx_messageInfo_HostsConfig.DiscardUnknown(m) +} + +var xxx_messageInfo_HostsConfig proto.InternalMessageInfo + +func (m *HostsConfig) GetHostname() string { + if m != nil { + return m.Hostname + } + return "" +} + +func (m *HostsConfig) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + type DNSConfig struct { Servers []string `protobuf:"bytes,1,rep,name=servers,proto3" json:"servers,omitempty"` Searches []string `protobuf:"bytes,2,rep,name=searches,proto3" json:"searches,omitempty"` @@ -1987,7 +2042,7 @@ func (m *DNSConfig) Reset() { *m = DNSConfig{} } func (m *DNSConfig) String() string { return proto.CompactTextString(m) } func (*DNSConfig) ProtoMessage() {} func (*DNSConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{34} + return fileDescriptor_4a8f45747846a74d, []int{35} } func (m *DNSConfig) XXX_Unmarshal(b []byte) error { @@ -2079,7 +2134,7 @@ func (m *TaskConfig) Reset() { *m = TaskConfig{} } func (m *TaskConfig) String() string { return proto.CompactTextString(m) } func (*TaskConfig) ProtoMessage() {} func (*TaskConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{35} + return fileDescriptor_4a8f45747846a74d, []int{36} } func (m *TaskConfig) XXX_Unmarshal(b []byte) error { @@ -2236,7 +2291,7 @@ func (m *Resources) Reset() { *m = Resources{} } func (m *Resources) String() string { return proto.CompactTextString(m) } func (*Resources) ProtoMessage() {} func (*Resources) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{36} + return fileDescriptor_4a8f45747846a74d, []int{37} } func (m *Resources) XXX_Unmarshal(b []byte) error { @@ -2291,7 +2346,7 @@ func (m *AllocatedTaskResources) Reset() { *m = AllocatedTaskResources{} func (m *AllocatedTaskResources) String() string { return proto.CompactTextString(m) } func (*AllocatedTaskResources) ProtoMessage() {} func (*AllocatedTaskResources) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{37} + return fileDescriptor_4a8f45747846a74d, []int{38} } func (m *AllocatedTaskResources) XXX_Unmarshal(b []byte) error { @@ -2344,7 +2399,7 @@ func (m *AllocatedCpuResources) Reset() { *m = AllocatedCpuResources{} } func (m *AllocatedCpuResources) String() string { return proto.CompactTextString(m) } func (*AllocatedCpuResources) ProtoMessage() {} func (*AllocatedCpuResources) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{38} + return fileDescriptor_4a8f45747846a74d, []int{39} } func (m *AllocatedCpuResources) XXX_Unmarshal(b []byte) error { @@ -2384,7 +2439,7 @@ func (m *AllocatedMemoryResources) Reset() { *m = AllocatedMemoryResourc func (m *AllocatedMemoryResources) String() string { return proto.CompactTextString(m) } func (*AllocatedMemoryResources) ProtoMessage() {} func (*AllocatedMemoryResources) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{39} + return fileDescriptor_4a8f45747846a74d, []int{40} } func (m *AllocatedMemoryResources) XXX_Unmarshal(b []byte) error { @@ -2435,7 +2490,7 @@ func (m *NetworkResource) Reset() { *m = NetworkResource{} } func (m *NetworkResource) String() string { return proto.CompactTextString(m) } func (*NetworkResource) ProtoMessage() {} func (*NetworkResource) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{40} + return fileDescriptor_4a8f45747846a74d, []int{41} } func (m *NetworkResource) XXX_Unmarshal(b []byte) error { @@ -2510,7 +2565,7 @@ func (m *NetworkPort) Reset() { *m = NetworkPort{} } func (m *NetworkPort) String() string { return proto.CompactTextString(m) } func (*NetworkPort) ProtoMessage() {} func (*NetworkPort) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{41} + return fileDescriptor_4a8f45747846a74d, []int{42} } func (m *NetworkPort) XXX_Unmarshal(b []byte) error { @@ -2559,7 +2614,7 @@ func (m *PortMapping) Reset() { *m = PortMapping{} } func (m *PortMapping) String() string { return proto.CompactTextString(m) } func (*PortMapping) ProtoMessage() {} func (*PortMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{42} + return fileDescriptor_4a8f45747846a74d, []int{43} } func (m *PortMapping) XXX_Unmarshal(b []byte) error { @@ -2636,7 +2691,7 @@ func (m *LinuxResources) Reset() { *m = LinuxResources{} } func (m *LinuxResources) String() string { return proto.CompactTextString(m) } func (*LinuxResources) ProtoMessage() {} func (*LinuxResources) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{43} + return fileDescriptor_4a8f45747846a74d, []int{44} } func (m *LinuxResources) XXX_Unmarshal(b []byte) error { @@ -2729,7 +2784,7 @@ func (m *Mount) Reset() { *m = Mount{} } func (m *Mount) String() string { return proto.CompactTextString(m) } func (*Mount) ProtoMessage() {} func (*Mount) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{44} + return fileDescriptor_4a8f45747846a74d, []int{45} } func (m *Mount) XXX_Unmarshal(b []byte) error { @@ -2793,7 +2848,7 @@ func (m *Device) Reset() { *m = Device{} } func (m *Device) String() string { return proto.CompactTextString(m) } func (*Device) ProtoMessage() {} func (*Device) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{45} + return fileDescriptor_4a8f45747846a74d, []int{46} } func (m *Device) XXX_Unmarshal(b []byte) error { @@ -2855,7 +2910,7 @@ func (m *TaskHandle) Reset() { *m = TaskHandle{} } func (m *TaskHandle) String() string { return proto.CompactTextString(m) } func (*TaskHandle) ProtoMessage() {} func (*TaskHandle) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{46} + return fileDescriptor_4a8f45747846a74d, []int{47} } func (m *TaskHandle) XXX_Unmarshal(b []byte) error { @@ -2923,7 +2978,7 @@ func (m *NetworkOverride) Reset() { *m = NetworkOverride{} } func (m *NetworkOverride) String() string { return proto.CompactTextString(m) } func (*NetworkOverride) ProtoMessage() {} func (*NetworkOverride) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{47} + return fileDescriptor_4a8f45747846a74d, []int{48} } func (m *NetworkOverride) XXX_Unmarshal(b []byte) error { @@ -2982,7 +3037,7 @@ func (m *ExitResult) Reset() { *m = ExitResult{} } func (m *ExitResult) String() string { return proto.CompactTextString(m) } func (*ExitResult) ProtoMessage() {} func (*ExitResult) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{48} + return fileDescriptor_4a8f45747846a74d, []int{49} } func (m *ExitResult) XXX_Unmarshal(b []byte) error { @@ -3046,7 +3101,7 @@ func (m *TaskStatus) Reset() { *m = TaskStatus{} } func (m *TaskStatus) String() string { return proto.CompactTextString(m) } func (*TaskStatus) ProtoMessage() {} func (*TaskStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{49} + return fileDescriptor_4a8f45747846a74d, []int{50} } func (m *TaskStatus) XXX_Unmarshal(b []byte) error { @@ -3122,7 +3177,7 @@ func (m *TaskDriverStatus) Reset() { *m = TaskDriverStatus{} } func (m *TaskDriverStatus) String() string { return proto.CompactTextString(m) } func (*TaskDriverStatus) ProtoMessage() {} func (*TaskDriverStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{50} + return fileDescriptor_4a8f45747846a74d, []int{51} } func (m *TaskDriverStatus) XXX_Unmarshal(b []byte) error { @@ -3168,7 +3223,7 @@ func (m *TaskStats) Reset() { *m = TaskStats{} } func (m *TaskStats) String() string { return proto.CompactTextString(m) } func (*TaskStats) ProtoMessage() {} func (*TaskStats) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{51} + return fileDescriptor_4a8f45747846a74d, []int{52} } func (m *TaskStats) XXX_Unmarshal(b []byte) error { @@ -3231,7 +3286,7 @@ func (m *TaskResourceUsage) Reset() { *m = TaskResourceUsage{} } func (m *TaskResourceUsage) String() string { return proto.CompactTextString(m) } func (*TaskResourceUsage) ProtoMessage() {} func (*TaskResourceUsage) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{52} + return fileDescriptor_4a8f45747846a74d, []int{53} } func (m *TaskResourceUsage) XXX_Unmarshal(b []byte) error { @@ -3284,7 +3339,7 @@ func (m *CPUUsage) Reset() { *m = CPUUsage{} } func (m *CPUUsage) String() string { return proto.CompactTextString(m) } func (*CPUUsage) ProtoMessage() {} func (*CPUUsage) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{53} + return fileDescriptor_4a8f45747846a74d, []int{54} } func (m *CPUUsage) XXX_Unmarshal(b []byte) error { @@ -3373,7 +3428,7 @@ func (m *MemoryUsage) Reset() { *m = MemoryUsage{} } func (m *MemoryUsage) String() string { return proto.CompactTextString(m) } func (*MemoryUsage) ProtoMessage() {} func (*MemoryUsage) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{54} + return fileDescriptor_4a8f45747846a74d, []int{55} } func (m *MemoryUsage) XXX_Unmarshal(b []byte) error { @@ -3472,7 +3527,7 @@ func (m *DriverTaskEvent) Reset() { *m = DriverTaskEvent{} } func (m *DriverTaskEvent) String() string { return proto.CompactTextString(m) } func (*DriverTaskEvent) ProtoMessage() {} func (*DriverTaskEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_4a8f45747846a74d, []int{55} + return fileDescriptor_4a8f45747846a74d, []int{56} } func (m *DriverTaskEvent) XXX_Unmarshal(b []byte) error { @@ -3582,6 +3637,7 @@ func init() { proto.RegisterType((*DriverCapabilities)(nil), "hashicorp.nomad.plugins.drivers.proto.DriverCapabilities") proto.RegisterType((*NetworkIsolationSpec)(nil), "hashicorp.nomad.plugins.drivers.proto.NetworkIsolationSpec") proto.RegisterMapType((map[string]string)(nil), "hashicorp.nomad.plugins.drivers.proto.NetworkIsolationSpec.LabelsEntry") + proto.RegisterType((*HostsConfig)(nil), "hashicorp.nomad.plugins.drivers.proto.HostsConfig") proto.RegisterType((*DNSConfig)(nil), "hashicorp.nomad.plugins.drivers.proto.DNSConfig") proto.RegisterType((*TaskConfig)(nil), "hashicorp.nomad.plugins.drivers.proto.TaskConfig") proto.RegisterMapType((map[string]string)(nil), "hashicorp.nomad.plugins.drivers.proto.TaskConfig.DeviceEnvEntry") @@ -3617,240 +3673,243 @@ func init() { } var fileDescriptor_4a8f45747846a74d = []byte{ - // 3726 bytes of a gzipped FileDescriptorProto + // 3771 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x5a, 0xcd, 0x6f, 0x1b, 0x49, - 0x76, 0x57, 0xf3, 0x4b, 0xe4, 0xa3, 0x44, 0xb5, 0xca, 0xb2, 0x87, 0xe6, 0x24, 0x19, 0x6f, 0x07, - 0x13, 0x08, 0xbb, 0x33, 0xf4, 0x8c, 0x16, 0x19, 0x8f, 0x67, 0x3d, 0xeb, 0xe1, 0x50, 0xb4, 0xa5, - 0xb1, 0x44, 0x29, 0x45, 0x0a, 0x5e, 0xc7, 0xd9, 0xe9, 0xb4, 0xd8, 0x65, 0xaa, 0x2d, 0xf6, 0xc7, - 0x74, 0x15, 0x65, 0x69, 0x83, 0x20, 0xc1, 0x06, 0x08, 0x36, 0x40, 0x82, 0xe4, 0x32, 0xd9, 0x4b, - 0x4e, 0x0b, 0xe4, 0x94, 0x7f, 0x20, 0xd8, 0x60, 0xce, 0xf9, 0x27, 0x72, 0xc9, 0x2d, 0x97, 0x00, - 0xc9, 0x29, 0xd7, 0xa0, 0x3e, 0xba, 0xd9, 0x4d, 0xd2, 0xe3, 0x26, 0xe5, 0x53, 0xf7, 0x7b, 0x55, - 0xf5, 0xab, 0xd7, 0xef, 0xbd, 0xaa, 0xf7, 0xaa, 0xfa, 0x81, 0x11, 0x8c, 0xc6, 0x43, 0xc7, 0xa3, - 0x77, 0xed, 0xd0, 0xb9, 0x20, 0x21, 0xbd, 0x1b, 0x84, 0x3e, 0xf3, 0x15, 0xd5, 0x14, 0x04, 0x7a, - 0xff, 0xcc, 0xa2, 0x67, 0xce, 0xc0, 0x0f, 0x83, 0xa6, 0xe7, 0xbb, 0x96, 0xdd, 0x54, 0x63, 0x9a, - 0x6a, 0x8c, 0xec, 0xd6, 0xf8, 0xbd, 0xa1, 0xef, 0x0f, 0x47, 0x44, 0x22, 0x9c, 0x8e, 0x5f, 0xdc, - 0xb5, 0xc7, 0xa1, 0xc5, 0x1c, 0xdf, 0x53, 0xed, 0xef, 0x4d, 0xb7, 0x33, 0xc7, 0x25, 0x94, 0x59, - 0x6e, 0xa0, 0x3a, 0xbc, 0x1f, 0xc9, 0x42, 0xcf, 0xac, 0x90, 0xd8, 0x77, 0xcf, 0x06, 0x23, 0x1a, - 0x90, 0x01, 0x7f, 0x9a, 0xfc, 0x45, 0x75, 0xfb, 0x60, 0xaa, 0x1b, 0x65, 0xe1, 0x78, 0xc0, 0x22, - 0xc9, 0x2d, 0xc6, 0x42, 0xe7, 0x74, 0xcc, 0x88, 0xec, 0x6d, 0xdc, 0x86, 0x77, 0xfa, 0x16, 0x3d, - 0x6f, 0xfb, 0xde, 0x0b, 0x67, 0xd8, 0x1b, 0x9c, 0x11, 0xd7, 0xc2, 0xe4, 0x9b, 0x31, 0xa1, 0xcc, - 0xf8, 0x13, 0xa8, 0xcf, 0x36, 0xd1, 0xc0, 0xf7, 0x28, 0x41, 0x5f, 0x40, 0x81, 0x4f, 0x59, 0xd7, - 0xee, 0x68, 0xdb, 0xd5, 0x9d, 0x0f, 0x9a, 0xaf, 0x53, 0x81, 0x94, 0xa1, 0xa9, 0x44, 0x6d, 0xf6, - 0x02, 0x32, 0xc0, 0x62, 0xa4, 0x71, 0x13, 0x6e, 0xb4, 0xad, 0xc0, 0x3a, 0x75, 0x46, 0x0e, 0x73, - 0x08, 0x8d, 0x26, 0x1d, 0xc3, 0x56, 0x9a, 0xad, 0x26, 0xfc, 0x39, 0xac, 0x0d, 0x12, 0x7c, 0x35, - 0xf1, 0xfd, 0x66, 0x26, 0xdd, 0x37, 0x77, 0x05, 0x95, 0x02, 0x4e, 0xc1, 0x19, 0x5b, 0x80, 0x1e, - 0x39, 0xde, 0x90, 0x84, 0x41, 0xe8, 0x78, 0x2c, 0x12, 0xe6, 0xbb, 0x3c, 0xdc, 0x48, 0xb1, 0x95, - 0x30, 0x2f, 0x01, 0x62, 0x3d, 0x72, 0x51, 0xf2, 0xdb, 0xd5, 0x9d, 0xaf, 0x32, 0x8a, 0x32, 0x07, - 0xaf, 0xd9, 0x8a, 0xc1, 0x3a, 0x1e, 0x0b, 0xaf, 0x70, 0x02, 0x1d, 0x7d, 0x0d, 0xa5, 0x33, 0x62, - 0x8d, 0xd8, 0x59, 0x3d, 0x77, 0x47, 0xdb, 0xae, 0xed, 0x3c, 0xba, 0xc6, 0x3c, 0x7b, 0x02, 0xa8, - 0xc7, 0x2c, 0x46, 0xb0, 0x42, 0x45, 0x1f, 0x02, 0x92, 0x6f, 0xa6, 0x4d, 0xe8, 0x20, 0x74, 0x02, - 0xee, 0x92, 0xf5, 0xfc, 0x1d, 0x6d, 0xbb, 0x82, 0x37, 0x65, 0xcb, 0xee, 0xa4, 0xa1, 0x11, 0xc0, - 0xc6, 0x94, 0xb4, 0x48, 0x87, 0xfc, 0x39, 0xb9, 0x12, 0x16, 0xa9, 0x60, 0xfe, 0x8a, 0x1e, 0x43, - 0xf1, 0xc2, 0x1a, 0x8d, 0x89, 0x10, 0xb9, 0xba, 0xf3, 0xf1, 0x9b, 0xdc, 0x43, 0xb9, 0xe8, 0x44, - 0x0f, 0x58, 0x8e, 0xff, 0x2c, 0xf7, 0xa9, 0x66, 0xdc, 0x87, 0x6a, 0x42, 0x6e, 0x54, 0x03, 0x38, - 0xe9, 0xee, 0x76, 0xfa, 0x9d, 0x76, 0xbf, 0xb3, 0xab, 0xaf, 0xa0, 0x75, 0xa8, 0x9c, 0x74, 0xf7, - 0x3a, 0xad, 0x83, 0xfe, 0xde, 0x33, 0x5d, 0x43, 0x55, 0x58, 0x8d, 0x88, 0x9c, 0x71, 0x09, 0x08, - 0x93, 0x81, 0x7f, 0x41, 0x42, 0xee, 0xc8, 0xca, 0xaa, 0xe8, 0x1d, 0x58, 0x65, 0x16, 0x3d, 0x37, - 0x1d, 0x5b, 0xc9, 0x5c, 0xe2, 0xe4, 0xbe, 0x8d, 0xf6, 0xa1, 0x74, 0x66, 0x79, 0xf6, 0xe8, 0xcd, - 0x72, 0xa7, 0x55, 0xcd, 0xc1, 0xf7, 0xc4, 0x40, 0xac, 0x00, 0xb8, 0x77, 0xa7, 0x66, 0x96, 0x06, - 0x30, 0x9e, 0x81, 0xde, 0x63, 0x56, 0xc8, 0x92, 0xe2, 0x74, 0xa0, 0xc0, 0xe7, 0x57, 0x1e, 0xbd, - 0xc8, 0x9c, 0x72, 0x65, 0x62, 0x31, 0xdc, 0xf8, 0xdf, 0x1c, 0x6c, 0x26, 0xb0, 0x95, 0xa7, 0x3e, - 0x85, 0x52, 0x48, 0xe8, 0x78, 0xc4, 0x04, 0x7c, 0x6d, 0xe7, 0x61, 0x46, 0xf8, 0x19, 0xa4, 0x26, - 0x16, 0x30, 0x58, 0xc1, 0xa1, 0x6d, 0xd0, 0xe5, 0x08, 0x93, 0x84, 0xa1, 0x1f, 0x9a, 0x2e, 0x1d, - 0x0a, 0xad, 0x55, 0x70, 0x4d, 0xf2, 0x3b, 0x9c, 0x7d, 0x48, 0x87, 0x09, 0xad, 0xe6, 0xaf, 0xa9, - 0x55, 0x64, 0x81, 0xee, 0x11, 0xf6, 0xca, 0x0f, 0xcf, 0x4d, 0xae, 0xda, 0xd0, 0xb1, 0x49, 0xbd, - 0x20, 0x40, 0x3f, 0xc9, 0x08, 0xda, 0x95, 0xc3, 0x8f, 0xd4, 0x68, 0xbc, 0xe1, 0xa5, 0x19, 0xc6, - 0x8f, 0xa0, 0x24, 0xbf, 0x94, 0x7b, 0x52, 0xef, 0xa4, 0xdd, 0xee, 0xf4, 0x7a, 0xfa, 0x0a, 0xaa, - 0x40, 0x11, 0x77, 0xfa, 0x98, 0x7b, 0x58, 0x05, 0x8a, 0x8f, 0x5a, 0xfd, 0xd6, 0x81, 0x9e, 0x33, - 0x7e, 0x08, 0x1b, 0x4f, 0x2d, 0x87, 0x65, 0x71, 0x2e, 0xc3, 0x07, 0x7d, 0xd2, 0x57, 0x59, 0x67, - 0x3f, 0x65, 0x9d, 0xec, 0xaa, 0xe9, 0x5c, 0x3a, 0x6c, 0xca, 0x1e, 0x3a, 0xe4, 0x49, 0x18, 0x2a, - 0x13, 0xf0, 0x57, 0xe3, 0x15, 0x6c, 0xf4, 0x98, 0x1f, 0x64, 0xf2, 0xfc, 0x1f, 0xc3, 0x2a, 0x8f, - 0x36, 0xfe, 0x98, 0x29, 0xd7, 0xbf, 0xdd, 0x94, 0xd1, 0xa8, 0x19, 0x45, 0xa3, 0xe6, 0xae, 0x8a, - 0x56, 0x38, 0xea, 0x89, 0x6e, 0x41, 0x89, 0x3a, 0x43, 0xcf, 0x1a, 0xa9, 0xdd, 0x42, 0x51, 0x06, - 0xe2, 0x4e, 0x1e, 0x4d, 0xac, 0x1c, 0xbf, 0x0d, 0x68, 0x97, 0x50, 0x16, 0xfa, 0x57, 0x99, 0xe4, - 0xd9, 0x82, 0xe2, 0x0b, 0x3f, 0x1c, 0xc8, 0x85, 0x58, 0xc6, 0x92, 0xe0, 0x8b, 0x2a, 0x05, 0xa2, - 0xb0, 0x3f, 0x04, 0xb4, 0xef, 0xf1, 0x98, 0x92, 0xcd, 0x10, 0xff, 0x90, 0x83, 0x1b, 0xa9, 0xfe, - 0xca, 0x18, 0xcb, 0xaf, 0x43, 0xbe, 0x31, 0x8d, 0xa9, 0x5c, 0x87, 0xe8, 0x08, 0x4a, 0xb2, 0x87, - 0xd2, 0xe4, 0xbd, 0x05, 0x80, 0x64, 0x98, 0x52, 0x70, 0x0a, 0x66, 0xae, 0xd3, 0xe7, 0xdf, 0xae, - 0xd3, 0xbf, 0x02, 0x3d, 0xfa, 0x0e, 0xfa, 0x46, 0xdb, 0x7c, 0x05, 0x37, 0x06, 0xfe, 0x68, 0x44, - 0x06, 0xdc, 0x1b, 0x4c, 0xc7, 0x63, 0x24, 0xbc, 0xb0, 0x46, 0x6f, 0xf6, 0x1b, 0x34, 0x19, 0xb5, - 0xaf, 0x06, 0x19, 0xcf, 0x61, 0x33, 0x31, 0xb1, 0x32, 0xc4, 0x23, 0x28, 0x52, 0xce, 0x50, 0x96, - 0xf8, 0x68, 0x41, 0x4b, 0x50, 0x2c, 0x87, 0x1b, 0x37, 0x24, 0x78, 0xe7, 0x82, 0x78, 0xf1, 0x67, - 0x19, 0xbb, 0xb0, 0xd9, 0x13, 0x6e, 0x9a, 0xc9, 0x0f, 0x27, 0x2e, 0x9e, 0x4b, 0xb9, 0xf8, 0x16, - 0xa0, 0x24, 0x8a, 0x72, 0xc4, 0x2b, 0xd8, 0xe8, 0x5c, 0x92, 0x41, 0x26, 0xe4, 0x3a, 0xac, 0x0e, - 0x7c, 0xd7, 0xb5, 0x3c, 0xbb, 0x9e, 0xbb, 0x93, 0xdf, 0xae, 0xe0, 0x88, 0x4c, 0xae, 0xc5, 0x7c, - 0xd6, 0xb5, 0x68, 0xfc, 0x9d, 0x06, 0xfa, 0x64, 0x6e, 0xa5, 0x48, 0x2e, 0x3d, 0xb3, 0x39, 0x10, - 0x9f, 0x7b, 0x0d, 0x2b, 0x4a, 0xf1, 0xa3, 0xed, 0x42, 0xf2, 0x49, 0x18, 0x26, 0xb6, 0xa3, 0xfc, - 0x35, 0xb7, 0x23, 0x63, 0x0f, 0x7e, 0x27, 0x12, 0xa7, 0xc7, 0x42, 0x62, 0xb9, 0x8e, 0x37, 0xdc, - 0x3f, 0x3a, 0x0a, 0x88, 0x14, 0x1c, 0x21, 0x28, 0xd8, 0x16, 0xb3, 0x94, 0x60, 0xe2, 0x9d, 0x2f, - 0xfa, 0xc1, 0xc8, 0xa7, 0xf1, 0xa2, 0x17, 0x84, 0xf1, 0xef, 0x79, 0xa8, 0xcf, 0x40, 0x45, 0xea, - 0x7d, 0x0e, 0x45, 0x4a, 0xd8, 0x38, 0x50, 0xae, 0xd2, 0xc9, 0x2c, 0xf0, 0x7c, 0xbc, 0x66, 0x8f, - 0x83, 0x61, 0x89, 0x89, 0x86, 0x50, 0x66, 0xec, 0xca, 0xa4, 0xce, 0x2f, 0xa2, 0x84, 0xe0, 0xe0, - 0xba, 0xf8, 0x7d, 0x12, 0xba, 0x8e, 0x67, 0x8d, 0x7a, 0xce, 0x2f, 0x08, 0x5e, 0x65, 0xec, 0x8a, - 0xbf, 0xa0, 0x67, 0xdc, 0xe1, 0x6d, 0xc7, 0x53, 0x6a, 0x6f, 0x2f, 0x3b, 0x4b, 0x42, 0xc1, 0x58, - 0x22, 0x36, 0x0e, 0xa0, 0x28, 0xbe, 0x69, 0x19, 0x47, 0xd4, 0x21, 0xcf, 0xd8, 0x95, 0x10, 0xaa, - 0x8c, 0xf9, 0x6b, 0xe3, 0x01, 0xac, 0x25, 0xbf, 0x80, 0x3b, 0xd2, 0x19, 0x71, 0x86, 0x67, 0xd2, - 0xc1, 0x8a, 0x58, 0x51, 0xdc, 0x92, 0xaf, 0x1c, 0x5b, 0xa5, 0xac, 0x45, 0x2c, 0x09, 0xe3, 0x5f, - 0x73, 0x70, 0x7b, 0x8e, 0x66, 0x94, 0xb3, 0x3e, 0x4f, 0x39, 0xeb, 0x5b, 0xd2, 0x42, 0xe4, 0xf1, - 0xcf, 0x53, 0x1e, 0xff, 0x16, 0xc1, 0xf9, 0xb2, 0xb9, 0x05, 0x25, 0x72, 0xe9, 0x30, 0x62, 0x2b, - 0x55, 0x29, 0x2a, 0xb1, 0x9c, 0x0a, 0xd7, 0x5d, 0x4e, 0x1f, 0xc3, 0x56, 0x3b, 0x24, 0x16, 0x23, - 0x6a, 0x2b, 0x8f, 0xfc, 0xff, 0x36, 0x94, 0xad, 0xd1, 0xc8, 0x1f, 0x4c, 0xcc, 0xba, 0x2a, 0xe8, - 0x7d, 0xdb, 0xf8, 0x56, 0x83, 0x9b, 0x53, 0x63, 0x94, 0xa6, 0x4f, 0xa1, 0xe6, 0x50, 0x7f, 0x24, - 0x3e, 0xc2, 0x4c, 0x9c, 0xe2, 0x7e, 0xb2, 0x58, 0x38, 0xd9, 0x8f, 0x30, 0xc4, 0xa1, 0x6e, 0xdd, - 0x49, 0x92, 0xc2, 0xab, 0xc4, 0xe4, 0xb6, 0x5a, 0xcd, 0x11, 0x69, 0xfc, 0xa3, 0x06, 0x37, 0x55, - 0x14, 0xcf, 0xfc, 0x31, 0x73, 0x44, 0xce, 0xbd, 0x6d, 0x91, 0x8d, 0x3a, 0xdc, 0x9a, 0x96, 0x4b, - 0xed, 0xeb, 0xff, 0x57, 0x00, 0x34, 0x7b, 0x82, 0x44, 0x3f, 0x80, 0x35, 0x4a, 0x3c, 0xdb, 0x94, - 0x31, 0x41, 0x86, 0xab, 0x32, 0xae, 0x72, 0x9e, 0x0c, 0x0e, 0x94, 0x6f, 0x73, 0xe4, 0x52, 0x49, - 0x5b, 0xc6, 0xe2, 0x1d, 0x9d, 0xc1, 0xda, 0x0b, 0x6a, 0xc6, 0x73, 0x0b, 0xa7, 0xa9, 0x65, 0xde, - 0xba, 0x66, 0xe5, 0x68, 0x3e, 0xea, 0xc5, 0xdf, 0x85, 0xab, 0x2f, 0x68, 0x4c, 0xa0, 0x5f, 0x69, - 0xf0, 0x4e, 0x94, 0x3a, 0x4c, 0xd4, 0xe7, 0xfa, 0x36, 0xa1, 0xf5, 0xc2, 0x9d, 0xfc, 0x76, 0x6d, - 0xe7, 0xf8, 0x1a, 0xfa, 0x9b, 0x61, 0x1e, 0xfa, 0x36, 0xc1, 0x37, 0xbd, 0x39, 0x5c, 0x8a, 0x9a, - 0x70, 0xc3, 0x1d, 0x53, 0x66, 0x4a, 0x2f, 0x30, 0x55, 0xa7, 0x7a, 0x51, 0xe8, 0x65, 0x93, 0x37, - 0xa5, 0x7c, 0x15, 0x9d, 0xc3, 0xba, 0xeb, 0x8f, 0x3d, 0x66, 0x0e, 0xc4, 0x19, 0x87, 0xd6, 0x4b, - 0x0b, 0x1d, 0x7e, 0xe7, 0x68, 0xe9, 0x90, 0xc3, 0xc9, 0x13, 0x13, 0xc5, 0x6b, 0x6e, 0x82, 0xe2, - 0x86, 0x0c, 0x89, 0xeb, 0x33, 0x62, 0xf2, 0x3d, 0x91, 0xd6, 0x57, 0xa5, 0x21, 0x25, 0x8f, 0x2f, - 0x7f, 0x6a, 0x34, 0xa1, 0x9a, 0x50, 0x33, 0x2a, 0x43, 0xa1, 0x7b, 0xd4, 0xed, 0xe8, 0x2b, 0x08, - 0xa0, 0xd4, 0xde, 0xc3, 0x47, 0x47, 0x7d, 0x79, 0x32, 0xd8, 0x3f, 0x6c, 0x3d, 0xee, 0xe8, 0x39, - 0xa3, 0x03, 0x6b, 0xc9, 0x09, 0x11, 0x82, 0xda, 0x49, 0xf7, 0x49, 0xf7, 0xe8, 0x69, 0xd7, 0x3c, - 0x3c, 0x3a, 0xe9, 0xf6, 0xf9, 0x99, 0xa2, 0x06, 0xd0, 0xea, 0x3e, 0x9b, 0xd0, 0xeb, 0x50, 0xe9, - 0x1e, 0x45, 0xa4, 0xd6, 0xc8, 0xe9, 0x9a, 0xf1, 0xdf, 0x39, 0xd8, 0x9a, 0xa7, 0x7b, 0x64, 0x43, - 0x81, 0xdb, 0x51, 0x9d, 0xea, 0xde, 0xbe, 0x19, 0x05, 0x3a, 0x77, 0xdf, 0xc0, 0x52, 0xdb, 0x78, - 0x05, 0x8b, 0x77, 0x64, 0x42, 0x69, 0x64, 0x9d, 0x92, 0x11, 0xad, 0xe7, 0xc5, 0xbd, 0xc7, 0xe3, - 0xeb, 0xcc, 0x7d, 0x20, 0x90, 0xe4, 0xa5, 0x87, 0x82, 0x6d, 0xdc, 0x87, 0x6a, 0x82, 0x3d, 0xe7, - 0x76, 0x61, 0x2b, 0x79, 0xbb, 0x50, 0x49, 0x5e, 0x15, 0x3c, 0x9c, 0xd5, 0x16, 0xff, 0x1a, 0x6e, - 0xae, 0xbd, 0xa3, 0x5e, 0x5f, 0x9e, 0xe3, 0x1e, 0xe3, 0xa3, 0x93, 0x63, 0x5d, 0xe3, 0xcc, 0x7e, - 0xab, 0xf7, 0x44, 0xcf, 0xc5, 0xd6, 0xcc, 0x1b, 0xcf, 0xa1, 0xb2, 0xdb, 0xed, 0x49, 0xa3, 0xf1, - 0x3d, 0x8c, 0x92, 0x90, 0x7f, 0x82, 0xb8, 0xe2, 0xa9, 0xe0, 0x88, 0x44, 0x0d, 0x28, 0x53, 0x62, - 0x85, 0x83, 0x33, 0x42, 0x55, 0xd0, 0x8c, 0x69, 0x3e, 0xca, 0x17, 0x57, 0x25, 0x52, 0x41, 0x15, - 0x1c, 0x91, 0xc6, 0xff, 0xac, 0x02, 0x4c, 0x8e, 0xed, 0xa8, 0x06, 0xb9, 0x78, 0xa3, 0xcb, 0x39, - 0x36, 0x57, 0xb6, 0x67, 0xb9, 0xd1, 0x57, 0x89, 0x77, 0xb4, 0x03, 0x37, 0x5d, 0x3a, 0x0c, 0xac, - 0xc1, 0xb9, 0xa9, 0x4e, 0xdb, 0x72, 0x3d, 0x88, 0x4d, 0x63, 0x0d, 0xdf, 0x50, 0x8d, 0xca, 0xdd, - 0x25, 0xee, 0x01, 0xe4, 0x89, 0x77, 0x21, 0x16, 0x78, 0x75, 0xe7, 0xb3, 0x85, 0xaf, 0x13, 0x9a, - 0x1d, 0xef, 0x42, 0x1a, 0x84, 0xc3, 0x20, 0x13, 0xc0, 0x26, 0x17, 0xce, 0x80, 0x98, 0x1c, 0xb4, - 0x28, 0x40, 0xbf, 0x58, 0x1c, 0x74, 0x57, 0x60, 0xc4, 0xd0, 0x15, 0x3b, 0xa2, 0x51, 0x17, 0x2a, - 0x21, 0xa1, 0xfe, 0x38, 0x1c, 0x10, 0xb9, 0xca, 0xb3, 0x67, 0xfc, 0x38, 0x1a, 0x87, 0x27, 0x10, - 0x68, 0x17, 0x4a, 0x62, 0x71, 0xf3, 0x65, 0x9c, 0xff, 0xde, 0xbb, 0xc9, 0x34, 0x98, 0x58, 0xae, - 0x58, 0x8d, 0x45, 0x8f, 0x61, 0x55, 0x8a, 0x48, 0xeb, 0x65, 0x01, 0xf3, 0x61, 0xd6, 0x9d, 0x47, - 0x8c, 0xc2, 0xd1, 0x68, 0x6e, 0xd5, 0x31, 0x25, 0x61, 0xbd, 0x22, 0xad, 0xca, 0xdf, 0xd1, 0xbb, - 0x50, 0x91, 0x81, 0xce, 0x76, 0xc2, 0x3a, 0x88, 0x06, 0x19, 0xf9, 0x76, 0x9d, 0x10, 0xbd, 0x07, - 0x55, 0x99, 0xb4, 0x98, 0x62, 0xe9, 0x55, 0x45, 0x33, 0x48, 0xd6, 0x31, 0x5f, 0x80, 0xb2, 0x03, - 0x09, 0x43, 0xd9, 0x61, 0x2d, 0xee, 0x40, 0xc2, 0x50, 0x74, 0xf8, 0x03, 0xd8, 0x10, 0xa9, 0xde, - 0x30, 0xf4, 0xc7, 0x81, 0x29, 0x7c, 0x6a, 0x5d, 0x74, 0x5a, 0xe7, 0xec, 0xc7, 0x9c, 0xdb, 0xe5, - 0xce, 0x75, 0x1b, 0xca, 0x2f, 0xfd, 0x53, 0xd9, 0xa1, 0x26, 0xe3, 0xed, 0x4b, 0xff, 0x34, 0x6a, - 0x8a, 0x43, 0xf1, 0x46, 0x3a, 0x14, 0x7f, 0x03, 0xb7, 0x66, 0x63, 0x8a, 0x08, 0xc9, 0xfa, 0xf5, - 0x43, 0xf2, 0x96, 0x37, 0x6f, 0xb3, 0xfb, 0x12, 0xf2, 0xb6, 0x47, 0xeb, 0x9b, 0x0b, 0x39, 0x47, - 0xbc, 0x8e, 0x31, 0x1f, 0xdc, 0xf8, 0x04, 0xca, 0x91, 0xf7, 0x2d, 0xb2, 0xa5, 0x34, 0x1e, 0x40, - 0x2d, 0xed, 0xbb, 0x0b, 0x6d, 0x48, 0xff, 0x9c, 0x83, 0x4a, 0xec, 0xa5, 0xc8, 0x83, 0x1b, 0x42, - 0x8b, 0x3c, 0x0f, 0x32, 0x27, 0x4e, 0x2f, 0xb3, 0xaf, 0xcf, 0x33, 0x7e, 0x57, 0x2b, 0x42, 0x50, - 0x47, 0x3d, 0xb5, 0x02, 0x50, 0x8c, 0x3c, 0x99, 0xef, 0x6b, 0xd8, 0x18, 0x39, 0xde, 0xf8, 0x32, - 0x31, 0x97, 0x4c, 0x9b, 0xfe, 0x30, 0xe3, 0x5c, 0x07, 0x7c, 0xf4, 0x64, 0x8e, 0xda, 0x28, 0x45, - 0xa3, 0x3d, 0x28, 0x06, 0x7e, 0xc8, 0xa2, 0x48, 0xb0, 0x93, 0x11, 0xf5, 0xd8, 0x0f, 0xd9, 0xa1, - 0x15, 0x04, 0x3c, 0xfb, 0x97, 0x00, 0xc6, 0xb7, 0x39, 0xb8, 0x35, 0xff, 0xc3, 0x50, 0x17, 0xf2, - 0x83, 0x60, 0xac, 0x94, 0xf4, 0x60, 0x51, 0x25, 0xb5, 0x83, 0xf1, 0x44, 0x7e, 0x0e, 0x84, 0x9e, - 0x42, 0xc9, 0x25, 0xae, 0x1f, 0x5e, 0x29, 0x5d, 0x3c, 0x5c, 0x14, 0xf2, 0x50, 0x8c, 0x9e, 0xa0, - 0x2a, 0x38, 0x84, 0xa1, 0xac, 0xbc, 0x97, 0xaa, 0x7d, 0x72, 0xc1, 0xfb, 0x99, 0x08, 0x12, 0xc7, - 0x38, 0xc6, 0x27, 0x70, 0x73, 0xee, 0xa7, 0xa0, 0xdf, 0x05, 0x18, 0x04, 0x63, 0x53, 0xdc, 0x9f, - 0x4b, 0x0f, 0xca, 0xe3, 0xca, 0x20, 0x18, 0xf7, 0x04, 0xc3, 0x78, 0x0e, 0xf5, 0xd7, 0xc9, 0xcb, - 0x77, 0x1f, 0x29, 0xb1, 0xe9, 0x9e, 0x0a, 0x1d, 0xe4, 0x71, 0x59, 0x32, 0x0e, 0x4f, 0x91, 0x01, - 0xeb, 0x51, 0xa3, 0x75, 0xc9, 0x3b, 0xe4, 0x45, 0x87, 0xaa, 0xea, 0x60, 0x5d, 0x1e, 0x9e, 0x1a, - 0xbf, 0xce, 0xc1, 0xc6, 0x94, 0xc8, 0xfc, 0x0c, 0x24, 0x77, 0xbc, 0xe8, 0x74, 0x29, 0x29, 0xbe, - 0xfd, 0x0d, 0x1c, 0x3b, 0xba, 0x97, 0x14, 0xef, 0x22, 0xf0, 0x05, 0xea, 0xce, 0x30, 0xe7, 0x04, - 0x7c, 0xf9, 0xb8, 0xa7, 0x0e, 0xa3, 0xe2, 0x98, 0x54, 0xc4, 0x92, 0x40, 0xcf, 0xa0, 0x16, 0x12, - 0x11, 0x70, 0x6d, 0x53, 0x7a, 0x59, 0x71, 0x21, 0x2f, 0x53, 0x12, 0x72, 0x67, 0xc3, 0xeb, 0x11, - 0x12, 0xa7, 0x28, 0x7a, 0x0a, 0xeb, 0xf6, 0x95, 0x67, 0xb9, 0xce, 0x40, 0x21, 0x97, 0x96, 0x46, - 0x5e, 0x53, 0x40, 0x02, 0xd8, 0xb8, 0x0f, 0xd5, 0x44, 0x23, 0xff, 0x30, 0x91, 0xd3, 0x28, 0x9d, - 0x48, 0x22, 0xbd, 0x5b, 0x14, 0xd5, 0x6e, 0x61, 0x9c, 0x42, 0x35, 0xb1, 0x2e, 0x16, 0x19, 0xca, - 0xf5, 0xc9, 0x7c, 0xa1, 0xcf, 0x22, 0xce, 0x31, 0x9f, 0x1f, 0xf5, 0xcf, 0x7c, 0xca, 0x4c, 0x27, - 0x10, 0x1a, 0xad, 0xe0, 0x12, 0x27, 0xf7, 0x03, 0xe3, 0xb7, 0x39, 0xa8, 0xa5, 0x97, 0x74, 0xe4, - 0x47, 0x01, 0x09, 0x1d, 0xdf, 0x4e, 0xf8, 0xd1, 0xb1, 0x60, 0x70, 0x5f, 0xe1, 0xcd, 0xdf, 0x8c, - 0x7d, 0x66, 0x45, 0xbe, 0x32, 0x08, 0xc6, 0x7f, 0xc4, 0xe9, 0x29, 0x1f, 0xcc, 0x4f, 0xf9, 0x20, - 0xfa, 0x00, 0x90, 0x72, 0xa5, 0x91, 0xe3, 0x3a, 0xcc, 0x3c, 0xbd, 0x62, 0x44, 0xda, 0x38, 0x8f, - 0x75, 0xd9, 0x72, 0xc0, 0x1b, 0xbe, 0xe4, 0x7c, 0xee, 0x78, 0xbe, 0xef, 0x9a, 0x74, 0xe0, 0x87, - 0xc4, 0xb4, 0xec, 0x97, 0xe2, 0x68, 0x90, 0xc7, 0x55, 0xdf, 0x77, 0x7b, 0x9c, 0xd7, 0xb2, 0x5f, - 0xf2, 0xc8, 0x37, 0x08, 0xc6, 0x94, 0x30, 0x93, 0x3f, 0x44, 0xb2, 0x50, 0xc1, 0x20, 0x59, 0xed, - 0x60, 0x4c, 0xd1, 0xef, 0xc3, 0x7a, 0xd4, 0x41, 0x04, 0x3f, 0x15, 0x75, 0xd7, 0x54, 0x17, 0xc1, - 0x43, 0x06, 0xac, 0x1d, 0x93, 0x70, 0x40, 0x3c, 0xd6, 0x77, 0x06, 0xe7, 0x3c, 0xbe, 0x6b, 0xdb, - 0x1a, 0x4e, 0xf1, 0xbe, 0x2a, 0x94, 0x57, 0xf5, 0x32, 0x8e, 0x66, 0x73, 0x89, 0x4b, 0x8d, 0x9f, - 0x43, 0x51, 0xa4, 0x08, 0x5c, 0x27, 0x22, 0xbc, 0x8a, 0xe8, 0x2b, 0xcd, 0x53, 0xe6, 0x0c, 0x11, - 0x7b, 0xdf, 0x85, 0x8a, 0xd0, 0x7d, 0x22, 0x6d, 0x2e, 0x73, 0x86, 0x68, 0x6c, 0x40, 0x39, 0x24, - 0x96, 0xed, 0x7b, 0xa3, 0xe8, 0x56, 0x25, 0xa6, 0x8d, 0x6f, 0xa0, 0x24, 0xe3, 0xcc, 0x35, 0xf0, - 0x3f, 0x04, 0x24, 0xbf, 0x9b, 0xdb, 0xd3, 0x75, 0x28, 0x55, 0x59, 0xa8, 0xf8, 0x95, 0x27, 0x5b, - 0x8e, 0x27, 0x0d, 0xc6, 0x7f, 0x68, 0x32, 0x1f, 0x95, 0x3f, 0x59, 0x78, 0xe2, 0xca, 0x9d, 0x9c, - 0x1f, 0x49, 0xe5, 0x6d, 0x4e, 0x44, 0xa2, 0x7d, 0x28, 0xa9, 0xb4, 0x33, 0xb7, 0xec, 0x3f, 0x2a, - 0x05, 0x10, 0xdd, 0xed, 0x12, 0x75, 0xea, 0x5d, 0xf4, 0x6e, 0x97, 0xc8, 0xbb, 0x5d, 0xc2, 0x8f, - 0x6c, 0x2a, 0x21, 0x96, 0x70, 0x05, 0x91, 0x0f, 0x57, 0xed, 0xf8, 0x02, 0x9d, 0x18, 0xff, 0xa5, - 0xc5, 0xdb, 0x54, 0x74, 0xd1, 0x8d, 0xbe, 0x86, 0x32, 0x5f, 0xf1, 0xa6, 0x6b, 0x05, 0xea, 0xb7, - 0x6d, 0x7b, 0xb9, 0x3b, 0xf4, 0x28, 0x88, 0xc9, 0x74, 0x76, 0x35, 0x90, 0x14, 0xdf, 0xee, 0x2c, - 0x7b, 0xb2, 0xdd, 0xf1, 0x77, 0xf4, 0x3e, 0xd4, 0xac, 0x31, 0xf3, 0x4d, 0xcb, 0xbe, 0x20, 0x21, - 0x73, 0x28, 0x51, 0xb6, 0x5f, 0xe7, 0xdc, 0x56, 0xc4, 0x6c, 0x7c, 0x06, 0x6b, 0x49, 0xcc, 0x37, - 0xa5, 0x19, 0xc5, 0x64, 0x9a, 0xf1, 0xa7, 0x00, 0x93, 0x4b, 0x23, 0xee, 0x23, 0xe4, 0xd2, 0xe1, - 0x47, 0x67, 0x75, 0x40, 0x2c, 0xe2, 0x32, 0x67, 0xb4, 0xf9, 0x51, 0x28, 0x7d, 0xa3, 0x5d, 0x8c, - 0x6e, 0xb4, 0xf9, 0x62, 0xe6, 0xeb, 0xef, 0xdc, 0x19, 0x8d, 0xe2, 0x8b, 0xac, 0x8a, 0xef, 0xbb, - 0x4f, 0x04, 0xc3, 0xf8, 0x2e, 0x27, 0x7d, 0x45, 0xfe, 0x9b, 0xc8, 0x74, 0x76, 0x79, 0x5b, 0xa6, - 0xbe, 0x0f, 0x40, 0x99, 0x15, 0xf2, 0x9c, 0xc9, 0x8a, 0xae, 0xd2, 0x1a, 0x33, 0x57, 0xe2, 0xfd, - 0xa8, 0x58, 0x02, 0x57, 0x54, 0xef, 0x16, 0x43, 0x9f, 0xc3, 0xda, 0xc0, 0x77, 0x83, 0x11, 0x51, - 0x83, 0x8b, 0x6f, 0x1c, 0x5c, 0x8d, 0xfb, 0xb7, 0x58, 0xe2, 0x02, 0xaf, 0x74, 0xdd, 0x0b, 0xbc, - 0xdf, 0x6a, 0xf2, 0x17, 0x4b, 0xf2, 0x0f, 0x0f, 0x1a, 0xce, 0x29, 0x23, 0x78, 0xbc, 0xe4, 0xef, - 0xa2, 0xef, 0xab, 0x21, 0x68, 0x7c, 0x9e, 0xe5, 0xa7, 0xfd, 0xeb, 0xb3, 0xd8, 0x7f, 0xcb, 0x43, - 0x25, 0xfe, 0xbb, 0x32, 0x63, 0xfb, 0x4f, 0xa1, 0x12, 0x57, 0xaa, 0xa8, 0x0d, 0xe2, 0x7b, 0xcd, - 0x13, 0x77, 0x46, 0x2f, 0x00, 0x59, 0xc3, 0x61, 0x9c, 0x9d, 0x9a, 0x63, 0x6a, 0x0d, 0xa3, 0x7f, - 0x5b, 0x9f, 0x2e, 0xa0, 0x87, 0x28, 0x9c, 0x9d, 0xf0, 0xf1, 0x58, 0xb7, 0x86, 0xc3, 0x14, 0x07, - 0xfd, 0x19, 0xdc, 0x4c, 0xcf, 0x61, 0x9e, 0x5e, 0x99, 0x81, 0x63, 0xab, 0x33, 0xf2, 0xde, 0xa2, - 0x3f, 0x98, 0x9a, 0x29, 0xf8, 0x2f, 0xaf, 0x8e, 0x1d, 0x5b, 0xea, 0x1c, 0x85, 0x33, 0x0d, 0x8d, - 0xbf, 0x80, 0x77, 0x5e, 0xd3, 0x7d, 0x8e, 0x0d, 0xba, 0xe9, 0xc2, 0x89, 0xe5, 0x95, 0x90, 0xb0, - 0xde, 0x6f, 0x34, 0xf9, 0x1f, 0x2c, 0xad, 0x93, 0x56, 0x32, 0xad, 0xbe, 0x9b, 0x71, 0x9e, 0xf6, - 0xf1, 0x89, 0x84, 0x17, 0x99, 0xf4, 0x57, 0x53, 0x99, 0x74, 0xd6, 0xfc, 0x49, 0x26, 0xa4, 0x12, - 0x48, 0x21, 0x18, 0xff, 0x92, 0x87, 0x72, 0x84, 0x2e, 0x4e, 0xb8, 0x57, 0x94, 0x11, 0xd7, 0x8c, - 0xef, 0xb8, 0x34, 0x0c, 0x92, 0x25, 0xee, 0x73, 0xde, 0x85, 0x0a, 0x3f, 0x48, 0xcb, 0xe6, 0x9c, - 0x68, 0x2e, 0x73, 0x86, 0x68, 0x7c, 0x0f, 0xaa, 0xcc, 0x67, 0xd6, 0xc8, 0x64, 0x22, 0xbc, 0xe7, - 0xe5, 0x68, 0xc1, 0x12, 0xc1, 0x1d, 0xfd, 0x08, 0x36, 0xd9, 0x59, 0xe8, 0x33, 0x36, 0xe2, 0xa9, - 0xa5, 0x48, 0x74, 0x64, 0x5e, 0x52, 0xc0, 0x7a, 0xdc, 0x20, 0x13, 0x20, 0xca, 0x77, 0xef, 0x49, - 0x67, 0xee, 0xba, 0x62, 0x13, 0x29, 0xe0, 0xf5, 0x98, 0xcb, 0x5d, 0x9b, 0x07, 0xcf, 0x40, 0x26, - 0x10, 0x62, 0xaf, 0xd0, 0x70, 0x44, 0x22, 0x13, 0x36, 0x5c, 0x62, 0xd1, 0x71, 0x48, 0x6c, 0xf3, - 0x85, 0x43, 0x46, 0xb6, 0xbc, 0x98, 0xa8, 0x65, 0x3e, 0x1d, 0x44, 0x6a, 0x69, 0x3e, 0x12, 0xa3, - 0x71, 0x2d, 0x82, 0x93, 0x34, 0xcf, 0x1c, 0xe4, 0x1b, 0xda, 0x80, 0x6a, 0xef, 0x59, 0xaf, 0xdf, - 0x39, 0x34, 0x0f, 0x8f, 0x76, 0x3b, 0xaa, 0x36, 0xa6, 0xd7, 0xc1, 0x92, 0xd4, 0x78, 0x7b, 0xff, - 0xa8, 0xdf, 0x3a, 0x30, 0xfb, 0xfb, 0xed, 0x27, 0x3d, 0x3d, 0x87, 0x6e, 0xc2, 0x66, 0x7f, 0x0f, - 0x1f, 0xf5, 0xfb, 0x07, 0x9d, 0x5d, 0xf3, 0xb8, 0x83, 0xf7, 0x8f, 0x76, 0x7b, 0x7a, 0x1e, 0x21, - 0xa8, 0x4d, 0xd8, 0xfd, 0xfd, 0xc3, 0x8e, 0x5e, 0x40, 0x55, 0x58, 0x3d, 0xee, 0xe0, 0x76, 0xa7, - 0xdb, 0xd7, 0x8b, 0xc6, 0xaf, 0xf3, 0x50, 0x4d, 0x58, 0x91, 0x3b, 0x72, 0x48, 0xe5, 0x31, 0xa4, - 0x80, 0xf9, 0xab, 0xf8, 0x97, 0x67, 0x0d, 0xce, 0xa4, 0x75, 0x0a, 0x58, 0x12, 0xe2, 0xe8, 0x61, - 0x5d, 0x26, 0xd6, 0x79, 0x01, 0x97, 0x5d, 0xeb, 0x52, 0x82, 0xfc, 0x00, 0xd6, 0xce, 0x49, 0xe8, - 0x91, 0x91, 0x6a, 0x97, 0x16, 0xa9, 0x4a, 0x9e, 0xec, 0xb2, 0x0d, 0xba, 0xea, 0x32, 0x81, 0x91, - 0xe6, 0xa8, 0x49, 0xfe, 0x61, 0x04, 0xb6, 0x05, 0x45, 0xd9, 0xbc, 0x2a, 0xe7, 0x17, 0x04, 0x0f, - 0x53, 0xf4, 0x95, 0x15, 0x88, 0x94, 0xaf, 0x80, 0xc5, 0x3b, 0x3a, 0x9d, 0xb5, 0x4f, 0x49, 0xd8, - 0xe7, 0xfe, 0xe2, 0xee, 0xfc, 0x3a, 0x13, 0x9d, 0xc5, 0x26, 0x5a, 0x85, 0x3c, 0x8e, 0x0a, 0x4a, - 0xda, 0xad, 0xf6, 0x1e, 0x37, 0xcb, 0x3a, 0x54, 0x0e, 0x5b, 0x3f, 0x33, 0x4f, 0x7a, 0xe2, 0xea, - 0x18, 0xe9, 0xb0, 0xf6, 0xa4, 0x83, 0xbb, 0x9d, 0x03, 0xc5, 0xc9, 0xa3, 0x2d, 0xd0, 0x15, 0x67, - 0xd2, 0xaf, 0xc0, 0x11, 0xe4, 0x6b, 0x11, 0x95, 0xa1, 0xd0, 0x7b, 0xda, 0x3a, 0xd6, 0x4b, 0xc6, - 0x7f, 0xe6, 0x60, 0x43, 0x86, 0x85, 0xf8, 0xd7, 0xf7, 0xeb, 0x7f, 0xfd, 0x25, 0x6f, 0x79, 0x72, - 0xe9, 0x5b, 0x9e, 0x28, 0x09, 0x15, 0x51, 0x3d, 0x3f, 0x49, 0x42, 0xc5, 0xed, 0x50, 0x6a, 0xc7, - 0x2f, 0x2c, 0xb2, 0xe3, 0xd7, 0x61, 0xd5, 0x25, 0x34, 0xb6, 0x5b, 0x05, 0x47, 0x24, 0x72, 0xa0, - 0x6a, 0x79, 0x9e, 0xcf, 0x2c, 0x79, 0x75, 0x5a, 0x5a, 0x28, 0x18, 0x4e, 0x7d, 0x71, 0xb3, 0x35, - 0x41, 0x92, 0x1b, 0x73, 0x12, 0xbb, 0xf1, 0x53, 0xd0, 0xa7, 0x3b, 0x2c, 0x12, 0x0e, 0x7f, 0xf8, - 0xf1, 0x24, 0x1a, 0x12, 0xbe, 0x2e, 0xd4, 0xc5, 0xbe, 0xbe, 0xc2, 0x09, 0x7c, 0xd2, 0xed, 0xee, - 0x77, 0x1f, 0xeb, 0x1a, 0x02, 0x28, 0x75, 0x7e, 0xb6, 0xdf, 0xef, 0xec, 0xea, 0xb9, 0x9d, 0xdf, - 0x6c, 0x42, 0x49, 0x0a, 0x89, 0xbe, 0x55, 0x99, 0x40, 0xb2, 0xac, 0x12, 0xfd, 0x74, 0xe1, 0x8c, - 0x3a, 0x55, 0xaa, 0xd9, 0x78, 0xb8, 0xf4, 0x78, 0xf5, 0x8b, 0x6b, 0x05, 0xfd, 0x8d, 0x06, 0x6b, - 0xa9, 0xdf, 0x5b, 0x59, 0xaf, 0x8e, 0xe7, 0x54, 0x71, 0x36, 0x7e, 0xb2, 0xd4, 0xd8, 0x58, 0x96, - 0x5f, 0x69, 0x50, 0x4d, 0xd4, 0x2f, 0xa2, 0xfb, 0xcb, 0xd4, 0x3c, 0x4a, 0x49, 0x3e, 0x5b, 0xbe, - 0x5c, 0xd2, 0x58, 0xf9, 0x48, 0x43, 0x7f, 0xad, 0x41, 0x35, 0x51, 0xc9, 0x97, 0x59, 0x94, 0xd9, - 0xba, 0xc3, 0xcc, 0xa2, 0xcc, 0x2b, 0x1c, 0x5c, 0x41, 0x7f, 0xa9, 0x41, 0x25, 0xae, 0xca, 0x43, - 0xf7, 0x16, 0xaf, 0xe3, 0x93, 0x42, 0x7c, 0xba, 0x6c, 0x01, 0xa0, 0xb1, 0x82, 0xfe, 0x1c, 0xca, - 0x51, 0x09, 0x1b, 0xca, 0x1a, 0xbd, 0xa6, 0xea, 0xe3, 0x1a, 0xf7, 0x16, 0x1e, 0x97, 0x9c, 0x3e, - 0xaa, 0x2b, 0xcb, 0x3c, 0xfd, 0x54, 0x05, 0x5c, 0xe3, 0xde, 0xc2, 0xe3, 0xe2, 0xe9, 0xb9, 0x27, - 0x24, 0xca, 0xcf, 0x32, 0x7b, 0xc2, 0x6c, 0xdd, 0x5b, 0x66, 0x4f, 0x98, 0x57, 0xed, 0x26, 0x05, - 0x49, 0x14, 0xb0, 0x65, 0x16, 0x64, 0xb6, 0x48, 0x2e, 0xb3, 0x20, 0x73, 0xea, 0xe5, 0x8c, 0x15, - 0xf4, 0x4b, 0x2d, 0x79, 0x2e, 0xb8, 0xb7, 0x70, 0x9d, 0xd6, 0x82, 0x2e, 0x39, 0x53, 0x29, 0x26, - 0x16, 0xe8, 0x2f, 0xd5, 0x2d, 0x86, 0x2c, 0xf3, 0x42, 0x8b, 0x80, 0xa5, 0x2a, 0xc3, 0x1a, 0x9f, - 0x2c, 0x17, 0x6c, 0x84, 0x10, 0x7f, 0xa5, 0x01, 0x4c, 0x0a, 0xc2, 0x32, 0x0b, 0x31, 0x53, 0x89, - 0xd6, 0xb8, 0xbf, 0xc4, 0xc8, 0xe4, 0x02, 0x89, 0x0a, 0x56, 0x32, 0x2f, 0x90, 0xa9, 0x82, 0xb5, - 0xcc, 0x0b, 0x64, 0xba, 0xd8, 0xcc, 0x58, 0x41, 0xff, 0xa4, 0xc1, 0xe6, 0x4c, 0xc1, 0x0c, 0x7a, - 0x78, 0xcd, 0x9a, 0xa9, 0xc6, 0x17, 0xcb, 0x03, 0x44, 0xa2, 0x6d, 0x6b, 0x1f, 0x69, 0xe8, 0x6f, - 0x35, 0x58, 0x4f, 0x17, 0x19, 0x64, 0x8e, 0x52, 0x73, 0x4a, 0x6f, 0x1a, 0x0f, 0x96, 0x1b, 0x1c, - 0x6b, 0xeb, 0xef, 0x35, 0xa8, 0xa5, 0xeb, 0x4d, 0xd0, 0x83, 0xc5, 0xb6, 0x85, 0x29, 0x81, 0x3e, - 0x5f, 0x72, 0x74, 0x24, 0xd1, 0x97, 0xab, 0x7f, 0x5c, 0x94, 0xd9, 0x5b, 0x49, 0x3c, 0x7e, 0xfc, - 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x6e, 0xc4, 0x84, 0xf7, 0xfd, 0x32, 0x00, 0x00, + 0x76, 0x57, 0xb3, 0xf9, 0xf9, 0x48, 0x51, 0xad, 0xb2, 0x6c, 0xd3, 0xdc, 0x24, 0xe3, 0xed, 0x60, + 0x02, 0x61, 0x77, 0x86, 0x9e, 0xd1, 0x22, 0xe3, 0xf1, 0xac, 0x67, 0x3d, 0x1c, 0x8a, 0xb6, 0x34, + 0x96, 0x28, 0xa5, 0x48, 0xc1, 0xeb, 0x38, 0x3b, 0x9d, 0x16, 0xbb, 0x4c, 0xb5, 0xc5, 0xfe, 0x98, + 0xae, 0xa6, 0x2c, 0x6d, 0x10, 0x24, 0xd8, 0x00, 0xc1, 0x06, 0x48, 0x90, 0x5c, 0x26, 0x7b, 0xc9, + 0x69, 0x81, 0x9c, 0xf2, 0x0f, 0x04, 0x1b, 0xec, 0x29, 0x87, 0xfc, 0x13, 0xb9, 0xe4, 0x96, 0x63, + 0x72, 0xca, 0x35, 0xa8, 0x8f, 0x6e, 0x76, 0x93, 0xf4, 0xb8, 0x49, 0xf9, 0xc4, 0x7e, 0xf5, 0xf1, + 0xab, 0xc7, 0xf7, 0x5e, 0xbd, 0x7a, 0xf5, 0xea, 0x81, 0xee, 0x8f, 0x27, 0x23, 0xdb, 0xa5, 0xf7, + 0xac, 0xc0, 0xbe, 0x20, 0x01, 0xbd, 0xe7, 0x07, 0x5e, 0xe8, 0x49, 0xaa, 0xc5, 0x09, 0xf4, 0xfe, + 0x99, 0x49, 0xcf, 0xec, 0xa1, 0x17, 0xf8, 0x2d, 0xd7, 0x73, 0x4c, 0xab, 0x25, 0xe7, 0xb4, 0xe4, + 0x1c, 0x31, 0xac, 0xf9, 0x7b, 0x23, 0xcf, 0x1b, 0x8d, 0x89, 0x40, 0x38, 0x9d, 0xbc, 0xbc, 0x67, + 0x4d, 0x02, 0x33, 0xb4, 0x3d, 0x57, 0xf6, 0xbf, 0x37, 0xdb, 0x1f, 0xda, 0x0e, 0xa1, 0xa1, 0xe9, + 0xf8, 0x72, 0xc0, 0xfb, 0x11, 0x2f, 0xf4, 0xcc, 0x0c, 0x88, 0x75, 0xef, 0x6c, 0x38, 0xa6, 0x3e, + 0x19, 0xb2, 0x5f, 0x83, 0x7d, 0xc8, 0x61, 0x1f, 0xcc, 0x0c, 0xa3, 0x61, 0x30, 0x19, 0x86, 0x11, + 0xe7, 0x66, 0x18, 0x06, 0xf6, 0xe9, 0x24, 0x24, 0x62, 0xb4, 0x7e, 0x07, 0x6e, 0x0f, 0x4c, 0x7a, + 0xde, 0xf1, 0xdc, 0x97, 0xf6, 0xa8, 0x3f, 0x3c, 0x23, 0x8e, 0x89, 0xc9, 0x37, 0x13, 0x42, 0x43, + 0xfd, 0x4f, 0xa0, 0x31, 0xdf, 0x45, 0x7d, 0xcf, 0xa5, 0x04, 0x7d, 0x01, 0x79, 0xb6, 0x64, 0x43, + 0xb9, 0xab, 0x6c, 0x57, 0x77, 0x3e, 0x68, 0xbd, 0x49, 0x04, 0x82, 0x87, 0x96, 0x64, 0xb5, 0xd5, + 0xf7, 0xc9, 0x10, 0xf3, 0x99, 0xfa, 0x4d, 0xb8, 0xd1, 0x31, 0x7d, 0xf3, 0xd4, 0x1e, 0xdb, 0xa1, + 0x4d, 0x68, 0xb4, 0xe8, 0x04, 0xb6, 0xd2, 0xcd, 0x72, 0xc1, 0x9f, 0x41, 0x6d, 0x98, 0x68, 0x97, + 0x0b, 0x3f, 0x68, 0x65, 0x92, 0x7d, 0x6b, 0x97, 0x53, 0x29, 0xe0, 0x14, 0x9c, 0xbe, 0x05, 0xe8, + 0xb1, 0xed, 0x8e, 0x48, 0xe0, 0x07, 0xb6, 0x1b, 0x46, 0xcc, 0xfc, 0x56, 0x85, 0x1b, 0xa9, 0x66, + 0xc9, 0xcc, 0x2b, 0x80, 0x58, 0x8e, 0x8c, 0x15, 0x75, 0xbb, 0xba, 0xf3, 0x55, 0x46, 0x56, 0x16, + 0xe0, 0xb5, 0xda, 0x31, 0x58, 0xd7, 0x0d, 0x83, 0x2b, 0x9c, 0x40, 0x47, 0x5f, 0x43, 0xf1, 0x8c, + 0x98, 0xe3, 0xf0, 0xac, 0x91, 0xbb, 0xab, 0x6c, 0xd7, 0x77, 0x1e, 0x5f, 0x63, 0x9d, 0x3d, 0x0e, + 0xd4, 0x0f, 0xcd, 0x90, 0x60, 0x89, 0x8a, 0x3e, 0x04, 0x24, 0xbe, 0x0c, 0x8b, 0xd0, 0x61, 0x60, + 0xfb, 0xcc, 0x24, 0x1b, 0xea, 0x5d, 0x65, 0xbb, 0x82, 0x37, 0x45, 0xcf, 0xee, 0xb4, 0xa3, 0xe9, + 0xc3, 0xc6, 0x0c, 0xb7, 0x48, 0x03, 0xf5, 0x9c, 0x5c, 0x71, 0x8d, 0x54, 0x30, 0xfb, 0x44, 0x4f, + 0xa0, 0x70, 0x61, 0x8e, 0x27, 0x84, 0xb3, 0x5c, 0xdd, 0xf9, 0xf8, 0x6d, 0xe6, 0x21, 0x4d, 0x74, + 0x2a, 0x07, 0x2c, 0xe6, 0x7f, 0x96, 0xfb, 0x54, 0xd1, 0x1f, 0x40, 0x35, 0xc1, 0x37, 0xaa, 0x03, + 0x9c, 0xf4, 0x76, 0xbb, 0x83, 0x6e, 0x67, 0xd0, 0xdd, 0xd5, 0xd6, 0xd0, 0x3a, 0x54, 0x4e, 0x7a, + 0x7b, 0xdd, 0xf6, 0xc1, 0x60, 0xef, 0xb9, 0xa6, 0xa0, 0x2a, 0x94, 0x22, 0x22, 0xa7, 0x5f, 0x02, + 0xc2, 0x64, 0xe8, 0x5d, 0x90, 0x80, 0x19, 0xb2, 0xd4, 0x2a, 0xba, 0x0d, 0xa5, 0xd0, 0xa4, 0xe7, + 0x86, 0x6d, 0x49, 0x9e, 0x8b, 0x8c, 0xdc, 0xb7, 0xd0, 0x3e, 0x14, 0xcf, 0x4c, 0xd7, 0x1a, 0xbf, + 0x9d, 0xef, 0xb4, 0xa8, 0x19, 0xf8, 0x1e, 0x9f, 0x88, 0x25, 0x00, 0xb3, 0xee, 0xd4, 0xca, 0x42, + 0x01, 0xfa, 0x73, 0xd0, 0xfa, 0xa1, 0x19, 0x84, 0x49, 0x76, 0xba, 0x90, 0x67, 0xeb, 0x4b, 0x8b, + 0x5e, 0x66, 0x4d, 0xb1, 0x33, 0x31, 0x9f, 0xae, 0xff, 0x6f, 0x0e, 0x36, 0x13, 0xd8, 0xd2, 0x52, + 0x9f, 0x41, 0x31, 0x20, 0x74, 0x32, 0x0e, 0x39, 0x7c, 0x7d, 0xe7, 0x51, 0x46, 0xf8, 0x39, 0xa4, + 0x16, 0xe6, 0x30, 0x58, 0xc2, 0xa1, 0x6d, 0xd0, 0xc4, 0x0c, 0x83, 0x04, 0x81, 0x17, 0x18, 0x0e, + 0x1d, 0x71, 0xa9, 0x55, 0x70, 0x5d, 0xb4, 0x77, 0x59, 0xf3, 0x21, 0x1d, 0x25, 0xa4, 0xaa, 0x5e, + 0x53, 0xaa, 0xc8, 0x04, 0xcd, 0x25, 0xe1, 0x6b, 0x2f, 0x38, 0x37, 0x98, 0x68, 0x03, 0xdb, 0x22, + 0x8d, 0x3c, 0x07, 0xfd, 0x24, 0x23, 0x68, 0x4f, 0x4c, 0x3f, 0x92, 0xb3, 0xf1, 0x86, 0x9b, 0x6e, + 0xd0, 0x7f, 0x08, 0x45, 0xf1, 0x4f, 0x99, 0x25, 0xf5, 0x4f, 0x3a, 0x9d, 0x6e, 0xbf, 0xaf, 0xad, + 0xa1, 0x0a, 0x14, 0x70, 0x77, 0x80, 0x99, 0x85, 0x55, 0xa0, 0xf0, 0xb8, 0x3d, 0x68, 0x1f, 0x68, + 0x39, 0xfd, 0x07, 0xb0, 0xf1, 0xcc, 0xb4, 0xc3, 0x2c, 0xc6, 0xa5, 0x7b, 0xa0, 0x4d, 0xc7, 0x4a, + 0xed, 0xec, 0xa7, 0xb4, 0x93, 0x5d, 0x34, 0xdd, 0x4b, 0x3b, 0x9c, 0xd1, 0x87, 0x06, 0x2a, 0x09, + 0x02, 0xa9, 0x02, 0xf6, 0xa9, 0xbf, 0x86, 0x8d, 0x7e, 0xe8, 0xf9, 0x99, 0x2c, 0xff, 0x47, 0x50, + 0x62, 0xa7, 0x8d, 0x37, 0x09, 0xa5, 0xe9, 0xdf, 0x69, 0x89, 0xd3, 0xa8, 0x15, 0x9d, 0x46, 0xad, + 0x5d, 0x79, 0x5a, 0xe1, 0x68, 0x24, 0xba, 0x05, 0x45, 0x6a, 0x8f, 0x5c, 0x73, 0x2c, 0xbd, 0x85, + 0xa4, 0x74, 0xc4, 0x8c, 0x3c, 0x5a, 0x58, 0x1a, 0x7e, 0x07, 0xd0, 0x2e, 0xa1, 0x61, 0xe0, 0x5d, + 0x65, 0xe2, 0x67, 0x0b, 0x0a, 0x2f, 0xbd, 0x60, 0x28, 0x36, 0x62, 0x19, 0x0b, 0x82, 0x6d, 0xaa, + 0x14, 0x88, 0xc4, 0xfe, 0x10, 0xd0, 0xbe, 0xcb, 0xce, 0x94, 0x6c, 0x8a, 0xf8, 0x87, 0x1c, 0xdc, + 0x48, 0x8d, 0x97, 0xca, 0x58, 0x7d, 0x1f, 0x32, 0xc7, 0x34, 0xa1, 0x62, 0x1f, 0xa2, 0x23, 0x28, + 0x8a, 0x11, 0x52, 0x92, 0xf7, 0x97, 0x00, 0x12, 0xc7, 0x94, 0x84, 0x93, 0x30, 0x0b, 0x8d, 0x5e, + 0x7d, 0xb7, 0x46, 0xff, 0x1a, 0xb4, 0xe8, 0x7f, 0xd0, 0xb7, 0xea, 0xe6, 0x2b, 0xb8, 0x31, 0xf4, + 0xc6, 0x63, 0x32, 0x64, 0xd6, 0x60, 0xd8, 0x6e, 0x48, 0x82, 0x0b, 0x73, 0xfc, 0x76, 0xbb, 0x41, + 0xd3, 0x59, 0xfb, 0x72, 0x92, 0xfe, 0x02, 0x36, 0x13, 0x0b, 0x4b, 0x45, 0x3c, 0x86, 0x02, 0x65, + 0x0d, 0x52, 0x13, 0x1f, 0x2d, 0xa9, 0x09, 0x8a, 0xc5, 0x74, 0xfd, 0x86, 0x00, 0xef, 0x5e, 0x10, + 0x37, 0xfe, 0x5b, 0xfa, 0x2e, 0x6c, 0xf6, 0xb9, 0x99, 0x66, 0xb2, 0xc3, 0xa9, 0x89, 0xe7, 0x52, + 0x26, 0xbe, 0x05, 0x28, 0x89, 0x22, 0x0d, 0xf1, 0x0a, 0x36, 0xba, 0x97, 0x64, 0x98, 0x09, 0xb9, + 0x01, 0xa5, 0xa1, 0xe7, 0x38, 0xa6, 0x6b, 0x35, 0x72, 0x77, 0xd5, 0xed, 0x0a, 0x8e, 0xc8, 0xe4, + 0x5e, 0x54, 0xb3, 0xee, 0x45, 0xfd, 0xef, 0x14, 0xd0, 0xa6, 0x6b, 0x4b, 0x41, 0x32, 0xee, 0x43, + 0x8b, 0x01, 0xb1, 0xb5, 0x6b, 0x58, 0x52, 0xb2, 0x3d, 0x72, 0x17, 0xa2, 0x9d, 0x04, 0x41, 0xc2, + 0x1d, 0xa9, 0xd7, 0x74, 0x47, 0xfa, 0x1e, 0xfc, 0x4e, 0xc4, 0x4e, 0x3f, 0x0c, 0x88, 0xe9, 0xd8, + 0xee, 0x68, 0xff, 0xe8, 0xc8, 0x27, 0x82, 0x71, 0x84, 0x20, 0x6f, 0x99, 0xa1, 0x29, 0x19, 0xe3, + 0xdf, 0x6c, 0xd3, 0x0f, 0xc7, 0x1e, 0x8d, 0x37, 0x3d, 0x27, 0xf4, 0xff, 0x50, 0xa1, 0x31, 0x07, + 0x15, 0x89, 0xf7, 0x05, 0x14, 0x28, 0x09, 0x27, 0xbe, 0x34, 0x95, 0x6e, 0x66, 0x86, 0x17, 0xe3, + 0xb5, 0xfa, 0x0c, 0x0c, 0x0b, 0x4c, 0x34, 0x82, 0x72, 0x18, 0x5e, 0x19, 0xd4, 0xfe, 0x79, 0x14, + 0x10, 0x1c, 0x5c, 0x17, 0x7f, 0x40, 0x02, 0xc7, 0x76, 0xcd, 0x71, 0xdf, 0xfe, 0x39, 0xc1, 0xa5, + 0x30, 0xbc, 0x62, 0x1f, 0xe8, 0x39, 0x33, 0x78, 0xcb, 0x76, 0xa5, 0xd8, 0x3b, 0xab, 0xae, 0x92, + 0x10, 0x30, 0x16, 0x88, 0xcd, 0x03, 0x28, 0xf0, 0xff, 0xb4, 0x8a, 0x21, 0x6a, 0xa0, 0x86, 0xe1, + 0x15, 0x67, 0xaa, 0x8c, 0xd9, 0x67, 0xf3, 0x21, 0xd4, 0x92, 0xff, 0x80, 0x19, 0xd2, 0x19, 0xb1, + 0x47, 0x67, 0xc2, 0xc0, 0x0a, 0x58, 0x52, 0x4c, 0x93, 0xaf, 0x6d, 0x4b, 0x86, 0xac, 0x05, 0x2c, + 0x08, 0xfd, 0x5f, 0x73, 0x70, 0x67, 0x81, 0x64, 0xa4, 0xb1, 0xbe, 0x48, 0x19, 0xeb, 0x3b, 0x92, + 0x42, 0x64, 0xf1, 0x2f, 0x52, 0x16, 0xff, 0x0e, 0xc1, 0xd9, 0xb6, 0xb9, 0x05, 0x45, 0x72, 0x69, + 0x87, 0xc4, 0x92, 0xa2, 0x92, 0x54, 0x62, 0x3b, 0xe5, 0xaf, 0xbb, 0x9d, 0x3e, 0x86, 0xad, 0x4e, + 0x40, 0xcc, 0x90, 0x48, 0x57, 0x1e, 0xd9, 0xff, 0x1d, 0x28, 0x9b, 0xe3, 0xb1, 0x37, 0x9c, 0xaa, + 0xb5, 0xc4, 0xe9, 0x7d, 0x4b, 0xff, 0x56, 0x81, 0x9b, 0x33, 0x73, 0xa4, 0xa4, 0x4f, 0xa1, 0x6e, + 0x53, 0x6f, 0xcc, 0xff, 0x84, 0x91, 0xb8, 0xc5, 0xfd, 0x78, 0xb9, 0xe3, 0x64, 0x3f, 0xc2, 0xe0, + 0x97, 0xba, 0x75, 0x3b, 0x49, 0x72, 0xab, 0xe2, 0x8b, 0x5b, 0x72, 0x37, 0x47, 0xa4, 0xfe, 0x8f, + 0x0a, 0xdc, 0x94, 0xa7, 0x78, 0xe6, 0x3f, 0xb3, 0x80, 0xe5, 0xdc, 0xbb, 0x66, 0x59, 0x6f, 0xc0, + 0xad, 0x59, 0xbe, 0xa4, 0x5f, 0xff, 0xbf, 0x3c, 0xa0, 0xf9, 0x1b, 0x24, 0xfa, 0x3e, 0xd4, 0x28, + 0x71, 0x2d, 0x43, 0x9c, 0x09, 0xe2, 0xb8, 0x2a, 0xe3, 0x2a, 0x6b, 0x13, 0x87, 0x03, 0x65, 0x6e, + 0x8e, 0x5c, 0x4a, 0x6e, 0xcb, 0x98, 0x7f, 0xa3, 0x33, 0xa8, 0xbd, 0xa4, 0x46, 0xbc, 0x36, 0x37, + 0x9a, 0x7a, 0x66, 0xd7, 0x35, 0xcf, 0x47, 0xeb, 0x71, 0x3f, 0xfe, 0x5f, 0xb8, 0xfa, 0x92, 0xc6, + 0x04, 0xfa, 0xa5, 0x02, 0xb7, 0xa3, 0xd0, 0x61, 0x2a, 0x3e, 0xc7, 0xb3, 0x08, 0x6d, 0xe4, 0xef, + 0xaa, 0xdb, 0xf5, 0x9d, 0xe3, 0x6b, 0xc8, 0x6f, 0xae, 0xf1, 0xd0, 0xb3, 0x08, 0xbe, 0xe9, 0x2e, + 0x68, 0xa5, 0xa8, 0x05, 0x37, 0x9c, 0x09, 0x0d, 0x0d, 0x61, 0x05, 0x86, 0x1c, 0xd4, 0x28, 0x70, + 0xb9, 0x6c, 0xb2, 0xae, 0x94, 0xad, 0xa2, 0x73, 0x58, 0x77, 0xbc, 0x89, 0x1b, 0x1a, 0x43, 0x7e, + 0xc7, 0xa1, 0x8d, 0xe2, 0x52, 0x97, 0xdf, 0x05, 0x52, 0x3a, 0x64, 0x70, 0xe2, 0xc6, 0x44, 0x71, + 0xcd, 0x49, 0x50, 0x4c, 0x91, 0x01, 0x71, 0xbc, 0x90, 0x18, 0xcc, 0x27, 0xd2, 0x46, 0x49, 0x28, + 0x52, 0xb4, 0xb1, 0xed, 0x4f, 0xf5, 0x16, 0x54, 0x13, 0x62, 0x46, 0x65, 0xc8, 0xf7, 0x8e, 0x7a, + 0x5d, 0x6d, 0x0d, 0x01, 0x14, 0x3b, 0x7b, 0xf8, 0xe8, 0x68, 0x20, 0x6e, 0x06, 0xfb, 0x87, 0xed, + 0x27, 0x5d, 0x2d, 0xa7, 0x77, 0xa1, 0x96, 0x5c, 0x10, 0x21, 0xa8, 0x9f, 0xf4, 0x9e, 0xf6, 0x8e, + 0x9e, 0xf5, 0x8c, 0xc3, 0xa3, 0x93, 0xde, 0x80, 0xdd, 0x29, 0xea, 0x00, 0xed, 0xde, 0xf3, 0x29, + 0xbd, 0x0e, 0x95, 0xde, 0x51, 0x44, 0x2a, 0xcd, 0x9c, 0xa6, 0xe8, 0xff, 0xae, 0xc2, 0xd6, 0x22, + 0xd9, 0x23, 0x0b, 0xf2, 0x4c, 0x8f, 0xf2, 0x56, 0xf7, 0xee, 0xd5, 0xc8, 0xd1, 0x99, 0xf9, 0xfa, + 0xa6, 0x74, 0xe3, 0x15, 0xcc, 0xbf, 0x91, 0x01, 0xc5, 0xb1, 0x79, 0x4a, 0xc6, 0xb4, 0xa1, 0xf2, + 0xbc, 0xc7, 0x93, 0xeb, 0xac, 0x7d, 0xc0, 0x91, 0x44, 0xd2, 0x43, 0xc2, 0xa2, 0x01, 0x54, 0xcf, + 0x3c, 0x1a, 0x52, 0x21, 0x3a, 0xe9, 0x3b, 0x77, 0x32, 0xae, 0xb2, 0x37, 0x9d, 0x89, 0x93, 0x30, + 0xcd, 0x07, 0x50, 0x4d, 0x2c, 0xb6, 0x20, 0x67, 0xb1, 0x95, 0xcc, 0x59, 0x54, 0x92, 0x09, 0x88, + 0x47, 0xf3, 0x3a, 0x60, 0x32, 0x62, 0x46, 0xb0, 0x77, 0xd4, 0x1f, 0x88, 0xdb, 0xe1, 0x13, 0x7c, + 0x74, 0x72, 0xac, 0x29, 0xac, 0x71, 0xd0, 0xee, 0x3f, 0xd5, 0x72, 0xb1, 0x8d, 0xa8, 0x7a, 0x07, + 0xaa, 0x09, 0xbe, 0x50, 0x13, 0xca, 0x8c, 0x33, 0xd7, 0x74, 0x88, 0x64, 0x20, 0xa6, 0x99, 0xdf, + 0x34, 0x2d, 0x2b, 0x20, 0x94, 0x4a, 0x3e, 0x22, 0x52, 0x7f, 0x01, 0x95, 0xdd, 0x5e, 0x5f, 0x42, + 0x34, 0xa0, 0x44, 0x49, 0xc0, 0xfe, 0x37, 0xcf, 0x3e, 0x55, 0x70, 0x44, 0x32, 0x70, 0x4a, 0xcc, + 0x60, 0x78, 0x46, 0xa8, 0x3c, 0xcf, 0x63, 0x9a, 0xcd, 0xf2, 0x78, 0x16, 0x47, 0xe8, 0xae, 0x82, + 0x23, 0x52, 0xff, 0x9f, 0x12, 0xc0, 0x34, 0xa3, 0x80, 0xea, 0x90, 0x8b, 0x7d, 0x70, 0xce, 0xb6, + 0x98, 0x1d, 0x70, 0x6e, 0xa5, 0x1d, 0x70, 0x4e, 0x77, 0xe0, 0xa6, 0x43, 0x47, 0xbe, 0x39, 0x3c, + 0x37, 0x64, 0x22, 0x40, 0x6c, 0x55, 0xee, 0xcf, 0x6a, 0xf8, 0x86, 0xec, 0x94, 0x3b, 0x51, 0xe0, + 0x1e, 0x80, 0x4a, 0xdc, 0x0b, 0xee, 0x7b, 0xaa, 0x3b, 0x9f, 0x2d, 0x9d, 0xe9, 0x68, 0x75, 0xdd, + 0x0b, 0x61, 0x2b, 0x0c, 0x06, 0x19, 0x00, 0x16, 0xb9, 0xb0, 0x87, 0xc4, 0x60, 0xa0, 0x05, 0x0e, + 0xfa, 0xc5, 0xf2, 0xa0, 0xbb, 0x1c, 0x23, 0x86, 0xae, 0x58, 0x11, 0x8d, 0x7a, 0x50, 0x09, 0x08, + 0xf5, 0x26, 0xc1, 0x90, 0x08, 0x07, 0x94, 0xfd, 0x32, 0x82, 0xa3, 0x79, 0x78, 0x0a, 0x81, 0x76, + 0xa1, 0xc8, 0xfd, 0x0e, 0xf3, 0x30, 0xea, 0x77, 0xa6, 0x4d, 0xd3, 0x60, 0xdc, 0x93, 0x60, 0x39, + 0x17, 0x3d, 0x81, 0x92, 0x60, 0x91, 0x36, 0xca, 0x1c, 0xe6, 0xc3, 0xac, 0x4e, 0x91, 0xcf, 0xc2, + 0xd1, 0x6c, 0xa6, 0xd5, 0x09, 0x25, 0x41, 0xa3, 0x22, 0xb4, 0xca, 0xbe, 0xd1, 0xf7, 0xa0, 0x22, + 0xce, 0x60, 0xcb, 0x0e, 0x1a, 0x20, 0x8c, 0x93, 0x37, 0xec, 0xda, 0x01, 0x7a, 0x0f, 0xaa, 0x22, + 0x9e, 0x32, 0xb8, 0x57, 0xa8, 0xf2, 0x6e, 0x10, 0x4d, 0xc7, 0xcc, 0x37, 0x88, 0x01, 0x24, 0x08, + 0xc4, 0x80, 0x5a, 0x3c, 0x80, 0x04, 0x01, 0x1f, 0xf0, 0x07, 0xb0, 0xc1, 0xa3, 0xd0, 0x51, 0xe0, + 0x4d, 0x7c, 0x83, 0xdb, 0xd4, 0x3a, 0x1f, 0xb4, 0xce, 0x9a, 0x9f, 0xb0, 0xd6, 0x1e, 0x33, 0xae, + 0x3b, 0x50, 0x7e, 0xe5, 0x9d, 0x8a, 0x01, 0x75, 0xb1, 0x0f, 0x5e, 0x79, 0xa7, 0x51, 0x57, 0x1c, + 0x25, 0x6c, 0xa4, 0xa3, 0x84, 0x6f, 0xe0, 0xd6, 0xfc, 0x71, 0xc7, 0xa3, 0x05, 0xed, 0xfa, 0xd1, + 0xc2, 0x96, 0xbb, 0xc8, 0x0f, 0x7f, 0x09, 0xaa, 0xe5, 0xd2, 0xc6, 0xe6, 0x52, 0xc6, 0x11, 0xef, + 0x63, 0xcc, 0x26, 0x37, 0x3f, 0x81, 0x72, 0x64, 0x7d, 0xcb, 0xf8, 0xa5, 0xe6, 0x43, 0xa8, 0xa7, + 0x6d, 0x77, 0x29, 0xaf, 0xf6, 0xcf, 0x39, 0xa8, 0xc4, 0x56, 0x8a, 0x5c, 0xb8, 0xc1, 0xa5, 0xc8, + 0x42, 0x34, 0x63, 0x6a, 0xf4, 0x22, 0x30, 0xfc, 0x3c, 0xe3, 0xff, 0x6a, 0x47, 0x08, 0xf2, 0x16, + 0x2a, 0x77, 0x00, 0x8a, 0x91, 0xa7, 0xeb, 0x7d, 0x0d, 0x1b, 0x63, 0xdb, 0x9d, 0x5c, 0x26, 0xd6, + 0x12, 0x11, 0xdd, 0x1f, 0x66, 0x5c, 0xeb, 0x80, 0xcd, 0x9e, 0xae, 0x51, 0x1f, 0xa7, 0x68, 0xb4, + 0x07, 0x05, 0xdf, 0x0b, 0xc2, 0xe8, 0x90, 0xca, 0x7a, 0x7c, 0x1c, 0x7b, 0x41, 0x78, 0x68, 0xfa, + 0x3e, 0xbb, 0x98, 0x08, 0x00, 0xfd, 0xdb, 0x1c, 0xdc, 0x5a, 0xfc, 0xc7, 0x50, 0x0f, 0xd4, 0xa1, + 0x3f, 0x91, 0x42, 0x7a, 0xb8, 0xac, 0x90, 0x3a, 0xfe, 0x64, 0xca, 0x3f, 0x03, 0x42, 0xcf, 0xa0, + 0xe8, 0x10, 0xc7, 0x0b, 0xae, 0xa4, 0x2c, 0x1e, 0x2d, 0x0b, 0x79, 0xc8, 0x67, 0x4f, 0x51, 0x25, + 0x1c, 0xc2, 0x50, 0x96, 0xd6, 0x4b, 0xa5, 0x9f, 0x5c, 0x32, 0x75, 0x14, 0x41, 0xe2, 0x18, 0x47, + 0xff, 0x04, 0x6e, 0x2e, 0xfc, 0x2b, 0xe8, 0x77, 0x01, 0x86, 0xfe, 0xc4, 0xe0, 0xa9, 0x7d, 0x61, + 0x41, 0x2a, 0xae, 0x0c, 0xfd, 0x49, 0x9f, 0x37, 0xe8, 0x2f, 0xa0, 0xf1, 0x26, 0x7e, 0x99, 0xf7, + 0x11, 0x1c, 0x1b, 0xce, 0x29, 0x97, 0x81, 0x8a, 0xcb, 0xa2, 0xe1, 0xf0, 0x14, 0xe9, 0xb0, 0x1e, + 0x75, 0x9a, 0x97, 0x6c, 0x80, 0xca, 0x07, 0x54, 0xe5, 0x00, 0xf3, 0xf2, 0xf0, 0x54, 0xff, 0x55, + 0x0e, 0x36, 0x66, 0x58, 0x66, 0xd7, 0x33, 0xe1, 0xf1, 0xa2, 0x8b, 0xaf, 0xa0, 0x98, 0xfb, 0x1b, + 0xda, 0x56, 0x94, 0x32, 0xe5, 0xdf, 0xfc, 0xe0, 0xf3, 0x65, 0x3a, 0x33, 0x67, 0xfb, 0x6c, 0xfb, + 0x38, 0xa7, 0x76, 0x48, 0x79, 0x14, 0x52, 0xc0, 0x82, 0x40, 0xcf, 0xa1, 0x1e, 0x10, 0x7e, 0xe0, + 0x5a, 0x86, 0xb0, 0xb2, 0xc2, 0x52, 0x56, 0x26, 0x39, 0x64, 0xc6, 0x86, 0xd7, 0x23, 0x24, 0x46, + 0x51, 0xf4, 0x0c, 0xd6, 0xad, 0x2b, 0xd7, 0x74, 0xec, 0xa1, 0x44, 0x2e, 0xae, 0x8c, 0x5c, 0x93, + 0x40, 0x1c, 0x58, 0x7f, 0x00, 0xd5, 0x44, 0x27, 0xfb, 0x63, 0x3c, 0xdc, 0x92, 0x32, 0x11, 0x44, + 0xda, 0x5b, 0x14, 0xa4, 0xb7, 0xd0, 0x4f, 0xa1, 0x9a, 0xd8, 0x17, 0xcb, 0x4c, 0x65, 0xf2, 0x0c, + 0x3d, 0x2e, 0xcf, 0x02, 0xce, 0x85, 0x1e, 0xba, 0x0d, 0x25, 0x16, 0xea, 0x18, 0xb6, 0xcf, 0x25, + 0x5a, 0xc1, 0x45, 0x46, 0xee, 0xfb, 0xfa, 0x6f, 0x72, 0x50, 0x4f, 0x6f, 0xe9, 0xc8, 0x8e, 0x7c, + 0x12, 0xd8, 0x9e, 0x95, 0xb0, 0xa3, 0x63, 0xde, 0xc0, 0x6c, 0x85, 0x75, 0x7f, 0x33, 0xf1, 0x42, + 0x33, 0xb2, 0x95, 0xa1, 0x3f, 0xf9, 0x23, 0x46, 0xcf, 0xd8, 0xa0, 0x3a, 0x63, 0x83, 0xe8, 0x03, + 0x40, 0xd2, 0x94, 0xc6, 0xb6, 0x63, 0x87, 0xc6, 0xe9, 0x55, 0x48, 0x84, 0x8e, 0x55, 0xac, 0x89, + 0x9e, 0x03, 0xd6, 0xf1, 0x25, 0x6b, 0x67, 0x86, 0xe7, 0x79, 0x8e, 0x41, 0x87, 0x5e, 0x40, 0x0c, + 0xd3, 0x7a, 0xc5, 0x6f, 0x2d, 0x2a, 0xae, 0x7a, 0x9e, 0xd3, 0x67, 0x6d, 0x6d, 0xeb, 0x15, 0x3b, + 0xf9, 0x86, 0xfe, 0x84, 0x92, 0xd0, 0x60, 0x3f, 0x3c, 0x58, 0xa8, 0x60, 0x10, 0x4d, 0x1d, 0x7f, + 0x42, 0xd1, 0xef, 0xc3, 0x7a, 0x34, 0x80, 0x1f, 0x7e, 0xf2, 0xd4, 0xad, 0xc9, 0x21, 0xbc, 0x0d, + 0xe9, 0x50, 0x3b, 0x26, 0xc1, 0x90, 0xb8, 0xe1, 0xc0, 0x1e, 0x9e, 0xb3, 0xf3, 0x5d, 0xd9, 0x56, + 0x70, 0xaa, 0xed, 0xab, 0x7c, 0xb9, 0xa4, 0x95, 0x71, 0xb4, 0x9a, 0x43, 0x1c, 0xaa, 0xff, 0x0c, + 0x0a, 0x3c, 0x44, 0x60, 0x32, 0xe1, 0xc7, 0x2b, 0x3f, 0x7d, 0x65, 0x68, 0xc9, 0x1a, 0xf8, 0xd9, + 0xfb, 0x3d, 0xa8, 0x70, 0xd9, 0x27, 0x22, 0x7a, 0x1e, 0x77, 0xf2, 0xce, 0x26, 0x94, 0x03, 0x62, + 0x5a, 0x9e, 0x3b, 0x8e, 0x12, 0x3e, 0x31, 0xad, 0x7f, 0x03, 0x45, 0x71, 0xce, 0x5c, 0x03, 0xff, + 0x43, 0x40, 0xe2, 0x7f, 0x33, 0x7d, 0x3a, 0x36, 0xa5, 0x32, 0x0a, 0xe5, 0xaf, 0x8c, 0xa2, 0xe7, + 0x78, 0xda, 0xa1, 0xff, 0xa7, 0x22, 0xe2, 0x51, 0xf1, 0xfe, 0xc3, 0x02, 0x57, 0x66, 0xe4, 0xec, + 0xb6, 0x2c, 0x12, 0x4d, 0x11, 0x89, 0xf6, 0xa1, 0x28, 0xc3, 0xce, 0xdc, 0xaa, 0xcf, 0x67, 0x12, + 0x20, 0x4a, 0x3b, 0x13, 0x79, 0x21, 0x5f, 0x36, 0xed, 0x4c, 0x44, 0xda, 0x99, 0xb0, 0xdb, 0xa4, + 0x0c, 0x88, 0x05, 0x5c, 0x9e, 0xc7, 0xc3, 0x55, 0x2b, 0xce, 0xed, 0x13, 0xfd, 0xbf, 0x95, 0xd8, + 0x4d, 0x45, 0x39, 0x78, 0xf4, 0x35, 0x94, 0xd9, 0x8e, 0x37, 0x1c, 0xd3, 0x97, 0x2f, 0xca, 0x9d, + 0xd5, 0xd2, 0xfb, 0xd1, 0x21, 0x26, 0xc2, 0xd9, 0x92, 0x2f, 0x28, 0xe6, 0xee, 0xd8, 0x55, 0x22, + 0x72, 0x77, 0xec, 0x1b, 0xbd, 0x0f, 0x75, 0x73, 0x12, 0x7a, 0x86, 0x69, 0x5d, 0x90, 0x20, 0xb4, + 0x29, 0x91, 0xba, 0x5f, 0x67, 0xad, 0xed, 0xa8, 0xb1, 0xf9, 0x19, 0xd4, 0x92, 0x98, 0x6f, 0x0b, + 0x33, 0x0a, 0xc9, 0x30, 0xe3, 0x4f, 0x01, 0xa6, 0xf9, 0x2c, 0x66, 0x23, 0xe4, 0xd2, 0x66, 0xb7, + 0x7a, 0x79, 0x77, 0x2d, 0xe0, 0x32, 0x6b, 0xe8, 0xb0, 0xfb, 0x54, 0x3a, 0xd9, 0x5e, 0x88, 0x92, + 0xed, 0x6c, 0x33, 0xb3, 0xfd, 0x77, 0x6e, 0x8f, 0xc7, 0x71, 0x8e, 0xad, 0xe2, 0x79, 0xce, 0x53, + 0xde, 0xa0, 0xff, 0x36, 0x27, 0x6c, 0x45, 0x3c, 0x9b, 0x64, 0xba, 0xbb, 0xbc, 0x2b, 0x55, 0x3f, + 0x00, 0xa0, 0xa1, 0x19, 0xb0, 0x98, 0xc9, 0x8c, 0xb2, 0x7c, 0xcd, 0xb9, 0x6c, 0xfd, 0x20, 0xaa, + 0xe3, 0xc0, 0x15, 0x39, 0xba, 0x1d, 0xa2, 0xcf, 0xa1, 0x36, 0xf4, 0x1c, 0x7f, 0x4c, 0xe4, 0xe4, + 0xc2, 0x5b, 0x27, 0x57, 0xe3, 0xf1, 0xed, 0x30, 0x91, 0x5b, 0x2c, 0x5e, 0x37, 0xb7, 0xf8, 0x1b, + 0x45, 0xbc, 0xfe, 0x24, 0x1f, 0x9f, 0xd0, 0x68, 0x41, 0x85, 0xc3, 0x93, 0x15, 0x5f, 0xb2, 0xbe, + 0xab, 0xbc, 0xa1, 0xf9, 0x79, 0x96, 0x7a, 0x82, 0x37, 0x47, 0xb1, 0xff, 0xa6, 0x42, 0x25, 0x7e, + 0xf8, 0x99, 0xd3, 0xfd, 0xa7, 0x50, 0x89, 0x8b, 0x68, 0xa4, 0x83, 0xf8, 0x4e, 0xf5, 0xc4, 0x83, + 0xd1, 0x4b, 0x40, 0xe6, 0x68, 0x14, 0x47, 0xa7, 0xc6, 0x84, 0x9a, 0xa3, 0xe8, 0xd9, 0xed, 0xd3, + 0x25, 0xe4, 0x10, 0x1d, 0x67, 0x27, 0x6c, 0x3e, 0xd6, 0xcc, 0xd1, 0x28, 0xd5, 0x82, 0xfe, 0x0c, + 0x6e, 0xa6, 0xd7, 0x30, 0x4e, 0xaf, 0x0c, 0xdf, 0xb6, 0xe4, 0x1d, 0x79, 0x6f, 0xd9, 0xb7, 0xaf, + 0x56, 0x0a, 0xfe, 0xcb, 0xab, 0x63, 0xdb, 0x12, 0x32, 0x47, 0xc1, 0x5c, 0x47, 0xf3, 0x2f, 0xe0, + 0xf6, 0x1b, 0x86, 0x2f, 0xd0, 0x41, 0x2f, 0x5d, 0xd3, 0xb1, 0xba, 0x10, 0x12, 0xda, 0xfb, 0xb5, + 0x22, 0x9e, 0xe8, 0xd2, 0x32, 0x69, 0x27, 0xc3, 0xea, 0x7b, 0x19, 0xd7, 0xe9, 0x1c, 0x9f, 0x08, + 0x78, 0x1e, 0x49, 0x7f, 0x35, 0x13, 0x49, 0x67, 0x8d, 0x9f, 0x44, 0x40, 0x2a, 0x80, 0x24, 0x82, + 0xfe, 0x2f, 0x2a, 0x94, 0x23, 0x74, 0x7e, 0xc3, 0xbd, 0xa2, 0x21, 0x71, 0x8c, 0x38, 0xfd, 0xa6, + 0x60, 0x10, 0x4d, 0x3c, 0x29, 0xf4, 0x3d, 0xa8, 0xb0, 0x8b, 0xb4, 0xe8, 0xce, 0xf1, 0xee, 0x32, + 0x6b, 0xe0, 0x9d, 0xef, 0x41, 0x35, 0xf4, 0x42, 0x73, 0x6c, 0x84, 0xfc, 0x78, 0x57, 0xc5, 0x6c, + 0xde, 0xc4, 0x0f, 0x77, 0xf4, 0x43, 0xd8, 0x0c, 0xcf, 0x02, 0x2f, 0x0c, 0xc7, 0x2c, 0xb4, 0xe4, + 0x81, 0x8e, 0x88, 0x4b, 0xf2, 0x58, 0x8b, 0x3b, 0x44, 0x00, 0x44, 0x99, 0xf7, 0x9e, 0x0e, 0x66, + 0xa6, 0xcb, 0x9d, 0x48, 0x1e, 0xaf, 0xc7, 0xad, 0xcc, 0xb4, 0xd9, 0xe1, 0xe9, 0x8b, 0x00, 0x82, + 0xfb, 0x0a, 0x05, 0x47, 0x24, 0x32, 0x60, 0xc3, 0x21, 0x26, 0x9d, 0x04, 0xc4, 0x32, 0x5e, 0xda, + 0x64, 0x6c, 0x89, 0xc4, 0x44, 0x3d, 0xf3, 0xed, 0x20, 0x12, 0x4b, 0xeb, 0x31, 0x9f, 0x8d, 0xeb, + 0x11, 0x9c, 0xa0, 0x59, 0xe4, 0x20, 0xbe, 0xd0, 0x06, 0x54, 0xfb, 0xcf, 0xfb, 0x83, 0xee, 0xa1, + 0x71, 0x78, 0xb4, 0xdb, 0x95, 0x65, 0x3b, 0xfd, 0x2e, 0x16, 0xa4, 0xc2, 0xfa, 0x07, 0x47, 0x83, + 0xf6, 0x81, 0x31, 0xd8, 0xef, 0x3c, 0xed, 0x6b, 0x39, 0x74, 0x13, 0x36, 0x07, 0x7b, 0xf8, 0x68, + 0x30, 0x38, 0xe8, 0xee, 0x1a, 0xc7, 0x5d, 0xbc, 0x7f, 0xb4, 0xdb, 0xd7, 0x54, 0x84, 0xa0, 0x3e, + 0x6d, 0x1e, 0xec, 0x1f, 0x76, 0xb5, 0x3c, 0xaa, 0x42, 0xe9, 0xb8, 0x8b, 0x3b, 0xdd, 0xde, 0x40, + 0x2b, 0xe8, 0xbf, 0x52, 0xa1, 0x9a, 0xd0, 0x22, 0x33, 0xe4, 0x80, 0x8a, 0x6b, 0x48, 0x1e, 0xb3, + 0x4f, 0xfe, 0xcc, 0x68, 0x0e, 0xcf, 0x84, 0x76, 0xf2, 0x58, 0x10, 0xfc, 0xea, 0x61, 0x5e, 0x26, + 0xf6, 0x79, 0x1e, 0x97, 0x1d, 0xf3, 0x52, 0x80, 0x7c, 0x1f, 0x6a, 0xe7, 0x24, 0x70, 0xc9, 0x58, + 0xf6, 0x0b, 0x8d, 0x54, 0x45, 0x9b, 0x18, 0xb2, 0x0d, 0x9a, 0x1c, 0x32, 0x85, 0x11, 0xea, 0xa8, + 0x8b, 0xf6, 0xc3, 0x08, 0x6c, 0x0b, 0x0a, 0xa2, 0xbb, 0x24, 0xd6, 0xe7, 0x04, 0x3b, 0xa6, 0xe8, + 0x6b, 0xd3, 0xe7, 0x21, 0x5f, 0x1e, 0xf3, 0x6f, 0x74, 0x3a, 0xaf, 0x9f, 0x22, 0xd7, 0xcf, 0x83, + 0xe5, 0xcd, 0xf9, 0x4d, 0x2a, 0x3a, 0x8b, 0x55, 0x54, 0x02, 0x15, 0x47, 0xb5, 0x2e, 0x9d, 0x76, + 0x67, 0x8f, 0xa9, 0x65, 0x1d, 0x2a, 0x87, 0xed, 0x9f, 0x1a, 0x27, 0x7d, 0x9e, 0xd5, 0x46, 0x1a, + 0xd4, 0x9e, 0x76, 0x71, 0xaf, 0x7b, 0x20, 0x5b, 0x54, 0xb4, 0x05, 0x9a, 0x6c, 0x99, 0x8e, 0xcb, + 0x33, 0x04, 0xf1, 0x59, 0x40, 0x65, 0xc8, 0xf7, 0x9f, 0xb5, 0x8f, 0xb5, 0xa2, 0xfe, 0x5f, 0x39, + 0xd8, 0x10, 0xc7, 0x42, 0xfc, 0x2a, 0xff, 0xe6, 0x57, 0xc9, 0x64, 0x96, 0x27, 0x97, 0xce, 0xf2, + 0x44, 0x41, 0x28, 0x3f, 0xd5, 0xd5, 0x69, 0x10, 0xca, 0xb3, 0x43, 0x29, 0x8f, 0x9f, 0x5f, 0xc6, + 0xe3, 0x37, 0xa0, 0xe4, 0x10, 0x1a, 0xeb, 0xad, 0x82, 0x23, 0x12, 0xd9, 0x50, 0x35, 0x5d, 0xd7, + 0x0b, 0x4d, 0x91, 0x3a, 0x2d, 0x2e, 0x75, 0x18, 0xce, 0xfc, 0xe3, 0x56, 0x7b, 0x8a, 0x24, 0x1c, + 0x73, 0x12, 0xbb, 0xf9, 0x13, 0xd0, 0x66, 0x07, 0x2c, 0x73, 0x1c, 0xfe, 0xe0, 0xe3, 0xe9, 0x69, + 0x48, 0xd8, 0xbe, 0x90, 0x6f, 0x0e, 0xda, 0x1a, 0x23, 0xf0, 0x49, 0xaf, 0xb7, 0xdf, 0x7b, 0xa2, + 0x29, 0x08, 0xa0, 0xd8, 0xfd, 0xe9, 0xfe, 0xa0, 0xbb, 0xab, 0xe5, 0x76, 0x7e, 0xbd, 0x09, 0x45, + 0xc1, 0x24, 0xfa, 0x56, 0x46, 0x02, 0xc9, 0x8a, 0x4f, 0xf4, 0x93, 0xa5, 0x23, 0xea, 0x54, 0x15, + 0x69, 0xf3, 0xd1, 0xca, 0xf3, 0xe5, 0xeb, 0xdb, 0x1a, 0xfa, 0x1b, 0x05, 0x6a, 0xa9, 0x97, 0xb7, + 0xac, 0xa9, 0xe3, 0x05, 0x05, 0xa6, 0xcd, 0x1f, 0xaf, 0x34, 0x37, 0xe6, 0xe5, 0x97, 0x0a, 0x54, + 0x13, 0xa5, 0x95, 0xe8, 0xc1, 0x2a, 0xe5, 0x98, 0x82, 0x93, 0xcf, 0x56, 0xaf, 0xe4, 0xd4, 0xd7, + 0x3e, 0x52, 0xd0, 0x5f, 0x2b, 0x50, 0x4d, 0x14, 0x19, 0x66, 0x66, 0x65, 0xbe, 0x24, 0x32, 0x33, + 0x2b, 0x8b, 0x6a, 0x1a, 0xd7, 0xd0, 0x5f, 0x2a, 0x50, 0x89, 0x0b, 0x06, 0xd1, 0xfd, 0xe5, 0x4b, + 0x0c, 0x05, 0x13, 0x9f, 0xae, 0x5a, 0x9b, 0xa8, 0xaf, 0xa1, 0x3f, 0x87, 0x72, 0x54, 0x5d, 0x87, + 0xb2, 0x9e, 0x5e, 0x33, 0xa5, 0x7b, 0xcd, 0xfb, 0x4b, 0xcf, 0x4b, 0x2e, 0x1f, 0x95, 0xbc, 0x65, + 0x5e, 0x7e, 0xa6, 0x38, 0xaf, 0x79, 0x7f, 0xe9, 0x79, 0xf1, 0xf2, 0xcc, 0x12, 0x12, 0x95, 0x71, + 0x99, 0x2d, 0x61, 0xbe, 0x24, 0x2f, 0xb3, 0x25, 0x2c, 0x2a, 0xc4, 0x13, 0x8c, 0x24, 0x6a, 0xeb, + 0x32, 0x33, 0x32, 0x5f, 0xbf, 0x97, 0x99, 0x91, 0x05, 0xa5, 0x7c, 0xfa, 0x1a, 0xfa, 0x85, 0x92, + 0xbc, 0x17, 0xdc, 0x5f, 0xba, 0x84, 0x6c, 0x49, 0x93, 0x9c, 0x2b, 0x62, 0xe3, 0x1b, 0xf4, 0x17, + 0x32, 0x8b, 0x21, 0x2a, 0xd0, 0xd0, 0x32, 0x60, 0xa9, 0xa2, 0xb5, 0xe6, 0x27, 0xab, 0x1d, 0x36, + 0x9c, 0x89, 0xbf, 0x52, 0x00, 0xa6, 0xb5, 0x6a, 0x99, 0x99, 0x98, 0x2b, 0x92, 0x6b, 0x3e, 0x58, + 0x61, 0x66, 0x72, 0x83, 0x44, 0xb5, 0x34, 0x99, 0x37, 0xc8, 0x4c, 0x2d, 0x5d, 0xe6, 0x0d, 0x32, + 0x5b, 0x07, 0xa7, 0xaf, 0xa1, 0x7f, 0x52, 0x60, 0x73, 0xae, 0x96, 0x07, 0x3d, 0xba, 0x66, 0x39, + 0x57, 0xf3, 0x8b, 0xd5, 0x01, 0x22, 0xd6, 0xb6, 0x95, 0x8f, 0x14, 0xf4, 0xb7, 0x0a, 0xac, 0xa7, + 0xeb, 0x1f, 0x32, 0x9f, 0x52, 0x0b, 0xaa, 0x82, 0x9a, 0x0f, 0x57, 0x9b, 0x1c, 0x4b, 0xeb, 0xef, + 0x15, 0xa8, 0xa7, 0x4b, 0x61, 0xd0, 0xc3, 0xe5, 0xdc, 0xc2, 0x0c, 0x43, 0x9f, 0xaf, 0x38, 0x3b, + 0xe2, 0xe8, 0xcb, 0xd2, 0x1f, 0x17, 0x44, 0xf4, 0x56, 0xe4, 0x3f, 0x3f, 0xfa, 0xff, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x2c, 0x87, 0xc3, 0x62, 0x98, 0x33, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/plugins/drivers/proto/driver.proto b/plugins/drivers/proto/driver.proto index b492c6f09a9d..dc4b2f061460 100644 --- a/plugins/drivers/proto/driver.proto +++ b/plugins/drivers/proto/driver.proto @@ -400,6 +400,13 @@ message NetworkIsolationSpec { string path = 2; map labels = 3; + + HostsConfig hostsConfig = 4; +} + +message HostsConfig { + string hostname = 1; + string address = 2; } message DNSConfig { diff --git a/plugins/drivers/utils.go b/plugins/drivers/utils.go index 7592737352bd..9b1f4988f60f 100644 --- a/plugins/drivers/utils.go +++ b/plugins/drivers/utils.go @@ -640,9 +640,10 @@ func NetworkIsolationSpecToProto(spec *NetworkIsolationSpec) *proto.NetworkIsola return nil } return &proto.NetworkIsolationSpec{ - Path: spec.Path, - Labels: spec.Labels, - Mode: netIsolationModeToProto(spec.Mode), + Path: spec.Path, + Labels: spec.Labels, + Mode: netIsolationModeToProto(spec.Mode), + HostsConfig: hostsConfigToProto(spec.HostsConfig), } } @@ -651,9 +652,32 @@ func NetworkIsolationSpecFromProto(pb *proto.NetworkIsolationSpec) *NetworkIsola return nil } return &NetworkIsolationSpec{ - Path: pb.Path, - Labels: pb.Labels, - Mode: netIsolationModeFromProto(pb.Mode), + Path: pb.Path, + Labels: pb.Labels, + Mode: netIsolationModeFromProto(pb.Mode), + HostsConfig: hostsConfigFromProto(pb.HostsConfig), + } +} + +func hostsConfigToProto(cfg *HostsConfig) *proto.HostsConfig { + if cfg == nil { + return nil + } + + return &proto.HostsConfig{ + Hostname: cfg.Hostname, + Address: cfg.Address, + } +} + +func hostsConfigFromProto(pb *proto.HostsConfig) *HostsConfig { + if pb == nil { + return nil + } + + return &HostsConfig{ + Hostname: pb.Hostname, + Address: pb.Address, } } diff --git a/website/content/docs/drivers/docker.mdx b/website/content/docs/drivers/docker.mdx index 0abe769e6b07..bc4d88691e2b 100644 --- a/website/content/docs/drivers/docker.mdx +++ b/website/content/docs/drivers/docker.mdx @@ -239,10 +239,13 @@ config { configuration on the host (which is outside the scope of Nomad). Valid values pre-docker 1.9 are `default`, `bridge`, `host`, `none`, or `container:name`. - The default `network_mode` for tasks that use [Connect] will be - `container:`, where the name is the container name of the parent - container used to share network namespaces between tasks. You should not set - `network_mode` for Connect-enabled tasks. + The default `network_mode` for tasks that use group networking in [`bridge`] + mode will be `container:`, where the name is the container name of the + parent container used to share network namespaces between tasks. If you set + the group `network.mode = "bridge"` you should not set the Docker config + `network_mode`, or the container will be unable to reach other containers in + the task group. This will also prevent [Connect]-enabled tasks from reaching + the Envoy sidecar proxy. - `pid_mode` - (Optional) `host` or not set (default). Set to `host` to share the PID namespace with the host. Note that this also requires the Nomad agent @@ -1149,3 +1152,4 @@ Windows is relatively new and rapidly evolving you may want to consult the [docker_caps]: https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities [allow_caps]: /docs/drivers/docker#allow_caps [Connect]: /docs/job-specification/connect +[`bridge`]: docs/job-specification/network#bridge