From e7803e6680060c7f5237804bee5dfbac8d9beec7 Mon Sep 17 00:00:00 2001 From: Corey Daley Date: Wed, 12 May 2021 13:19:48 -0400 Subject: [PATCH 1/2] bump(*) --- go.mod | 13 +- go.sum | 14 + .../openshift/api/build/v1/generated.pb.go | 1731 +++++++++++++---- .../openshift/api/build/v1/generated.proto | 95 +- .../openshift/api/build/v1/types.go | 106 +- .../api/build/v1/zz_generated.deepcopy.go | 100 +- .../v1/zz_generated.swagger_doc_generated.go | 54 +- .../pkg/build/buildutil/buildutil.go | 85 + .../library-go/pkg/build/naming/namer.go | 73 + vendor/modules.txt | 14 +- 10 files changed, 1864 insertions(+), 421 deletions(-) create mode 100644 vendor/github.com/openshift/library-go/pkg/build/buildutil/buildutil.go create mode 100644 vendor/github.com/openshift/library-go/pkg/build/naming/namer.go diff --git a/go.mod b/go.mod index 0240fc51497..93c6d31f3d9 100644 --- a/go.mod +++ b/go.mod @@ -14,8 +14,8 @@ require ( github.com/fsouza/go-dockerclient v1.7.2 github.com/opencontainers/runc v1.0.0-rc93 github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d - github.com/openshift/api v0.0.0-20210331193751-3acddb19d360 - github.com/openshift/client-go v0.0.0-20210331195552-cf6c2669e01f + github.com/openshift/api v0.0.0-20210621103532-064fc2f78417 + github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 github.com/openshift/imagebuilder v1.2.0 github.com/openshift/library-go v0.0.0-20210430084706-e555322cb708 github.com/openshift/source-to-image v1.3.1 @@ -23,16 +23,17 @@ require ( github.com/spf13/cobra v1.1.3 github.com/spf13/pflag v1.0.5 golang.org/x/sys v0.0.0-20210324051608-47abb6519492 - k8s.io/api v0.21.0 - k8s.io/apimachinery v0.21.0 - k8s.io/client-go v0.21.0 - k8s.io/component-base v0.21.0 + k8s.io/api v0.21.1 + k8s.io/apimachinery v0.21.1 + k8s.io/client-go v0.21.1 + k8s.io/component-base v0.21.1 k8s.io/klog/v2 v2.8.0 k8s.io/kubectl v0.21.0 k8s.io/kubernetes v1.21.0 ) replace ( + // temporary replacement for development purposes github.com/containerd/containerd => github.com/containerd/containerd v1.5.0 github.com/docker/docker => github.com/openshift/moby-moby v1.4.2-0.20190308215630-da810a85109d github.com/docker/libnetwork => github.com/docker/libnetwork v0.8.0-dev.2.0.20171107005402-dcf79f8c7fcb diff --git a/go.sum b/go.sum index 919d3666327..6c22fedce23 100644 --- a/go.sum +++ b/go.sum @@ -217,6 +217,14 @@ github.com/coreos/go-systemd/v22 v22.1.0 h1:kq/SbG2BCKLkDKkjQf5OWwKWUKj1lgs3lFI4 github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreydaley/api v0.0.0-20210503194902-7d6b95ffe991 h1:TM9/JNSPFqFJgv06JvkzMfvWz3qZyy7rY84t+ord4zM= +github.com/coreydaley/api v0.0.0-20210503194902-7d6b95ffe991/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio= +github.com/coreydaley/api v0.0.0-20210514120109-3d6c0b496499 h1:j5IaJwVLI2c9aGolUnie6I7UUyb+y0+Cu/ttG2lV3Ys= +github.com/coreydaley/api v0.0.0-20210514120109-3d6c0b496499/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio= +github.com/coreydaley/api v0.0.0-20210601202943-0831aff4bb03 h1:+fK4vDdtHXc9FQxGPUmwLNoIg4aAeb3wbBh2QcOX2/E= +github.com/coreydaley/api v0.0.0-20210601202943-0831aff4bb03/go.mod h1:izBmoXbUu3z5kUa4FjZhvekTsyzIWiOoaIgJiZBBMQs= +github.com/coreydaley/library-go v0.0.0-20210602171744-556e49f9ced8 h1:kwSAumkPM310ufdtQ1WZA8enYYxMyKKYdpZ4YL8SYok= +github.com/coreydaley/library-go v0.0.0-20210602171744-556e49f9ced8/go.mod h1:87ZYjEncF0YNUKNzncb8Fiw8yFNevpIWZW83C/etzpw= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -705,9 +713,15 @@ github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3 github.com/openshift/api v0.0.0-20210331162552-3e31249e6a55/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio= github.com/openshift/api v0.0.0-20210331193751-3acddb19d360 h1:EGWKZ4foeELg9R+0OaLXKUoqHmtUwAMq0fCBUirbKwY= github.com/openshift/api v0.0.0-20210331193751-3acddb19d360/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio= +github.com/openshift/api v0.0.0-20210521075222-e273a339932a/go.mod h1:izBmoXbUu3z5kUa4FjZhvekTsyzIWiOoaIgJiZBBMQs= +github.com/openshift/api v0.0.0-20210621103532-064fc2f78417 h1:l+ELGk0NBRPjdlvaNFgDnKA6wRvI8QwurVOQWTQNHlQ= +github.com/openshift/api v0.0.0-20210621103532-064fc2f78417/go.mod h1:izBmoXbUu3z5kUa4FjZhvekTsyzIWiOoaIgJiZBBMQs= github.com/openshift/build-machinery-go v0.0.0-20210209125900-0da259a2c359/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= +github.com/openshift/build-machinery-go v0.0.0-20210423112049-9415d7ebd33e/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE= github.com/openshift/client-go v0.0.0-20210331195552-cf6c2669e01f h1:MAFVN4yW6pPSaTa1i+4Xp6FfVzZRFRETsnPfwz6VBXM= github.com/openshift/client-go v0.0.0-20210331195552-cf6c2669e01f/go.mod h1:hHaRJ6vp2MRd/CpuZ1oJkqnMGy5eEnoAkQmKPZKcUPI= +github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 h1:ZHRIMCFIJN1p9LsJt4HQ+akDrys4PrYnXzOWI5LK03I= +github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142/go.mod h1:fjS8r9mqDVsPb5td3NehsNOAWa4uiFkYEfVZioQ2gH0= github.com/openshift/imagebuilder v1.2.0 h1:uoZFjJICLlTMjlAL/UG2PA2kM8RjAsVflGfHJK7MMDk= github.com/openshift/imagebuilder v1.2.0/go.mod h1:9aJRczxCH0mvT6XQ+5STAQaPWz7OsWcU5/mRkt8IWeo= github.com/openshift/library-go v0.0.0-20210430084706-e555322cb708 h1:Xnx252xAZag9fk8IhWdgqkfVkF2c1jMIM5cq4/y8mmM= diff --git a/vendor/github.com/openshift/api/build/v1/generated.pb.go b/vendor/github.com/openshift/api/build/v1/generated.pb.go index 561e1c64304..15a4b69949f 100644 --- a/vendor/github.com/openshift/api/build/v1/generated.pb.go +++ b/vendor/github.com/openshift/api/build/v1/generated.pb.go @@ -677,10 +677,94 @@ func (m *BuildTriggerPolicy) XXX_DiscardUnknown() { var xxx_messageInfo_BuildTriggerPolicy proto.InternalMessageInfo +func (m *BuildVolume) Reset() { *m = BuildVolume{} } +func (*BuildVolume) ProtoMessage() {} +func (*BuildVolume) Descriptor() ([]byte, []int) { + return fileDescriptor_2ba579f6f004cb75, []int{23} +} +func (m *BuildVolume) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BuildVolume) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *BuildVolume) XXX_Merge(src proto.Message) { + xxx_messageInfo_BuildVolume.Merge(m, src) +} +func (m *BuildVolume) XXX_Size() int { + return m.Size() +} +func (m *BuildVolume) XXX_DiscardUnknown() { + xxx_messageInfo_BuildVolume.DiscardUnknown(m) +} + +var xxx_messageInfo_BuildVolume proto.InternalMessageInfo + +func (m *BuildVolumeMount) Reset() { *m = BuildVolumeMount{} } +func (*BuildVolumeMount) ProtoMessage() {} +func (*BuildVolumeMount) Descriptor() ([]byte, []int) { + return fileDescriptor_2ba579f6f004cb75, []int{24} +} +func (m *BuildVolumeMount) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BuildVolumeMount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *BuildVolumeMount) XXX_Merge(src proto.Message) { + xxx_messageInfo_BuildVolumeMount.Merge(m, src) +} +func (m *BuildVolumeMount) XXX_Size() int { + return m.Size() +} +func (m *BuildVolumeMount) XXX_DiscardUnknown() { + xxx_messageInfo_BuildVolumeMount.DiscardUnknown(m) +} + +var xxx_messageInfo_BuildVolumeMount proto.InternalMessageInfo + +func (m *BuildVolumeSource) Reset() { *m = BuildVolumeSource{} } +func (*BuildVolumeSource) ProtoMessage() {} +func (*BuildVolumeSource) Descriptor() ([]byte, []int) { + return fileDescriptor_2ba579f6f004cb75, []int{25} +} +func (m *BuildVolumeSource) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BuildVolumeSource) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *BuildVolumeSource) XXX_Merge(src proto.Message) { + xxx_messageInfo_BuildVolumeSource.Merge(m, src) +} +func (m *BuildVolumeSource) XXX_Size() int { + return m.Size() +} +func (m *BuildVolumeSource) XXX_DiscardUnknown() { + xxx_messageInfo_BuildVolumeSource.DiscardUnknown(m) +} + +var xxx_messageInfo_BuildVolumeSource proto.InternalMessageInfo + func (m *CommonSpec) Reset() { *m = CommonSpec{} } func (*CommonSpec) ProtoMessage() {} func (*CommonSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{23} + return fileDescriptor_2ba579f6f004cb75, []int{26} } func (m *CommonSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -708,7 +792,7 @@ var xxx_messageInfo_CommonSpec proto.InternalMessageInfo func (m *CommonWebHookCause) Reset() { *m = CommonWebHookCause{} } func (*CommonWebHookCause) ProtoMessage() {} func (*CommonWebHookCause) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{24} + return fileDescriptor_2ba579f6f004cb75, []int{27} } func (m *CommonWebHookCause) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -736,7 +820,7 @@ var xxx_messageInfo_CommonWebHookCause proto.InternalMessageInfo func (m *ConfigMapBuildSource) Reset() { *m = ConfigMapBuildSource{} } func (*ConfigMapBuildSource) ProtoMessage() {} func (*ConfigMapBuildSource) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{25} + return fileDescriptor_2ba579f6f004cb75, []int{28} } func (m *ConfigMapBuildSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -764,7 +848,7 @@ var xxx_messageInfo_ConfigMapBuildSource proto.InternalMessageInfo func (m *CustomBuildStrategy) Reset() { *m = CustomBuildStrategy{} } func (*CustomBuildStrategy) ProtoMessage() {} func (*CustomBuildStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{26} + return fileDescriptor_2ba579f6f004cb75, []int{29} } func (m *CustomBuildStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -792,7 +876,7 @@ var xxx_messageInfo_CustomBuildStrategy proto.InternalMessageInfo func (m *DockerBuildStrategy) Reset() { *m = DockerBuildStrategy{} } func (*DockerBuildStrategy) ProtoMessage() {} func (*DockerBuildStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{27} + return fileDescriptor_2ba579f6f004cb75, []int{30} } func (m *DockerBuildStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -820,7 +904,7 @@ var xxx_messageInfo_DockerBuildStrategy proto.InternalMessageInfo func (m *DockerStrategyOptions) Reset() { *m = DockerStrategyOptions{} } func (*DockerStrategyOptions) ProtoMessage() {} func (*DockerStrategyOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{28} + return fileDescriptor_2ba579f6f004cb75, []int{31} } func (m *DockerStrategyOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -848,7 +932,7 @@ var xxx_messageInfo_DockerStrategyOptions proto.InternalMessageInfo func (m *GenericWebHookCause) Reset() { *m = GenericWebHookCause{} } func (*GenericWebHookCause) ProtoMessage() {} func (*GenericWebHookCause) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{29} + return fileDescriptor_2ba579f6f004cb75, []int{32} } func (m *GenericWebHookCause) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -876,7 +960,7 @@ var xxx_messageInfo_GenericWebHookCause proto.InternalMessageInfo func (m *GenericWebHookEvent) Reset() { *m = GenericWebHookEvent{} } func (*GenericWebHookEvent) ProtoMessage() {} func (*GenericWebHookEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{30} + return fileDescriptor_2ba579f6f004cb75, []int{33} } func (m *GenericWebHookEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -904,7 +988,7 @@ var xxx_messageInfo_GenericWebHookEvent proto.InternalMessageInfo func (m *GitBuildSource) Reset() { *m = GitBuildSource{} } func (*GitBuildSource) ProtoMessage() {} func (*GitBuildSource) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{31} + return fileDescriptor_2ba579f6f004cb75, []int{34} } func (m *GitBuildSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -932,7 +1016,7 @@ var xxx_messageInfo_GitBuildSource proto.InternalMessageInfo func (m *GitHubWebHookCause) Reset() { *m = GitHubWebHookCause{} } func (*GitHubWebHookCause) ProtoMessage() {} func (*GitHubWebHookCause) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{32} + return fileDescriptor_2ba579f6f004cb75, []int{35} } func (m *GitHubWebHookCause) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -960,7 +1044,7 @@ var xxx_messageInfo_GitHubWebHookCause proto.InternalMessageInfo func (m *GitInfo) Reset() { *m = GitInfo{} } func (*GitInfo) ProtoMessage() {} func (*GitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{33} + return fileDescriptor_2ba579f6f004cb75, []int{36} } func (m *GitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -988,7 +1072,7 @@ var xxx_messageInfo_GitInfo proto.InternalMessageInfo func (m *GitLabWebHookCause) Reset() { *m = GitLabWebHookCause{} } func (*GitLabWebHookCause) ProtoMessage() {} func (*GitLabWebHookCause) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{34} + return fileDescriptor_2ba579f6f004cb75, []int{37} } func (m *GitLabWebHookCause) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1016,7 +1100,7 @@ var xxx_messageInfo_GitLabWebHookCause proto.InternalMessageInfo func (m *GitRefInfo) Reset() { *m = GitRefInfo{} } func (*GitRefInfo) ProtoMessage() {} func (*GitRefInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{35} + return fileDescriptor_2ba579f6f004cb75, []int{38} } func (m *GitRefInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1044,7 +1128,7 @@ var xxx_messageInfo_GitRefInfo proto.InternalMessageInfo func (m *GitSourceRevision) Reset() { *m = GitSourceRevision{} } func (*GitSourceRevision) ProtoMessage() {} func (*GitSourceRevision) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{36} + return fileDescriptor_2ba579f6f004cb75, []int{39} } func (m *GitSourceRevision) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1072,7 +1156,7 @@ var xxx_messageInfo_GitSourceRevision proto.InternalMessageInfo func (m *ImageChangeCause) Reset() { *m = ImageChangeCause{} } func (*ImageChangeCause) ProtoMessage() {} func (*ImageChangeCause) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{37} + return fileDescriptor_2ba579f6f004cb75, []int{40} } func (m *ImageChangeCause) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1100,7 +1184,7 @@ var xxx_messageInfo_ImageChangeCause proto.InternalMessageInfo func (m *ImageChangeTrigger) Reset() { *m = ImageChangeTrigger{} } func (*ImageChangeTrigger) ProtoMessage() {} func (*ImageChangeTrigger) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{38} + return fileDescriptor_2ba579f6f004cb75, []int{41} } func (m *ImageChangeTrigger) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1128,7 +1212,7 @@ var xxx_messageInfo_ImageChangeTrigger proto.InternalMessageInfo func (m *ImageChangeTriggerStatus) Reset() { *m = ImageChangeTriggerStatus{} } func (*ImageChangeTriggerStatus) ProtoMessage() {} func (*ImageChangeTriggerStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{39} + return fileDescriptor_2ba579f6f004cb75, []int{42} } func (m *ImageChangeTriggerStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1156,7 +1240,7 @@ var xxx_messageInfo_ImageChangeTriggerStatus proto.InternalMessageInfo func (m *ImageLabel) Reset() { *m = ImageLabel{} } func (*ImageLabel) ProtoMessage() {} func (*ImageLabel) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{40} + return fileDescriptor_2ba579f6f004cb75, []int{43} } func (m *ImageLabel) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1184,7 +1268,7 @@ var xxx_messageInfo_ImageLabel proto.InternalMessageInfo func (m *ImageSource) Reset() { *m = ImageSource{} } func (*ImageSource) ProtoMessage() {} func (*ImageSource) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{41} + return fileDescriptor_2ba579f6f004cb75, []int{44} } func (m *ImageSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1212,7 +1296,7 @@ var xxx_messageInfo_ImageSource proto.InternalMessageInfo func (m *ImageSourcePath) Reset() { *m = ImageSourcePath{} } func (*ImageSourcePath) ProtoMessage() {} func (*ImageSourcePath) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{42} + return fileDescriptor_2ba579f6f004cb75, []int{45} } func (m *ImageSourcePath) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1237,10 +1321,38 @@ func (m *ImageSourcePath) XXX_DiscardUnknown() { var xxx_messageInfo_ImageSourcePath proto.InternalMessageInfo +func (m *ImageStreamTagReference) Reset() { *m = ImageStreamTagReference{} } +func (*ImageStreamTagReference) ProtoMessage() {} +func (*ImageStreamTagReference) Descriptor() ([]byte, []int) { + return fileDescriptor_2ba579f6f004cb75, []int{46} +} +func (m *ImageStreamTagReference) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ImageStreamTagReference) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ImageStreamTagReference) XXX_Merge(src proto.Message) { + xxx_messageInfo_ImageStreamTagReference.Merge(m, src) +} +func (m *ImageStreamTagReference) XXX_Size() int { + return m.Size() +} +func (m *ImageStreamTagReference) XXX_DiscardUnknown() { + xxx_messageInfo_ImageStreamTagReference.DiscardUnknown(m) +} + +var xxx_messageInfo_ImageStreamTagReference proto.InternalMessageInfo + func (m *JenkinsPipelineBuildStrategy) Reset() { *m = JenkinsPipelineBuildStrategy{} } func (*JenkinsPipelineBuildStrategy) ProtoMessage() {} func (*JenkinsPipelineBuildStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{43} + return fileDescriptor_2ba579f6f004cb75, []int{47} } func (m *JenkinsPipelineBuildStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1268,7 +1380,7 @@ var xxx_messageInfo_JenkinsPipelineBuildStrategy proto.InternalMessageInfo func (m *OptionalNodeSelector) Reset() { *m = OptionalNodeSelector{} } func (*OptionalNodeSelector) ProtoMessage() {} func (*OptionalNodeSelector) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{44} + return fileDescriptor_2ba579f6f004cb75, []int{48} } func (m *OptionalNodeSelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1296,7 +1408,7 @@ var xxx_messageInfo_OptionalNodeSelector proto.InternalMessageInfo func (m *ProxyConfig) Reset() { *m = ProxyConfig{} } func (*ProxyConfig) ProtoMessage() {} func (*ProxyConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{45} + return fileDescriptor_2ba579f6f004cb75, []int{49} } func (m *ProxyConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1324,7 +1436,7 @@ var xxx_messageInfo_ProxyConfig proto.InternalMessageInfo func (m *SecretBuildSource) Reset() { *m = SecretBuildSource{} } func (*SecretBuildSource) ProtoMessage() {} func (*SecretBuildSource) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{46} + return fileDescriptor_2ba579f6f004cb75, []int{50} } func (m *SecretBuildSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1352,7 +1464,7 @@ var xxx_messageInfo_SecretBuildSource proto.InternalMessageInfo func (m *SecretLocalReference) Reset() { *m = SecretLocalReference{} } func (*SecretLocalReference) ProtoMessage() {} func (*SecretLocalReference) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{47} + return fileDescriptor_2ba579f6f004cb75, []int{51} } func (m *SecretLocalReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1380,7 +1492,7 @@ var xxx_messageInfo_SecretLocalReference proto.InternalMessageInfo func (m *SecretSpec) Reset() { *m = SecretSpec{} } func (*SecretSpec) ProtoMessage() {} func (*SecretSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{48} + return fileDescriptor_2ba579f6f004cb75, []int{52} } func (m *SecretSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1408,7 +1520,7 @@ var xxx_messageInfo_SecretSpec proto.InternalMessageInfo func (m *SourceBuildStrategy) Reset() { *m = SourceBuildStrategy{} } func (*SourceBuildStrategy) ProtoMessage() {} func (*SourceBuildStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{49} + return fileDescriptor_2ba579f6f004cb75, []int{53} } func (m *SourceBuildStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1436,7 +1548,7 @@ var xxx_messageInfo_SourceBuildStrategy proto.InternalMessageInfo func (m *SourceControlUser) Reset() { *m = SourceControlUser{} } func (*SourceControlUser) ProtoMessage() {} func (*SourceControlUser) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{50} + return fileDescriptor_2ba579f6f004cb75, []int{54} } func (m *SourceControlUser) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1464,7 +1576,7 @@ var xxx_messageInfo_SourceControlUser proto.InternalMessageInfo func (m *SourceRevision) Reset() { *m = SourceRevision{} } func (*SourceRevision) ProtoMessage() {} func (*SourceRevision) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{51} + return fileDescriptor_2ba579f6f004cb75, []int{55} } func (m *SourceRevision) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1492,7 +1604,7 @@ var xxx_messageInfo_SourceRevision proto.InternalMessageInfo func (m *SourceStrategyOptions) Reset() { *m = SourceStrategyOptions{} } func (*SourceStrategyOptions) ProtoMessage() {} func (*SourceStrategyOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{52} + return fileDescriptor_2ba579f6f004cb75, []int{56} } func (m *SourceStrategyOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1520,7 +1632,7 @@ var xxx_messageInfo_SourceStrategyOptions proto.InternalMessageInfo func (m *StageInfo) Reset() { *m = StageInfo{} } func (*StageInfo) ProtoMessage() {} func (*StageInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{53} + return fileDescriptor_2ba579f6f004cb75, []int{57} } func (m *StageInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1548,7 +1660,7 @@ var xxx_messageInfo_StageInfo proto.InternalMessageInfo func (m *StepInfo) Reset() { *m = StepInfo{} } func (*StepInfo) ProtoMessage() {} func (*StepInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{54} + return fileDescriptor_2ba579f6f004cb75, []int{58} } func (m *StepInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1576,7 +1688,7 @@ var xxx_messageInfo_StepInfo proto.InternalMessageInfo func (m *WebHookTrigger) Reset() { *m = WebHookTrigger{} } func (*WebHookTrigger) ProtoMessage() {} func (*WebHookTrigger) Descriptor() ([]byte, []int) { - return fileDescriptor_2ba579f6f004cb75, []int{55} + return fileDescriptor_2ba579f6f004cb75, []int{59} } func (m *WebHookTrigger) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1625,6 +1737,9 @@ func init() { proto.RegisterType((*BuildStrategy)(nil), "github.com.openshift.api.build.v1.BuildStrategy") proto.RegisterType((*BuildTriggerCause)(nil), "github.com.openshift.api.build.v1.BuildTriggerCause") proto.RegisterType((*BuildTriggerPolicy)(nil), "github.com.openshift.api.build.v1.BuildTriggerPolicy") + proto.RegisterType((*BuildVolume)(nil), "github.com.openshift.api.build.v1.BuildVolume") + proto.RegisterType((*BuildVolumeMount)(nil), "github.com.openshift.api.build.v1.BuildVolumeMount") + proto.RegisterType((*BuildVolumeSource)(nil), "github.com.openshift.api.build.v1.BuildVolumeSource") proto.RegisterType((*CommonSpec)(nil), "github.com.openshift.api.build.v1.CommonSpec") proto.RegisterType((*CommonWebHookCause)(nil), "github.com.openshift.api.build.v1.CommonWebHookCause") proto.RegisterType((*ConfigMapBuildSource)(nil), "github.com.openshift.api.build.v1.ConfigMapBuildSource") @@ -1645,6 +1760,7 @@ func init() { proto.RegisterType((*ImageLabel)(nil), "github.com.openshift.api.build.v1.ImageLabel") proto.RegisterType((*ImageSource)(nil), "github.com.openshift.api.build.v1.ImageSource") proto.RegisterType((*ImageSourcePath)(nil), "github.com.openshift.api.build.v1.ImageSourcePath") + proto.RegisterType((*ImageStreamTagReference)(nil), "github.com.openshift.api.build.v1.ImageStreamTagReference") proto.RegisterType((*JenkinsPipelineBuildStrategy)(nil), "github.com.openshift.api.build.v1.JenkinsPipelineBuildStrategy") proto.RegisterType((*OptionalNodeSelector)(nil), "github.com.openshift.api.build.v1.OptionalNodeSelector") proto.RegisterMapType((map[string]string)(nil), "github.com.openshift.api.build.v1.OptionalNodeSelector.ItemsEntry") @@ -1666,268 +1782,280 @@ func init() { } var fileDescriptor_2ba579f6f004cb75 = []byte{ - // 4171 bytes of a gzipped FileDescriptorProto + // 4362 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5b, 0x4d, 0x6c, 0x1c, 0x47, - 0x76, 0x56, 0xcf, 0x0f, 0x39, 0xf3, 0x86, 0xe2, 0x4f, 0x51, 0xb2, 0x46, 0x5a, 0x2d, 0x47, 0x6e, - 0xc7, 0x86, 0x1c, 0xdb, 0xc3, 0xa5, 0x56, 0x52, 0xb4, 0x36, 0xb2, 0x01, 0x87, 0xa4, 0x64, 0x6a, - 0x47, 0x12, 0x51, 0x43, 0xcb, 0xce, 0x5a, 0xd8, 0xa4, 0xd9, 0x53, 0x33, 0x6c, 0x73, 0xa6, 0x7b, - 0xdc, 0xd5, 0x43, 0x9b, 0x0b, 0x04, 0x30, 0x02, 0x2c, 0x92, 0xf5, 0x5e, 0xb2, 0x97, 0x45, 0x92, - 0x4b, 0x12, 0x04, 0x39, 0xe5, 0x94, 0x43, 0x80, 0x05, 0xf6, 0x12, 0x20, 0x8b, 0xc0, 0x87, 0x04, - 0xd8, 0x20, 0x01, 0x62, 0x20, 0x8b, 0x41, 0xcc, 0x1c, 0x72, 0x0b, 0x90, 0xab, 0x0e, 0x41, 0x50, - 0x3f, 0xdd, 0x5d, 0xd5, 0xd3, 0x43, 0xf5, 0x50, 0x5a, 0x65, 0x9d, 0xdc, 0x38, 0xef, 0xe7, 0x7b, - 0xd5, 0x55, 0xaf, 0x5e, 0xbd, 0xf7, 0xaa, 0x08, 0x6b, 0x5d, 0x27, 0xd8, 0x1f, 0xee, 0xd5, 0x6d, - 0xaf, 0xbf, 0xea, 0x0d, 0x88, 0x4b, 0xf7, 0x9d, 0x4e, 0xb0, 0x6a, 0x0d, 0x9c, 0xd5, 0xbd, 0xa1, - 0xd3, 0x6b, 0xaf, 0x1e, 0xae, 0xad, 0x76, 0x89, 0x4b, 0x7c, 0x2b, 0x20, 0xed, 0xfa, 0xc0, 0xf7, - 0x02, 0x0f, 0xbd, 0x18, 0xab, 0xd4, 0x23, 0x95, 0xba, 0x35, 0x70, 0xea, 0x5c, 0xa5, 0x7e, 0xb8, - 0x76, 0xe9, 0x0d, 0x05, 0xb5, 0xeb, 0x75, 0xbd, 0x55, 0xae, 0xb9, 0x37, 0xec, 0xf0, 0x5f, 0xfc, - 0x07, 0xff, 0x4b, 0x20, 0x5e, 0x32, 0x0f, 0x6e, 0xd1, 0xba, 0xe3, 0x71, 0xb3, 0xb6, 0xe7, 0x93, - 0x14, 0xab, 0x97, 0xae, 0xc7, 0x32, 0x7d, 0xcb, 0xde, 0x77, 0x5c, 0xe2, 0x1f, 0xad, 0x0e, 0x0e, - 0xba, 0x8c, 0x40, 0x57, 0xfb, 0x24, 0xb0, 0xd2, 0xb4, 0x6e, 0x4e, 0xd2, 0xf2, 0x87, 0x6e, 0xe0, - 0xf4, 0xc9, 0x2a, 0xb5, 0xf7, 0x49, 0xdf, 0x4a, 0xea, 0x99, 0x7f, 0x53, 0x80, 0x8b, 0x0d, 0xc7, - 0xb5, 0xfc, 0xa3, 0x06, 0xfb, 0x26, 0x4c, 0x3e, 0x1c, 0x12, 0x1a, 0x3c, 0x18, 0x04, 0x8e, 0xe7, - 0x52, 0xf4, 0xdb, 0x50, 0x62, 0x06, 0xdb, 0x56, 0x60, 0x55, 0x8d, 0x2b, 0xc6, 0xd5, 0xca, 0xb5, - 0xaf, 0xd5, 0x85, 0xa1, 0xba, 0x6a, 0xa8, 0x3e, 0x38, 0xe8, 0x32, 0x02, 0xad, 0x33, 0xe9, 0xfa, - 0xe1, 0x5a, 0xfd, 0xc1, 0xde, 0x07, 0xc4, 0x0e, 0xee, 0x91, 0xc0, 0x6a, 0xa0, 0xcf, 0x46, 0xb5, - 0x33, 0xc7, 0xa3, 0x1a, 0xc4, 0x34, 0x1c, 0xa1, 0xa2, 0x57, 0x60, 0xc6, 0xa2, 0xb7, 0x9d, 0x1e, - 0xa9, 0xe6, 0xae, 0x18, 0x57, 0xcb, 0x8d, 0x79, 0x29, 0x3d, 0xb3, 0xce, 0xa9, 0x58, 0x72, 0xd1, - 0x4d, 0x98, 0xf7, 0xc9, 0xa1, 0x43, 0x1d, 0xcf, 0xdd, 0xf0, 0xfa, 0x7d, 0x27, 0xa8, 0xe6, 0x75, - 0x79, 0x41, 0xc5, 0x09, 0x29, 0xf4, 0x0d, 0x58, 0x08, 0x29, 0xf7, 0x08, 0xa5, 0x56, 0x97, 0x54, - 0x0b, 0x5c, 0x71, 0x41, 0x2a, 0xce, 0x4a, 0x32, 0x4e, 0xca, 0xa1, 0x06, 0xa0, 0x90, 0xb4, 0x3e, - 0x0c, 0xf6, 0x3d, 0xff, 0xbe, 0xd5, 0x27, 0xd5, 0x22, 0xd7, 0x8e, 0x3e, 0x2a, 0xe6, 0xe0, 0x14, - 0x69, 0xb4, 0x05, 0xcb, 0x3a, 0x75, 0xab, 0x6f, 0x39, 0xbd, 0xea, 0x0c, 0x07, 0x59, 0x96, 0x20, - 0x15, 0x85, 0x85, 0xd3, 0xe4, 0xd1, 0xb7, 0xe0, 0xbc, 0xfe, 0x5d, 0x01, 0x11, 0xa3, 0x99, 0xe5, - 0x40, 0xe7, 0x25, 0xd0, 0x59, 0x8d, 0x89, 0xd3, 0x75, 0xd0, 0x7d, 0x78, 0x61, 0x8c, 0x21, 0x86, - 0x55, 0xe2, 0x68, 0x2f, 0x48, 0xb4, 0x79, 0x9d, 0x8b, 0x27, 0x68, 0x99, 0x6f, 0xc1, 0x92, 0xe2, - 0x41, 0x2d, 0x6f, 0xe8, 0xdb, 0x44, 0x59, 0x57, 0xe3, 0xa4, 0x75, 0x35, 0x3f, 0x35, 0xe0, 0x7c, - 0xc3, 0x09, 0xf6, 0x86, 0xf6, 0x01, 0x09, 0xde, 0x25, 0x7b, 0x6f, 0x7b, 0xde, 0xc1, 0x86, 0x35, - 0xa4, 0x04, 0x7d, 0x08, 0x60, 0x7b, 0xfd, 0xbe, 0xe7, 0xb6, 0x06, 0xc4, 0x96, 0xde, 0x77, 0xa3, - 0xfe, 0xc4, 0x2d, 0x59, 0xdf, 0xe0, 0x4a, 0x2a, 0x54, 0xe3, 0x92, 0x34, 0x8e, 0xc6, 0x79, 0x58, - 0x31, 0x62, 0xfe, 0x30, 0x07, 0x45, 0xfe, 0x11, 0xcf, 0xc1, 0xf1, 0xef, 0x43, 0x81, 0xb2, 0x0f, - 0xcb, 0x71, 0xf4, 0xd7, 0x33, 0x7c, 0x98, 0x98, 0xde, 0x01, 0xb1, 0x1b, 0x73, 0x12, 0xb9, 0xc0, - 0x7e, 0x61, 0x8e, 0x83, 0x1e, 0xc2, 0x0c, 0x0d, 0xac, 0x60, 0x48, 0xf9, 0xc6, 0xa8, 0x5c, 0xab, - 0x67, 0x46, 0xe4, 0x5a, 0xf1, 0x02, 0x89, 0xdf, 0x58, 0xa2, 0x99, 0xff, 0x90, 0x87, 0x79, 0x2e, - 0xb7, 0xe1, 0xb9, 0x6d, 0x87, 0x85, 0x05, 0x74, 0x13, 0x0a, 0xc1, 0xd1, 0x20, 0x5c, 0x59, 0x33, - 0x1c, 0xcc, 0xee, 0xd1, 0x80, 0x3c, 0x1e, 0xd5, 0x90, 0x2e, 0xcd, 0xa8, 0x98, 0xcb, 0xa3, 0x66, - 0x34, 0x44, 0xb1, 0xd7, 0xaf, 0xeb, 0x26, 0x1f, 0x8f, 0x6a, 0x29, 0xf1, 0xb1, 0x1e, 0x21, 0xe9, - 0x03, 0x43, 0x1f, 0xc0, 0x7c, 0xcf, 0xa2, 0xc1, 0x3b, 0x83, 0xb6, 0x15, 0x90, 0x5d, 0xa7, 0x4f, - 0xf8, 0xae, 0xaa, 0x5c, 0xfb, 0xd5, 0x6c, 0x0b, 0xc5, 0x34, 0x62, 0x57, 0x6f, 0x6a, 0x48, 0x38, - 0x81, 0x8c, 0x0e, 0x01, 0x31, 0xca, 0xae, 0x6f, 0xb9, 0x54, 0x7c, 0x15, 0xb3, 0x97, 0x9f, 0xda, - 0x5e, 0xe4, 0x88, 0xcd, 0x31, 0x34, 0x9c, 0x62, 0x81, 0xed, 0x22, 0x9f, 0x58, 0xd4, 0x73, 0x65, - 0xd0, 0x8a, 0x16, 0x09, 0x73, 0x2a, 0x96, 0x5c, 0xf4, 0x2a, 0xcc, 0xf6, 0x65, 0x74, 0x2b, 0xa6, - 0x47, 0xb7, 0x90, 0x6f, 0xfe, 0x79, 0x0e, 0x2a, 0xe1, 0x0a, 0x75, 0x9c, 0xee, 0x73, 0xf0, 0xf4, - 0x5d, 0xcd, 0xd3, 0xaf, 0x65, 0xf5, 0x4b, 0x31, 0xbe, 0x89, 0xfe, 0xfe, 0x28, 0xe1, 0xef, 0xd7, - 0xa7, 0xc4, 0x3d, 0xd9, 0xeb, 0x7f, 0x6a, 0xc0, 0x82, 0x22, 0xdd, 0x74, 0x68, 0x80, 0x1e, 0x8d, - 0xcd, 0x54, 0x3d, 0xdb, 0x4c, 0x31, 0x6d, 0x3e, 0x4f, 0x8b, 0xd2, 0x5a, 0x29, 0xa4, 0x28, 0xb3, - 0xd4, 0x82, 0xa2, 0x13, 0x90, 0x3e, 0xdb, 0x1b, 0xf9, 0x69, 0xb6, 0xaf, 0x18, 0x60, 0xe3, 0xac, - 0x84, 0x2e, 0x6e, 0x33, 0x10, 0x2c, 0xb0, 0xcc, 0x9f, 0xe7, 0xb5, 0xcf, 0x60, 0xd3, 0x87, 0x6c, - 0x28, 0x05, 0xbe, 0xd3, 0xed, 0x12, 0x9f, 0x56, 0x0d, 0x6e, 0xeb, 0x46, 0x56, 0x5b, 0xbb, 0x42, - 0x6f, 0xc7, 0xeb, 0x39, 0xf6, 0x51, 0xfc, 0x35, 0x92, 0x4c, 0x71, 0x04, 0x8c, 0xd6, 0xa1, 0xec, - 0x0f, 0x5d, 0x21, 0x28, 0x77, 0xfb, 0x4b, 0x52, 0xbc, 0x8c, 0x43, 0xc6, 0xe3, 0x51, 0x4d, 0x84, - 0x96, 0x88, 0x82, 0x63, 0x2d, 0x64, 0x69, 0xf1, 0x5f, 0x2c, 0xf2, 0x1b, 0x99, 0xe3, 0x3f, 0xf7, - 0x9b, 0xc8, 0x2f, 0x63, 0x9a, 0x1a, 0xef, 0x51, 0x1b, 0x2e, 0xd3, 0xa1, 0x6d, 0x13, 0x4a, 0x3b, - 0xc3, 0x1e, 0x1f, 0x09, 0x7d, 0xdb, 0xa1, 0x81, 0xe7, 0x1f, 0x35, 0x1d, 0x96, 0x62, 0xb0, 0x4d, - 0x57, 0x6c, 0x5c, 0x39, 0x1e, 0xd5, 0x2e, 0xb7, 0x4e, 0x90, 0xc3, 0x27, 0xa2, 0xa0, 0xf7, 0xa0, - 0xda, 0xb1, 0x9c, 0x1e, 0x69, 0xa7, 0x58, 0x28, 0x72, 0x0b, 0x97, 0x8f, 0x47, 0xb5, 0xea, 0xed, - 0x09, 0x32, 0x78, 0xa2, 0xb6, 0xf9, 0x2f, 0x06, 0x2c, 0x8d, 0xf9, 0x34, 0xba, 0x01, 0x15, 0x16, - 0x4a, 0x1e, 0x12, 0x9f, 0x1d, 0xd6, 0xdc, 0x55, 0xf3, 0x71, 0xae, 0xd1, 0x8c, 0x59, 0x58, 0x95, - 0x43, 0x9f, 0x1a, 0xb0, 0xec, 0xf4, 0xad, 0x2e, 0xd9, 0xd8, 0xb7, 0xdc, 0x2e, 0x09, 0x17, 0x55, - 0xfa, 0xe3, 0x5b, 0x19, 0x66, 0x7e, 0x7b, 0x4c, 0x5b, 0xee, 0xb2, 0xaf, 0x48, 0xe3, 0xcb, 0xe3, - 0x12, 0x14, 0xa7, 0x19, 0x35, 0x7f, 0x6c, 0x40, 0x99, 0x7f, 0xd9, 0x73, 0xd8, 0x79, 0xf7, 0xf4, - 0x9d, 0x77, 0x35, 0xeb, 0x6e, 0x98, 0xb0, 0xe7, 0x00, 0x4a, 0x62, 0xe4, 0x5e, 0xd7, 0xfc, 0xaf, - 0x82, 0xdc, 0x7f, 0x4d, 0xaf, 0x1b, 0xe6, 0xd4, 0xab, 0x50, 0xb6, 0x3d, 0x37, 0xb0, 0xd8, 0x90, - 0xe5, 0x11, 0xba, 0x14, 0x6e, 0x8d, 0x8d, 0x90, 0x81, 0x63, 0x19, 0x76, 0x08, 0x74, 0xbc, 0x5e, - 0xcf, 0xfb, 0x88, 0x6f, 0xa4, 0x52, 0x1c, 0xb3, 0x6e, 0x73, 0x2a, 0x96, 0x5c, 0xf4, 0x3a, 0x94, - 0x06, 0x2c, 0x45, 0xf3, 0x64, 0x4c, 0x2c, 0xc5, 0x5f, 0xbd, 0x23, 0xe9, 0x38, 0x92, 0x40, 0xd7, - 0x61, 0x8e, 0x3a, 0xae, 0x4d, 0x5a, 0xc4, 0xf6, 0xdc, 0x36, 0xe5, 0xbe, 0x9e, 0x6f, 0x2c, 0x1e, - 0x8f, 0x6a, 0x73, 0x2d, 0x85, 0x8e, 0x35, 0x29, 0xf4, 0x2e, 0x94, 0xf9, 0x6f, 0x7e, 0xfe, 0x15, - 0xa7, 0x3e, 0xff, 0xce, 0xb2, 0x8f, 0x6c, 0x85, 0x00, 0x38, 0xc6, 0x42, 0xd7, 0x00, 0x58, 0x99, - 0x42, 0x03, 0xab, 0x3f, 0xa0, 0xfc, 0x24, 0x2f, 0xc5, 0xdb, 0x77, 0x37, 0xe2, 0x60, 0x45, 0x0a, - 0xbd, 0x06, 0xe5, 0xc0, 0x72, 0x7a, 0x4d, 0xc7, 0x25, 0x94, 0x67, 0xc2, 0x79, 0x61, 0x60, 0x37, - 0x24, 0xe2, 0x98, 0x8f, 0xea, 0x00, 0x3d, 0xb6, 0x69, 0x1a, 0x47, 0x01, 0xa1, 0x3c, 0xd3, 0xcd, - 0x37, 0xe6, 0x19, 0x78, 0x33, 0xa2, 0x62, 0x45, 0x82, 0xcd, 0xba, 0xeb, 0x7d, 0x64, 0x39, 0x41, - 0xb5, 0xac, 0xcf, 0xfa, 0x7d, 0xef, 0x5d, 0xcb, 0x09, 0xb0, 0xe4, 0xa2, 0x97, 0x61, 0xf6, 0x50, - 0xee, 0x34, 0xe0, 0xa0, 0x15, 0x76, 0xec, 0x86, 0x3b, 0x2c, 0xe4, 0xa1, 0x7d, 0xb8, 0xec, 0xb8, - 0x94, 0xd8, 0x43, 0x9f, 0xb4, 0x0e, 0x9c, 0xc1, 0x6e, 0xb3, 0xf5, 0x90, 0xf8, 0x4e, 0xe7, 0xa8, - 0x61, 0xd9, 0x07, 0xc4, 0x6d, 0x57, 0x2b, 0xdc, 0xc8, 0xaf, 0x48, 0x23, 0x97, 0xb7, 0x4f, 0x90, - 0xc5, 0x27, 0x22, 0x99, 0x9f, 0x86, 0x07, 0xfc, 0x83, 0x61, 0x30, 0x18, 0x06, 0xe8, 0x2d, 0xc8, - 0x05, 0x9e, 0xdc, 0x36, 0x2f, 0x29, 0x6b, 0x55, 0x67, 0x09, 0x56, 0x7c, 0x90, 0x63, 0xd2, 0x21, - 0x3e, 0x71, 0x6d, 0xd2, 0x98, 0x39, 0x1e, 0xd5, 0x72, 0xbb, 0x1e, 0xce, 0x05, 0x1e, 0x7a, 0x0f, - 0x60, 0x30, 0xa4, 0xfb, 0x2d, 0x62, 0xfb, 0x24, 0x90, 0x27, 0xf8, 0xd5, 0x34, 0x90, 0xa6, 0x67, - 0x5b, 0xbd, 0x24, 0x12, 0x9f, 0xdf, 0x9d, 0x48, 0x1f, 0x2b, 0x58, 0xa8, 0x0d, 0x15, 0xbe, 0xf1, - 0x9b, 0xd6, 0x1e, 0xe9, 0x31, 0x87, 0xcd, 0x67, 0x8c, 0xef, 0xdb, 0x91, 0x56, 0x1c, 0xd4, 0x62, - 0x1a, 0xc5, 0x2a, 0xac, 0xf9, 0xbb, 0x06, 0x2c, 0xf3, 0xc9, 0xd8, 0xf1, 0x68, 0x20, 0xea, 0x16, - 0x1e, 0xf9, 0x5f, 0x86, 0x59, 0x76, 0x0e, 0x58, 0x6e, 0x9b, 0x9f, 0x81, 0x65, 0xb1, 0x6a, 0x1b, - 0x82, 0x84, 0x43, 0x1e, 0xba, 0x0c, 0x05, 0xcb, 0xef, 0x8a, 0xc8, 0x50, 0x6e, 0x94, 0x58, 0x0a, - 0xb2, 0xee, 0x77, 0x29, 0xe6, 0x54, 0xe6, 0x22, 0xd4, 0xf6, 0x9d, 0xc1, 0x58, 0x2d, 0xda, 0xe2, - 0x54, 0x2c, 0xb9, 0xe6, 0x4f, 0x67, 0x61, 0x4e, 0xad, 0xae, 0x9f, 0x43, 0xce, 0xf5, 0x3e, 0x94, - 0xc2, 0x6a, 0x4d, 0xae, 0xda, 0x5a, 0x86, 0xa9, 0x15, 0xb5, 0x1b, 0x96, 0x8a, 0x8d, 0x39, 0x16, - 0x3a, 0xc2, 0x5f, 0x38, 0x02, 0x44, 0x04, 0x16, 0xe5, 0x41, 0x4f, 0xda, 0x8d, 0x23, 0x3e, 0xf7, - 0xf2, 0x7c, 0xce, 0xe4, 0x5f, 0xe7, 0x8e, 0x47, 0xb5, 0xc5, 0xdd, 0x04, 0x00, 0x1e, 0x83, 0x44, - 0xeb, 0x50, 0xe8, 0xf8, 0x5e, 0x9f, 0x47, 0xa6, 0x8c, 0xd0, 0x7c, 0x85, 0x6e, 0xfb, 0x5e, 0x1f, - 0x73, 0x55, 0xf4, 0x1e, 0xcc, 0xec, 0xf1, 0xd2, 0x54, 0xc6, 0xaa, 0x4c, 0x49, 0x62, 0xb2, 0x96, - 0x6d, 0x00, 0x5b, 0x53, 0x41, 0xc6, 0x12, 0x0f, 0xad, 0xe9, 0x87, 0xec, 0x0c, 0xdf, 0xfa, 0x0b, - 0x27, 0x1e, 0xb0, 0xdf, 0x80, 0x3c, 0x71, 0x0f, 0xab, 0xb3, 0xdc, 0xd3, 0x2f, 0xa5, 0x7d, 0xce, - 0x96, 0x7b, 0xf8, 0xd0, 0xf2, 0x1b, 0x15, 0xb9, 0xb4, 0xf9, 0x2d, 0xf7, 0x10, 0x33, 0x1d, 0x74, - 0x00, 0x15, 0x65, 0x7a, 0xaa, 0x25, 0x0e, 0x71, 0x7d, 0xca, 0xb4, 0x4d, 0xd4, 0xc2, 0xd1, 0x9e, - 0x51, 0x56, 0x00, 0xab, 0xe8, 0xe8, 0xfb, 0x06, 0x9c, 0x6f, 0x7b, 0xf6, 0x01, 0x3b, 0xbe, 0x7d, - 0x2b, 0x20, 0xdd, 0x23, 0x79, 0x74, 0xf1, 0x48, 0x58, 0xb9, 0x76, 0x2b, 0x83, 0xdd, 0xcd, 0x34, - 0xfd, 0xc6, 0xc5, 0xe3, 0x51, 0xed, 0x7c, 0x2a, 0x0b, 0xa7, 0x5b, 0xe4, 0x63, 0xa1, 0x7c, 0x15, - 0x92, 0x63, 0x81, 0xcc, 0x63, 0x69, 0xa5, 0xe9, 0x8b, 0xb1, 0xa4, 0xb2, 0x70, 0xba, 0x45, 0xf3, - 0x9f, 0x8b, 0x32, 0xb0, 0xca, 0x16, 0xc7, 0xd7, 0xb5, 0x32, 0xb8, 0x96, 0x28, 0x83, 0x17, 0x14, - 0x51, 0xa5, 0x06, 0x8e, 0x3d, 0x32, 0xf7, 0x8c, 0x3d, 0xb2, 0x0e, 0x20, 0xe6, 0xb0, 0xe3, 0xf4, - 0x48, 0x18, 0x91, 0x58, 0x80, 0xd8, 0x8c, 0xa8, 0x58, 0x91, 0x40, 0x4d, 0xc8, 0x77, 0x65, 0x8e, - 0x9b, 0x2d, 0x3a, 0xdc, 0x71, 0x02, 0x75, 0x0c, 0xb3, 0xcc, 0x43, 0xef, 0x38, 0x01, 0x66, 0x30, - 0xe8, 0x21, 0xcc, 0xf0, 0xb8, 0x4b, 0xab, 0xc5, 0xcc, 0xf5, 0x0b, 0xdf, 0xe6, 0x12, 0x2d, 0x8a, - 0x9d, 0x9c, 0x48, 0xb1, 0x44, 0x63, 0x79, 0x01, 0xcb, 0x84, 0xc8, 0xc7, 0xc1, 0xa6, 0xe3, 0xcb, - 0xbe, 0x99, 0x92, 0xd6, 0x87, 0x1c, 0xac, 0x48, 0xa1, 0xef, 0xc0, 0x9c, 0x5c, 0x41, 0x71, 0x6c, - 0xcd, 0x4e, 0x79, 0x6c, 0x89, 0x24, 0x48, 0x41, 0xc0, 0x1a, 0x1e, 0xfa, 0x2d, 0x98, 0xa5, 0xfc, - 0x2f, 0x3a, 0xc5, 0x4e, 0x14, 0xba, 0xea, 0x04, 0x46, 0x35, 0xba, 0x60, 0x51, 0x1c, 0xa2, 0xa2, - 0x03, 0xfe, 0xd1, 0x1d, 0xa7, 0x7b, 0xcf, 0x1a, 0xb0, 0x5d, 0xc7, 0x6c, 0xfc, 0x5a, 0xa6, 0xd2, - 0x47, 0x2a, 0xa9, 0x66, 0xd4, 0xd9, 0x92, 0x90, 0x58, 0x81, 0x37, 0xff, 0x35, 0x4c, 0xb5, 0xf9, - 0xc1, 0x68, 0xa5, 0x74, 0xdd, 0x9e, 0x71, 0xd5, 0x95, 0x08, 0x66, 0xb9, 0x5f, 0x64, 0x30, 0x33, - 0xff, 0x73, 0x36, 0xdc, 0xb4, 0xa2, 0x38, 0x5a, 0x83, 0xe2, 0x60, 0xdf, 0xa2, 0xe1, 0xae, 0x0d, - 0x2b, 0x93, 0xe2, 0x0e, 0x23, 0x3e, 0x1e, 0xd5, 0x40, 0x64, 0x0b, 0xec, 0x17, 0x16, 0x92, 0x3c, - 0x61, 0xb7, 0x5c, 0x9b, 0xf4, 0x7a, 0xa4, 0x2d, 0x53, 0xf0, 0x38, 0x61, 0x0f, 0x19, 0x38, 0x96, - 0x41, 0x37, 0xa3, 0xae, 0x8d, 0xd8, 0x85, 0x2b, 0x7a, 0xd7, 0xe6, 0x31, 0xf3, 0x2e, 0xd1, 0x6e, - 0x98, 0xd8, 0xc5, 0x29, 0x9c, 0xdc, 0xc5, 0x41, 0x1d, 0x98, 0xa7, 0x81, 0xe5, 0x07, 0x51, 0x66, - 0x7c, 0x8a, 0x64, 0x1c, 0x1d, 0x8f, 0x6a, 0xf3, 0x2d, 0x0d, 0x05, 0x27, 0x50, 0xd1, 0x10, 0x96, - 0x6d, 0xaf, 0x3f, 0xe8, 0x91, 0xb0, 0x25, 0x25, 0x8c, 0x4d, 0xdf, 0x69, 0xbb, 0xc0, 0xca, 0xbf, - 0x8d, 0x71, 0x28, 0x9c, 0x86, 0x8f, 0x7e, 0x1d, 0x4a, 0xed, 0xa1, 0x6f, 0x31, 0xa2, 0x4c, 0xec, - 0x5f, 0x0c, 0x4b, 0x99, 0x4d, 0x49, 0x7f, 0x3c, 0xaa, 0x9d, 0x65, 0xb5, 0x40, 0x3d, 0x24, 0xe0, - 0x48, 0x05, 0xed, 0xc1, 0x25, 0x8f, 0x27, 0xbf, 0x22, 0xf4, 0x89, 0x04, 0x23, 0xdc, 0xde, 0xb2, - 0xcb, 0x1d, 0xb6, 0x2d, 0x2f, 0x3d, 0x98, 0x28, 0x89, 0x4f, 0x40, 0x41, 0x77, 0x60, 0x46, 0x6c, - 0x22, 0x79, 0x2a, 0x66, 0xca, 0x4f, 0x40, 0xdc, 0x54, 0x30, 0x35, 0x2c, 0xd5, 0xd1, 0x23, 0x98, - 0x11, 0x66, 0xe4, 0x91, 0x76, 0x7d, 0xba, 0xc6, 0xad, 0x18, 0x7e, 0x1c, 0x3f, 0xc5, 0x6f, 0x2c, - 0x31, 0xd1, 0x2e, 0x6f, 0x93, 0xb1, 0xb8, 0x5c, 0xe1, 0xfb, 0x2c, 0x4b, 0xa3, 0xb9, 0xc5, 0x14, - 0xb6, 0xdd, 0x8e, 0xa7, 0xb5, 0xc7, 0x78, 0x54, 0x16, 0x58, 0x2c, 0x2a, 0xf7, 0xbc, 0x6e, 0xcb, - 0x75, 0x06, 0x03, 0x12, 0x54, 0xe7, 0xf4, 0xa8, 0xdc, 0x8c, 0x38, 0x58, 0x91, 0x42, 0x84, 0x07, - 0x35, 0xd1, 0xca, 0xa5, 0xd5, 0xb3, 0x7c, 0x34, 0x6b, 0x53, 0x74, 0xb9, 0x84, 0xa6, 0x16, 0xce, - 0x24, 0x18, 0x56, 0x80, 0x4d, 0x5b, 0xb6, 0x44, 0xd4, 0xd9, 0x41, 0xf7, 0x95, 0x1a, 0xe8, 0xe6, - 0x69, 0xe6, 0x77, 0xd7, 0x53, 0xcb, 0x22, 0xb3, 0x29, 0xab, 0x0a, 0x5d, 0x04, 0xdd, 0x90, 0x35, - 0xcd, 0xa6, 0xd3, 0x25, 0x34, 0x90, 0x21, 0x46, 0x2f, 0x52, 0x04, 0x0b, 0xab, 0x72, 0xe6, 0x4f, - 0x0a, 0x70, 0x56, 0xc2, 0x89, 0x8c, 0x03, 0xdd, 0xd0, 0x52, 0x8b, 0x17, 0x13, 0xa9, 0xc5, 0x92, - 0x26, 0xac, 0x24, 0x17, 0x3e, 0xcc, 0xeb, 0x69, 0x94, 0x4c, 0x32, 0x6e, 0x66, 0xce, 0xd8, 0x34, - 0x64, 0x11, 0x21, 0xf4, 0x7c, 0x0d, 0x27, 0x2c, 0x30, 0x9b, 0x7a, 0xba, 0x24, 0x4b, 0x81, 0x9b, - 0x99, 0x33, 0xb3, 0x14, 0x9b, 0x7a, 0x5e, 0x86, 0x13, 0x16, 0x98, 0x4d, 0x7b, 0x48, 0x03, 0xaf, - 0x1f, 0xd9, 0x2c, 0x64, 0xb6, 0xb9, 0xc1, 0x15, 0x53, 0x6c, 0x6e, 0x68, 0x88, 0x38, 0x61, 0x01, - 0xfd, 0xc8, 0x80, 0x0b, 0x1f, 0x10, 0xf7, 0xc0, 0x71, 0xe9, 0x8e, 0x33, 0x20, 0x3d, 0xc7, 0x8d, - 0xbf, 0x58, 0xc4, 0xde, 0xdf, 0xc8, 0x60, 0xfd, 0xae, 0x8e, 0xa0, 0x0f, 0xe3, 0x2b, 0xc7, 0xa3, - 0xda, 0x85, 0xbb, 0xe9, 0x36, 0xf0, 0x24, 0xe3, 0xe6, 0xf7, 0x8a, 0xd2, 0xe3, 0xd5, 0x93, 0x51, - 0x3d, 0x4b, 0x8c, 0x27, 0x9c, 0x25, 0x3e, 0xcc, 0xf3, 0x5b, 0x61, 0xc7, 0x96, 0x17, 0x63, 0x53, - 0x78, 0xcd, 0x1d, 0x4d, 0x51, 0x1c, 0xca, 0x7c, 0x36, 0x75, 0x06, 0x4e, 0x58, 0x40, 0x2e, 0x9c, - 0x15, 0xe0, 0xa1, 0xc9, 0x7c, 0xe6, 0xfb, 0xbd, 0x3b, 0x4e, 0xf0, 0x76, 0xa4, 0x27, 0x2c, 0x2e, - 0x1d, 0x8f, 0x6a, 0x67, 0x35, 0x3a, 0xd6, 0xe1, 0xd1, 0x10, 0x16, 0x95, 0x36, 0x23, 0x9f, 0x2e, - 0xe9, 0x33, 0x5f, 0x9f, 0xae, 0xb1, 0x29, 0x0c, 0xf2, 0x12, 0x76, 0x3b, 0x01, 0x88, 0xc7, 0x4c, - 0xc8, 0xcf, 0xec, 0x59, 0xd1, 0x67, 0x16, 0xa7, 0xf9, 0xcc, 0xa6, 0x95, 0xfe, 0x99, 0x31, 0x1d, - 0xeb, 0xf0, 0xe8, 0xbb, 0xb0, 0xb8, 0x97, 0xb8, 0x4c, 0x95, 0x67, 0xf5, 0xad, 0x4c, 0x75, 0x46, - 0xca, 0x3d, 0xac, 0xf8, 0xd6, 0x24, 0x0b, 0x8f, 0xd9, 0x31, 0x7f, 0x5c, 0x00, 0x34, 0x7e, 0x4b, - 0x80, 0xae, 0x6b, 0xa1, 0xec, 0x4a, 0x22, 0x94, 0x2d, 0xaa, 0x1a, 0x4a, 0x24, 0x7b, 0x04, 0x33, - 0x62, 0xbc, 0x53, 0x74, 0x2f, 0xe4, 0x40, 0x24, 0x58, 0x9a, 0x53, 0x48, 0x4c, 0x96, 0xc0, 0x4b, - 0x7f, 0x94, 0x7e, 0x77, 0x0a, 0xf8, 0x34, 0x2f, 0x0f, 0x51, 0xd1, 0xbe, 0x3c, 0x08, 0x84, 0x2f, - 0x48, 0x4f, 0xbb, 0x71, 0xaa, 0x16, 0xba, 0x68, 0x2a, 0x28, 0x74, 0xac, 0x42, 0xcb, 0x89, 0xea, - 0x59, 0x7b, 0xd2, 0xb5, 0x9e, 0x62, 0xa2, 0x14, 0xb7, 0x92, 0x98, 0x88, 0x40, 0x39, 0x5a, 0x67, - 0xe9, 0x48, 0xa7, 0x30, 0x90, 0xee, 0x41, 0x31, 0xb2, 0xf9, 0xfb, 0xb3, 0xa0, 0x14, 0x0b, 0xe8, - 0x9b, 0x30, 0x4f, 0x89, 0x7f, 0xe8, 0xd8, 0x64, 0xdd, 0xb6, 0xbd, 0xa1, 0x1b, 0x9e, 0xa4, 0xd1, - 0x6d, 0x6d, 0x4b, 0xe3, 0xe2, 0x84, 0x34, 0xbf, 0x0a, 0xe7, 0x07, 0x86, 0x74, 0x9e, 0xec, 0x57, - 0xe1, 0x89, 0x5a, 0x54, 0xf6, 0xc3, 0x24, 0x9a, 0xd6, 0x54, 0xcb, 0x3f, 0xeb, 0xa6, 0xda, 0x77, - 0xa0, 0x44, 0xf5, 0xd3, 0xec, 0x6b, 0xd9, 0x13, 0x15, 0x79, 0x80, 0x44, 0xfd, 0xfe, 0xe8, 0xd4, - 0x88, 0x30, 0xd9, 0xa4, 0xc8, 0x34, 0xb3, 0x38, 0xdd, 0xa4, 0x3c, 0x21, 0xc1, 0xfc, 0x4d, 0x28, - 0xfb, 0x44, 0x4c, 0x10, 0x95, 0x2e, 0x92, 0x5a, 0x69, 0x63, 0x29, 0x84, 0xc9, 0x87, 0x43, 0xc7, - 0x27, 0x7d, 0xe2, 0x06, 0x34, 0xae, 0xa3, 0x42, 0x2e, 0xc5, 0x31, 0x1a, 0xfa, 0x00, 0x60, 0x10, - 0xb5, 0x6d, 0x65, 0x15, 0x9f, 0x39, 0x7b, 0xd3, 0x1b, 0xbe, 0x71, 0xda, 0x18, 0xd3, 0xb1, 0x82, - 0x8e, 0xde, 0x87, 0x8b, 0x71, 0x21, 0xb2, 0x49, 0xac, 0x36, 0x3f, 0x63, 0xe5, 0xdd, 0x88, 0xb8, - 0x2d, 0xf8, 0xea, 0xf1, 0xa8, 0x76, 0x71, 0x63, 0x92, 0x10, 0x9e, 0xac, 0x8f, 0xfa, 0x30, 0xe7, - 0x7a, 0x6d, 0xd2, 0x22, 0x3d, 0x62, 0x07, 0x9e, 0x2f, 0x2b, 0x86, 0x2c, 0x15, 0xbd, 0xe8, 0x3d, - 0x59, 0xbd, 0xfb, 0x8a, 0xba, 0xe8, 0x4f, 0xa8, 0x14, 0xac, 0xc1, 0xa3, 0x37, 0x61, 0xbe, 0xcf, - 0x36, 0xc2, 0xae, 0x3f, 0xa4, 0x01, 0x69, 0x6f, 0xac, 0xf3, 0xca, 0xa2, 0x24, 0x42, 0xd6, 0x3d, - 0x8d, 0x83, 0x13, 0x92, 0xe6, 0x1f, 0x19, 0x90, 0xf2, 0x4a, 0x46, 0x73, 0x7d, 0xe3, 0x59, 0xbb, - 0xfe, 0x2b, 0x30, 0x43, 0xe3, 0x0b, 0x06, 0xb5, 0x8f, 0x2e, 0xba, 0x2f, 0x92, 0x6b, 0xfe, 0x95, - 0x01, 0xe7, 0xd2, 0x5a, 0x1c, 0xcc, 0x07, 0xa3, 0x86, 0x86, 0x1c, 0x5e, 0xf6, 0x6e, 0x8f, 0x7a, - 0xf9, 0x26, 0x20, 0x70, 0x8c, 0xc6, 0x62, 0x51, 0x9b, 0xd0, 0xc0, 0x71, 0x79, 0x65, 0xb9, 0xe9, - 0xf8, 0x72, 0x8c, 0x51, 0x2c, 0xda, 0xd4, 0xb8, 0x38, 0x21, 0x6d, 0xfe, 0xa0, 0x00, 0xcb, 0x29, - 0x29, 0x27, 0xda, 0x92, 0xcd, 0xed, 0x29, 0xee, 0x65, 0xa2, 0x57, 0x10, 0x5a, 0x83, 0x1b, 0x06, - 0xc3, 0x5e, 0xef, 0xe9, 0xee, 0x67, 0x42, 0x7d, 0xac, 0x60, 0x85, 0xdd, 0xea, 0xfc, 0x29, 0xba, - 0xd5, 0x77, 0x01, 0x91, 0x8f, 0x07, 0x1e, 0x25, 0xb2, 0x74, 0xf0, 0xf8, 0xf1, 0x51, 0xe0, 0x3e, - 0x18, 0xbd, 0x80, 0xd9, 0x1a, 0x93, 0xc0, 0x29, 0x5a, 0x68, 0x15, 0xca, 0x1d, 0xcf, 0xb7, 0x09, - 0x1b, 0x25, 0x8f, 0x5c, 0x4a, 0xf3, 0xe5, 0x76, 0xc8, 0xc0, 0xb1, 0x0c, 0x7a, 0x2f, 0x6e, 0xce, - 0xcd, 0x64, 0xbe, 0x53, 0x12, 0xdf, 0xcc, 0x03, 0xc5, 0xe4, 0xae, 0xdc, 0x3a, 0x2c, 0x70, 0x85, - 0xf5, 0x9d, 0xed, 0xb0, 0xed, 0x2f, 0x9e, 0xdf, 0x5d, 0x90, 0x2a, 0xa2, 0xe5, 0x1b, 0xb3, 0x71, - 0x52, 0xde, 0xfc, 0xac, 0x00, 0xcb, 0x29, 0x85, 0x56, 0x74, 0xd5, 0x61, 0x3c, 0xcd, 0x55, 0xc7, - 0x2f, 0xca, 0x13, 0x5e, 0x85, 0x59, 0xd7, 0xdb, 0xb0, 0xec, 0x7d, 0x22, 0xaf, 0x95, 0xa3, 0x29, - 0xba, 0x2f, 0xc8, 0x38, 0xe4, 0x87, 0x4e, 0x53, 0x38, 0x85, 0xd3, 0x4c, 0xbd, 0xd0, 0xdf, 0x0c, - 0x8b, 0xdd, 0x8e, 0xd3, 0x23, 0x3b, 0x56, 0xb0, 0x2f, 0xbb, 0xc3, 0xf1, 0xce, 0xd4, 0xb8, 0x38, - 0x21, 0x8d, 0xbe, 0x05, 0x65, 0xb1, 0x3c, 0x7e, 0x97, 0x66, 0xb8, 0x94, 0x89, 0x06, 0xd3, 0x08, - 0x95, 0x70, 0xac, 0x8f, 0x06, 0x70, 0x81, 0x67, 0x65, 0x2c, 0x5e, 0xf7, 0x9d, 0xef, 0xf2, 0xed, - 0x2f, 0x5f, 0xbf, 0x88, 0x76, 0xd3, 0x4d, 0x56, 0xdb, 0x6d, 0xa7, 0x8b, 0x3c, 0x9e, 0xcc, 0xc2, - 0x93, 0x60, 0xcd, 0x1f, 0x18, 0x90, 0x7e, 0x95, 0xa2, 0x7f, 0x98, 0xf1, 0x94, 0x1f, 0xf6, 0x72, - 0xbc, 0xf8, 0xa2, 0xf5, 0x59, 0x49, 0x5b, 0x78, 0xf3, 0x8f, 0x0d, 0x58, 0x4e, 0xa9, 0x05, 0x7f, - 0x39, 0xce, 0x8d, 0xcf, 0x73, 0xc9, 0xc1, 0x6d, 0x1d, 0x12, 0x37, 0x38, 0xdd, 0x05, 0xce, 0x96, - 0xb8, 0x36, 0xc9, 0xc9, 0x0e, 0x68, 0xa6, 0x42, 0x8e, 0xf7, 0xd2, 0xf4, 0xfb, 0x92, 0xa7, 0x08, - 0xaf, 0x93, 0xef, 0xe7, 0x0a, 0xcf, 0xfb, 0x7e, 0xce, 0xfc, 0x6b, 0x03, 0xe6, 0xf5, 0x7b, 0x21, - 0xf4, 0x55, 0xc8, 0x0f, 0x7d, 0x47, 0x4e, 0x6a, 0x34, 0xfa, 0x77, 0xf0, 0x36, 0x66, 0x74, 0xc6, - 0xf6, 0x49, 0x47, 0xae, 0x58, 0xc4, 0xc6, 0xa4, 0x83, 0x19, 0x1d, 0x11, 0xa8, 0x0c, 0x7c, 0xef, - 0xe3, 0x23, 0x71, 0x18, 0x4f, 0xf1, 0x96, 0x75, 0x27, 0xd6, 0x8a, 0x5b, 0x6e, 0x0a, 0x11, 0xab, - 0xb8, 0x3c, 0xcd, 0x19, 0x6f, 0x24, 0xfc, 0x72, 0xb8, 0xeb, 0xdf, 0xe7, 0x60, 0x56, 0x3a, 0x0d, - 0xfa, 0x10, 0xe6, 0xbb, 0xda, 0xf4, 0x4e, 0x31, 0xac, 0xc4, 0x7d, 0x5d, 0x14, 0x17, 0x75, 0x3a, - 0x4e, 0x18, 0x40, 0xbf, 0x03, 0x4b, 0x5d, 0x27, 0xd0, 0xbf, 0x69, 0x8a, 0xcb, 0xca, 0x3b, 0x49, - 0xdd, 0xc6, 0x45, 0x69, 0x78, 0x69, 0x8c, 0x85, 0xc7, 0x2d, 0xa1, 0x07, 0x50, 0xf0, 0x49, 0x67, - 0x9a, 0x07, 0x21, 0x6c, 0x4f, 0x91, 0x0e, 0xdf, 0x63, 0x51, 0x8a, 0x84, 0x49, 0x87, 0x62, 0x0e, - 0x64, 0xfe, 0x9e, 0x58, 0xea, 0x44, 0x33, 0xe5, 0x7f, 0xe3, 0x79, 0xf9, 0x7f, 0x1b, 0x00, 0xf1, - 0x60, 0xff, 0xff, 0xad, 0xad, 0xf9, 0x97, 0x39, 0x18, 0x17, 0x64, 0xfb, 0xc2, 0x16, 0x25, 0x9e, - 0x91, 0xfa, 0x2f, 0x1d, 0x92, 0x8b, 0x1e, 0xc1, 0x8c, 0xc5, 0xff, 0x27, 0x62, 0x8a, 0x11, 0x0b, - 0x53, 0x1b, 0x9e, 0x1b, 0xf8, 0x5e, 0xef, 0x1d, 0x4a, 0x7c, 0xe5, 0x1f, 0x11, 0x38, 0x16, 0x96, - 0x98, 0x88, 0xb0, 0x1a, 0x42, 0xfe, 0x5f, 0xc3, 0x14, 0x4f, 0x8a, 0xc7, 0x0d, 0x28, 0xf5, 0x84, - 0x84, 0xc3, 0x31, 0xf2, 0x14, 0x77, 0x7c, 0xe6, 0xf7, 0x0d, 0x58, 0x4c, 0x76, 0x1e, 0x99, 0x3e, - 0xcf, 0x08, 0xb6, 0x37, 0x93, 0x7d, 0xdd, 0x6d, 0x41, 0xc6, 0x21, 0x1f, 0xdd, 0x85, 0x59, 0x96, - 0x19, 0x62, 0x19, 0x6d, 0x33, 0xe6, 0x95, 0xfc, 0x7c, 0xbf, 0x2d, 0xf4, 0x70, 0x08, 0x60, 0xfe, - 0xa3, 0x01, 0x68, 0xbc, 0x37, 0x85, 0x76, 0xe0, 0x9c, 0x78, 0xb5, 0x2e, 0x2f, 0x5c, 0xb7, 0xb5, - 0xa1, 0x5d, 0x96, 0x43, 0x3b, 0xd7, 0x4c, 0x91, 0xc1, 0xa9, 0x9a, 0x51, 0x26, 0x9c, 0x3b, 0x7d, - 0x26, 0xfc, 0x0a, 0xcc, 0x0c, 0xd8, 0x5c, 0xb5, 0x65, 0xba, 0x1a, 0xad, 0xf8, 0x0e, 0xa7, 0x62, - 0xc9, 0x35, 0xff, 0x2e, 0x07, 0xd5, 0x49, 0x4f, 0x56, 0xbf, 0xd4, 0x5f, 0x86, 0xfa, 0xb0, 0xa0, - 0x0c, 0x81, 0xbf, 0xd5, 0x2c, 0x4c, 0x7f, 0x63, 0x1b, 0x56, 0x35, 0x4d, 0x1d, 0x0a, 0x27, 0xb1, - 0xcd, 0x16, 0x40, 0xfc, 0x00, 0x0f, 0x5d, 0x81, 0x82, 0x6b, 0xf5, 0xc3, 0xac, 0x2a, 0x8a, 0xc8, - 0xfc, 0x3f, 0x92, 0x38, 0x07, 0xbd, 0x04, 0xc5, 0x43, 0xab, 0x37, 0x0c, 0xff, 0xe5, 0x2b, 0x7a, - 0x46, 0xfb, 0x90, 0x11, 0xb1, 0xe0, 0x99, 0x7f, 0x92, 0x83, 0x8a, 0xf2, 0x40, 0xe4, 0x59, 0x15, - 0xcc, 0x2f, 0x40, 0xce, 0xa2, 0xbc, 0x40, 0x29, 0x8b, 0x1b, 0xbd, 0x75, 0x8a, 0x73, 0x16, 0x45, - 0xef, 0x42, 0x71, 0x60, 0x05, 0xfb, 0xe1, 0x23, 0xe0, 0x6b, 0xd3, 0x3d, 0x5f, 0x61, 0x05, 0x45, - 0xfc, 0x1d, 0xec, 0x17, 0xc5, 0x02, 0x2f, 0x51, 0x97, 0xe5, 0x9f, 0x5d, 0x5d, 0x66, 0x7e, 0xcf, - 0x80, 0x85, 0xc4, 0x18, 0xd0, 0x35, 0x00, 0x1a, 0xfd, 0x92, 0x4b, 0x10, 0xb5, 0xbe, 0x62, 0x39, - 0xac, 0x48, 0x3d, 0x75, 0x8b, 0xe3, 0x9f, 0x0c, 0xb8, 0x7c, 0xd2, 0xbd, 0x16, 0x2b, 0x9c, 0xe5, - 0xe5, 0x55, 0x54, 0xaa, 0x19, 0x7a, 0xe1, 0x7c, 0x57, 0x67, 0xe3, 0xa4, 0x3c, 0xba, 0x01, 0x15, - 0x85, 0x24, 0x07, 0x18, 0xa5, 0x79, 0x8a, 0x3a, 0x56, 0xe5, 0x9e, 0x22, 0xcb, 0x36, 0xff, 0xd6, - 0x80, 0x73, 0x69, 0xdd, 0x37, 0xd4, 0x0d, 0x9f, 0x8b, 0x8b, 0xd2, 0xaa, 0x71, 0xca, 0x2e, 0x5e, - 0x9d, 0x3f, 0x1a, 0xdf, 0x72, 0x03, 0xff, 0x28, 0xfd, 0x21, 0xf9, 0xa5, 0x5b, 0x00, 0xb1, 0x0c, - 0x5a, 0x84, 0xfc, 0x01, 0x39, 0x12, 0x13, 0x87, 0xd9, 0x9f, 0xe8, 0x9c, 0xb6, 0x8d, 0xe4, 0xbe, - 0x79, 0x33, 0x77, 0xcb, 0x78, 0xb3, 0xf4, 0x87, 0x7f, 0x5a, 0x3b, 0xf3, 0xc9, 0xcf, 0xaf, 0x9c, - 0x31, 0x7f, 0x68, 0x80, 0x9a, 0x04, 0xa3, 0xd7, 0xa0, 0xbc, 0x1f, 0x04, 0x03, 0x4e, 0x92, 0xaf, - 0x53, 0xf8, 0x93, 0xe9, 0xb7, 0x77, 0x77, 0x77, 0x38, 0x11, 0xc7, 0x7c, 0x54, 0x07, 0x60, 0x3f, - 0xa8, 0x90, 0x2e, 0xc4, 0x2f, 0xca, 0x98, 0x74, 0x4b, 0x88, 0x2b, 0x12, 0xa2, 0x56, 0x14, 0xc2, - 0xe2, 0xbf, 0x90, 0x64, 0xad, 0x28, 0x24, 0x43, 0x9e, 0xf9, 0x17, 0x06, 0x2c, 0x8d, 0xbd, 0x86, - 0x42, 0x3b, 0x51, 0x76, 0x3c, 0x6d, 0x03, 0x6f, 0x42, 0x1e, 0xfd, 0xd4, 0x7e, 0x7d, 0x0b, 0xce, - 0x09, 0x44, 0x6e, 0x35, 0x7e, 0xf9, 0xf1, 0xc4, 0x00, 0x67, 0xfe, 0x99, 0x01, 0x10, 0xb7, 0x94, - 0xd0, 0x1e, 0xcc, 0x89, 0x21, 0x69, 0x69, 0x5e, 0xf6, 0x0f, 0x3c, 0x27, 0x4d, 0xcc, 0xb5, 0x14, - 0x14, 0xac, 0x61, 0xa2, 0x55, 0x28, 0xf3, 0x4e, 0x2e, 0xdf, 0x5d, 0x39, 0xfd, 0xbf, 0x0a, 0xee, - 0x85, 0x0c, 0x1c, 0xcb, 0x98, 0x9f, 0xe4, 0x61, 0x39, 0xe5, 0xfe, 0xfd, 0xff, 0x74, 0x63, 0xf2, - 0x55, 0x98, 0x15, 0x4f, 0xb2, 0x69, 0x32, 0xf9, 0x12, 0x2f, 0xb6, 0x29, 0x0e, 0xf9, 0x68, 0x0d, - 0x2a, 0x8e, 0x6b, 0x8b, 0x7b, 0x0a, 0x2b, 0x6c, 0x48, 0x89, 0xab, 0xb8, 0x98, 0x8c, 0x55, 0x19, - 0xbd, 0x83, 0x35, 0xf3, 0xe4, 0x0e, 0x96, 0xf9, 0x6d, 0x58, 0x1a, 0x4b, 0x1f, 0xb3, 0x1d, 0x9f, - 0x84, 0xff, 0xbb, 0x6e, 0xe2, 0xf8, 0x14, 0xff, 0xa5, 0x2b, 0x78, 0xe6, 0x8f, 0x0c, 0x98, 0x4f, - 0xe4, 0xd9, 0xa7, 0x6a, 0x77, 0x3c, 0x50, 0xdb, 0x1d, 0xa7, 0xab, 0x11, 0xb4, 0xc6, 0x87, 0x79, - 0x17, 0xd2, 0x5f, 0xdd, 0x26, 0x67, 0xdc, 0x78, 0xf2, 0x8c, 0x9b, 0x3f, 0xc9, 0x41, 0x39, 0x7a, - 0xac, 0x84, 0xde, 0xd0, 0x66, 0xee, 0xa2, 0x3a, 0x73, 0x8f, 0x47, 0x35, 0x21, 0xa8, 0x4c, 0xe3, - 0xfb, 0x50, 0x8e, 0x1e, 0xbb, 0x45, 0xed, 0x9c, 0xec, 0xe9, 0x51, 0xb4, 0xb4, 0xd1, 0x0b, 0x3a, - 0x1c, 0xe3, 0xb1, 0xf4, 0x31, 0x7c, 0x8d, 0x76, 0xcf, 0xe9, 0xf5, 0x1c, 0x2a, 0x6f, 0x92, 0xf2, - 0xfc, 0x26, 0x29, 0x4a, 0x1f, 0x37, 0x53, 0x64, 0x70, 0xaa, 0x26, 0xda, 0x81, 0x22, 0x0d, 0xc8, - 0x80, 0xca, 0xe6, 0xea, 0x6b, 0x99, 0xde, 0x71, 0x91, 0x01, 0x2f, 0x8b, 0x23, 0x17, 0x61, 0x14, - 0x8a, 0x05, 0x90, 0xf9, 0x1f, 0x06, 0x94, 0x42, 0x11, 0xf4, 0xba, 0x36, 0x79, 0xd5, 0xc4, 0xe4, - 0x71, 0xb9, 0x2f, 0xed, 0xdc, 0x99, 0x23, 0x03, 0xe6, 0xf5, 0x3b, 0x69, 0xa5, 0x19, 0x63, 0x9c, - 0xd4, 0x8c, 0x41, 0xaf, 0x43, 0xc9, 0xea, 0xf5, 0xbc, 0x8f, 0xb6, 0xdc, 0x43, 0xd9, 0x00, 0x8d, - 0x2e, 0x59, 0xd7, 0x25, 0x1d, 0x47, 0x12, 0xe8, 0x10, 0x16, 0x84, 0x5e, 0xfc, 0xda, 0x30, 0x9f, - 0xf9, 0xae, 0x2f, 0xed, 0xb0, 0x69, 0x2c, 0xb3, 0xf4, 0xa8, 0xa5, 0x63, 0xe2, 0xa4, 0x91, 0xc6, - 0xd5, 0xcf, 0xbe, 0x58, 0x39, 0xf3, 0xb3, 0x2f, 0x56, 0xce, 0x7c, 0xfe, 0xc5, 0xca, 0x99, 0x4f, - 0x8e, 0x57, 0x8c, 0xcf, 0x8e, 0x57, 0x8c, 0x9f, 0x1d, 0xaf, 0x18, 0x9f, 0x1f, 0xaf, 0x18, 0xff, - 0x76, 0xbc, 0x62, 0xfc, 0xc1, 0xbf, 0xaf, 0x9c, 0xf9, 0x76, 0xee, 0x70, 0xed, 0x7f, 0x02, 0x00, - 0x00, 0xff, 0xff, 0x69, 0xe1, 0x46, 0xe4, 0x07, 0x43, 0x00, 0x00, + 0x76, 0x56, 0xcf, 0x0f, 0x39, 0xf3, 0x86, 0x22, 0xa9, 0xa2, 0x64, 0x8d, 0xb4, 0x5a, 0x8e, 0xdc, + 0x8e, 0x0d, 0x39, 0xb6, 0x87, 0x4b, 0x59, 0x52, 0x64, 0x1b, 0xd9, 0x80, 0x43, 0x52, 0x32, 0xb5, + 0x23, 0x89, 0xa8, 0xa1, 0x65, 0xef, 0x5a, 0xd8, 0xa4, 0xd9, 0x53, 0x33, 0x6c, 0x73, 0xa6, 0x7b, + 0xdc, 0xd5, 0x43, 0x9b, 0x0b, 0x04, 0x58, 0x04, 0x58, 0x24, 0xeb, 0xbd, 0x64, 0x2f, 0x8b, 0x24, + 0x97, 0x24, 0x58, 0xe4, 0x94, 0x53, 0x0e, 0x01, 0x36, 0xd8, 0x4b, 0x80, 0xec, 0xc1, 0x87, 0x04, + 0xd8, 0x20, 0x01, 0x62, 0x60, 0x17, 0x83, 0x98, 0x39, 0x04, 0xc8, 0x21, 0x40, 0x72, 0xd4, 0x21, + 0x08, 0xea, 0xa7, 0xbb, 0xab, 0x7a, 0x7a, 0xa8, 0x1e, 0x4a, 0x56, 0x9c, 0xe4, 0x36, 0x53, 0xef, + 0xbd, 0xef, 0xd5, 0xcf, 0xab, 0x57, 0xef, 0xbd, 0xaa, 0x86, 0xd5, 0xae, 0x13, 0xec, 0x0d, 0x77, + 0xeb, 0xb6, 0xd7, 0x5f, 0xf1, 0x06, 0xc4, 0xa5, 0x7b, 0x4e, 0x27, 0x58, 0xb1, 0x06, 0xce, 0xca, + 0xee, 0xd0, 0xe9, 0xb5, 0x57, 0x0e, 0x56, 0x57, 0xba, 0xc4, 0x25, 0xbe, 0x15, 0x90, 0x76, 0x7d, + 0xe0, 0x7b, 0x81, 0x87, 0x9e, 0x8f, 0x45, 0xea, 0x91, 0x48, 0xdd, 0x1a, 0x38, 0x75, 0x2e, 0x52, + 0x3f, 0x58, 0xbd, 0xf8, 0x9a, 0x82, 0xda, 0xf5, 0xba, 0xde, 0x0a, 0x97, 0xdc, 0x1d, 0x76, 0xf8, + 0x3f, 0xfe, 0x87, 0xff, 0x12, 0x88, 0x17, 0xcd, 0xfd, 0x9b, 0xb4, 0xee, 0x78, 0x5c, 0xad, 0xed, + 0xf9, 0x24, 0x45, 0xeb, 0xc5, 0x6b, 0x31, 0x4f, 0xdf, 0xb2, 0xf7, 0x1c, 0x97, 0xf8, 0x87, 0x2b, + 0x83, 0xfd, 0x2e, 0x6b, 0xa0, 0x2b, 0x7d, 0x12, 0x58, 0x69, 0x52, 0x37, 0x26, 0x49, 0xf9, 0x43, + 0x37, 0x70, 0xfa, 0x64, 0x85, 0xda, 0x7b, 0xa4, 0x6f, 0x25, 0xe5, 0xcc, 0xbf, 0x2e, 0xc0, 0x85, + 0x86, 0xe3, 0x5a, 0xfe, 0x61, 0x83, 0x8d, 0x09, 0x93, 0x0f, 0x87, 0x84, 0x06, 0xf7, 0x07, 0x81, + 0xe3, 0xb9, 0x14, 0xfd, 0x16, 0x94, 0x98, 0xc2, 0xb6, 0x15, 0x58, 0x55, 0xe3, 0xb2, 0x71, 0xa5, + 0x72, 0xf5, 0x6b, 0x75, 0xa1, 0xa8, 0xae, 0x2a, 0xaa, 0x0f, 0xf6, 0xbb, 0xac, 0x81, 0xd6, 0x19, + 0x77, 0xfd, 0x60, 0xb5, 0x7e, 0x7f, 0xf7, 0x03, 0x62, 0x07, 0x77, 0x49, 0x60, 0x35, 0xd0, 0xa7, + 0xa3, 0xda, 0xa9, 0xa3, 0x51, 0x0d, 0xe2, 0x36, 0x1c, 0xa1, 0xa2, 0x97, 0x60, 0xc6, 0xa2, 0xb7, + 0x9c, 0x1e, 0xa9, 0xe6, 0x2e, 0x1b, 0x57, 0xca, 0x8d, 0x79, 0xc9, 0x3d, 0xb3, 0xc6, 0x5b, 0xb1, + 0xa4, 0xa2, 0x1b, 0x30, 0xef, 0x93, 0x03, 0x87, 0x3a, 0x9e, 0xbb, 0xee, 0xf5, 0xfb, 0x4e, 0x50, + 0xcd, 0xeb, 0xfc, 0xa2, 0x15, 0x27, 0xb8, 0xd0, 0x1b, 0xb0, 0x10, 0xb6, 0xdc, 0x25, 0x94, 0x5a, + 0x5d, 0x52, 0x2d, 0x70, 0xc1, 0x05, 0x29, 0x38, 0x2b, 0x9b, 0x71, 0x92, 0x0f, 0x35, 0x00, 0x85, + 0x4d, 0x6b, 0xc3, 0x60, 0xcf, 0xf3, 0xef, 0x59, 0x7d, 0x52, 0x2d, 0x72, 0xe9, 0x68, 0x50, 0x31, + 0x05, 0xa7, 0x70, 0xa3, 0x4d, 0x58, 0xd2, 0x5b, 0x37, 0xfb, 0x96, 0xd3, 0xab, 0xce, 0x70, 0x90, + 0x25, 0x09, 0x52, 0x51, 0x48, 0x38, 0x8d, 0x1f, 0x7d, 0x03, 0xce, 0xe9, 0xe3, 0x0a, 0x88, 0xe8, + 0xcd, 0x2c, 0x07, 0x3a, 0x27, 0x81, 0x4e, 0x6b, 0x44, 0x9c, 0x2e, 0x83, 0xee, 0xc1, 0x73, 0x63, + 0x04, 0xd1, 0xad, 0x12, 0x47, 0x7b, 0x4e, 0xa2, 0xcd, 0xeb, 0x54, 0x3c, 0x41, 0xca, 0x7c, 0x0b, + 0xce, 0x28, 0x16, 0xd4, 0xf2, 0x86, 0xbe, 0x4d, 0x94, 0x75, 0x35, 0x8e, 0x5b, 0x57, 0xf3, 0x13, + 0x03, 0xce, 0x35, 0x9c, 0x60, 0x77, 0x68, 0xef, 0x93, 0xe0, 0x5d, 0xb2, 0xfb, 0xb6, 0xe7, 0xed, + 0xaf, 0x5b, 0x43, 0x4a, 0xd0, 0x87, 0x00, 0xb6, 0xd7, 0xef, 0x7b, 0x6e, 0x6b, 0x40, 0x6c, 0x69, + 0x7d, 0xd7, 0xeb, 0x8f, 0xdd, 0x92, 0xf5, 0x75, 0x2e, 0xa4, 0x42, 0x35, 0x2e, 0x4a, 0xe5, 0x68, + 0x9c, 0x86, 0x15, 0x25, 0xe6, 0x0f, 0x73, 0x50, 0xe4, 0x83, 0x78, 0x06, 0x86, 0x7f, 0x0f, 0x0a, + 0x94, 0x0d, 0x2c, 0xc7, 0xd1, 0x5f, 0xcd, 0x30, 0x30, 0x31, 0xbd, 0x03, 0x62, 0x37, 0xe6, 0x24, + 0x72, 0x81, 0xfd, 0xc3, 0x1c, 0x07, 0x3d, 0x80, 0x19, 0x1a, 0x58, 0xc1, 0x90, 0xf2, 0x8d, 0x51, + 0xb9, 0x5a, 0xcf, 0x8c, 0xc8, 0xa5, 0xe2, 0x05, 0x12, 0xff, 0xb1, 0x44, 0x33, 0xff, 0x2e, 0x0f, + 0xf3, 0x9c, 0x6f, 0xdd, 0x73, 0xdb, 0x0e, 0x73, 0x0b, 0xe8, 0x06, 0x14, 0x82, 0xc3, 0x41, 0xb8, + 0xb2, 0x66, 0xd8, 0x99, 0x9d, 0xc3, 0x01, 0x79, 0x34, 0xaa, 0x21, 0x9d, 0x9b, 0xb5, 0x62, 0xce, + 0x8f, 0x9a, 0x51, 0x17, 0xc5, 0x5e, 0xbf, 0xa6, 0xab, 0x7c, 0x34, 0xaa, 0xa5, 0xf8, 0xc7, 0x7a, + 0x84, 0xa4, 0x77, 0x0c, 0x7d, 0x00, 0xf3, 0x3d, 0x8b, 0x06, 0xef, 0x0c, 0xda, 0x56, 0x40, 0x76, + 0x9c, 0x3e, 0xe1, 0xbb, 0xaa, 0x72, 0xf5, 0x57, 0xb3, 0x2d, 0x14, 0x93, 0x88, 0x4d, 0xbd, 0xa9, + 0x21, 0xe1, 0x04, 0x32, 0x3a, 0x00, 0xc4, 0x5a, 0x76, 0x7c, 0xcb, 0xa5, 0x62, 0x54, 0x4c, 0x5f, + 0x7e, 0x6a, 0x7d, 0x91, 0x21, 0x36, 0xc7, 0xd0, 0x70, 0x8a, 0x06, 0xb6, 0x8b, 0x7c, 0x62, 0x51, + 0xcf, 0x95, 0x4e, 0x2b, 0x5a, 0x24, 0xcc, 0x5b, 0xb1, 0xa4, 0xa2, 0x97, 0x61, 0xb6, 0x2f, 0xbd, + 0x5b, 0x31, 0xdd, 0xbb, 0x85, 0x74, 0xf3, 0xc7, 0x39, 0xa8, 0x84, 0x2b, 0xd4, 0x71, 0xba, 0xcf, + 0xc0, 0xd2, 0x77, 0x34, 0x4b, 0xbf, 0x9a, 0xd5, 0x2e, 0x45, 0xff, 0x26, 0xda, 0xfb, 0xc3, 0x84, + 0xbd, 0x5f, 0x9b, 0x12, 0xf7, 0x78, 0xab, 0xff, 0x99, 0x01, 0x0b, 0x0a, 0x77, 0xd3, 0xa1, 0x01, + 0x7a, 0x38, 0x36, 0x53, 0xf5, 0x6c, 0x33, 0xc5, 0xa4, 0xf9, 0x3c, 0x2d, 0x4a, 0x6d, 0xa5, 0xb0, + 0x45, 0x99, 0xa5, 0x16, 0x14, 0x9d, 0x80, 0xf4, 0xd9, 0xde, 0xc8, 0x4f, 0xb3, 0x7d, 0x45, 0x07, + 0x1b, 0xa7, 0x25, 0x74, 0x71, 0x8b, 0x81, 0x60, 0x81, 0x65, 0xfe, 0x32, 0xaf, 0x0d, 0x83, 0x4d, + 0x1f, 0xb2, 0xa1, 0x14, 0xf8, 0x4e, 0xb7, 0x4b, 0x7c, 0x5a, 0x35, 0xb8, 0xae, 0xeb, 0x59, 0x75, + 0xed, 0x08, 0xb9, 0x6d, 0xaf, 0xe7, 0xd8, 0x87, 0xf1, 0x68, 0x64, 0x33, 0xc5, 0x11, 0x30, 0x5a, + 0x83, 0xb2, 0x3f, 0x74, 0x05, 0xa3, 0xdc, 0xed, 0x2f, 0x48, 0xf6, 0x32, 0x0e, 0x09, 0x8f, 0x46, + 0x35, 0xe1, 0x5a, 0xa2, 0x16, 0x1c, 0x4b, 0x21, 0x4b, 0xf3, 0xff, 0x62, 0x91, 0x5f, 0xcb, 0xec, + 0xff, 0xb9, 0xdd, 0x44, 0x76, 0x19, 0xb7, 0xa9, 0xfe, 0x1e, 0xb5, 0xe1, 0x12, 0x1d, 0xda, 0x36, + 0xa1, 0xb4, 0x33, 0xec, 0xf1, 0x9e, 0xd0, 0xb7, 0x1d, 0x1a, 0x78, 0xfe, 0x61, 0xd3, 0x61, 0x21, + 0x06, 0xdb, 0x74, 0xc5, 0xc6, 0xe5, 0xa3, 0x51, 0xed, 0x52, 0xeb, 0x18, 0x3e, 0x7c, 0x2c, 0x0a, + 0x7a, 0x0f, 0xaa, 0x1d, 0xcb, 0xe9, 0x91, 0x76, 0x8a, 0x86, 0x22, 0xd7, 0x70, 0xe9, 0x68, 0x54, + 0xab, 0xde, 0x9a, 0xc0, 0x83, 0x27, 0x4a, 0x9b, 0xff, 0x64, 0xc0, 0x99, 0x31, 0x9b, 0x46, 0xd7, + 0xa1, 0xc2, 0x5c, 0xc9, 0x03, 0xe2, 0xb3, 0xc3, 0x9a, 0x9b, 0x6a, 0x3e, 0x8e, 0x35, 0x9a, 0x31, + 0x09, 0xab, 0x7c, 0xe8, 0x13, 0x03, 0x96, 0x9c, 0xbe, 0xd5, 0x25, 0xeb, 0x7b, 0x96, 0xdb, 0x25, + 0xe1, 0xa2, 0x4a, 0x7b, 0x7c, 0x2b, 0xc3, 0xcc, 0x6f, 0x8d, 0x49, 0xcb, 0x5d, 0xf6, 0x15, 0xa9, + 0x7c, 0x69, 0x9c, 0x83, 0xe2, 0x34, 0xa5, 0xe6, 0x4f, 0x0c, 0x28, 0xf3, 0x91, 0x3d, 0x83, 0x9d, + 0x77, 0x57, 0xdf, 0x79, 0x57, 0xb2, 0xee, 0x86, 0x09, 0x7b, 0x0e, 0xa0, 0x24, 0x7a, 0xee, 0x75, + 0xcd, 0xff, 0x28, 0xc8, 0xfd, 0xd7, 0xf4, 0xba, 0x61, 0x4c, 0xbd, 0x02, 0x65, 0xdb, 0x73, 0x03, + 0x8b, 0x75, 0x59, 0x1e, 0xa1, 0x67, 0xc2, 0xad, 0xb1, 0x1e, 0x12, 0x70, 0xcc, 0xc3, 0x0e, 0x81, + 0x8e, 0xd7, 0xeb, 0x79, 0x1f, 0xf1, 0x8d, 0x54, 0x8a, 0x7d, 0xd6, 0x2d, 0xde, 0x8a, 0x25, 0x15, + 0xbd, 0x0a, 0xa5, 0x01, 0x0b, 0xd1, 0x3c, 0xe9, 0x13, 0x4b, 0xf1, 0xa8, 0xb7, 0x65, 0x3b, 0x8e, + 0x38, 0xd0, 0x35, 0x98, 0xa3, 0x8e, 0x6b, 0x93, 0x16, 0xb1, 0x3d, 0xb7, 0x4d, 0xb9, 0xad, 0xe7, + 0x1b, 0x8b, 0x47, 0xa3, 0xda, 0x5c, 0x4b, 0x69, 0xc7, 0x1a, 0x17, 0x7a, 0x17, 0xca, 0xfc, 0x3f, + 0x3f, 0xff, 0x8a, 0x53, 0x9f, 0x7f, 0xa7, 0xd9, 0x20, 0x5b, 0x21, 0x00, 0x8e, 0xb1, 0xd0, 0x55, + 0x00, 0x96, 0xa6, 0xd0, 0xc0, 0xea, 0x0f, 0x28, 0x3f, 0xc9, 0x4b, 0xf1, 0xf6, 0xdd, 0x89, 0x28, + 0x58, 0xe1, 0x42, 0xaf, 0x40, 0x39, 0xb0, 0x9c, 0x5e, 0xd3, 0x71, 0x09, 0xe5, 0x91, 0x70, 0x5e, + 0x28, 0xd8, 0x09, 0x1b, 0x71, 0x4c, 0x47, 0x75, 0x80, 0x1e, 0xdb, 0x34, 0x8d, 0xc3, 0x80, 0x50, + 0x1e, 0xe9, 0xe6, 0x1b, 0xf3, 0x0c, 0xbc, 0x19, 0xb5, 0x62, 0x85, 0x83, 0xcd, 0xba, 0xeb, 0x7d, + 0x64, 0x39, 0x41, 0xb5, 0xac, 0xcf, 0xfa, 0x3d, 0xef, 0x5d, 0xcb, 0x09, 0xb0, 0xa4, 0xa2, 0x17, + 0x61, 0xf6, 0x40, 0xee, 0x34, 0xe0, 0xa0, 0x15, 0x76, 0xec, 0x86, 0x3b, 0x2c, 0xa4, 0xa1, 0x3d, + 0xb8, 0xe4, 0xb8, 0x94, 0xd8, 0x43, 0x9f, 0xb4, 0xf6, 0x9d, 0xc1, 0x4e, 0xb3, 0xf5, 0x80, 0xf8, + 0x4e, 0xe7, 0xb0, 0x61, 0xd9, 0xfb, 0xc4, 0x6d, 0x57, 0x2b, 0x5c, 0xc9, 0xaf, 0x48, 0x25, 0x97, + 0xb6, 0x8e, 0xe1, 0xc5, 0xc7, 0x22, 0x99, 0x9f, 0x84, 0x07, 0xfc, 0xfd, 0x61, 0x30, 0x18, 0x06, + 0xe8, 0x2d, 0xc8, 0x05, 0x9e, 0xdc, 0x36, 0x2f, 0x28, 0x6b, 0x55, 0x67, 0x01, 0x56, 0x7c, 0x90, + 0x63, 0xd2, 0x21, 0x3e, 0x71, 0x6d, 0xd2, 0x98, 0x39, 0x1a, 0xd5, 0x72, 0x3b, 0x1e, 0xce, 0x05, + 0x1e, 0x7a, 0x0f, 0x60, 0x30, 0xa4, 0x7b, 0x2d, 0x62, 0xfb, 0x24, 0x90, 0x27, 0xf8, 0x95, 0x34, + 0x90, 0xa6, 0x67, 0x5b, 0xbd, 0x24, 0x12, 0x9f, 0xdf, 0xed, 0x48, 0x1e, 0x2b, 0x58, 0xa8, 0x0d, + 0x15, 0xbe, 0xf1, 0x9b, 0xd6, 0x2e, 0xe9, 0x31, 0x83, 0xcd, 0x67, 0xf4, 0xef, 0x5b, 0x91, 0x54, + 0xec, 0xd4, 0xe2, 0x36, 0x8a, 0x55, 0x58, 0xf3, 0x77, 0x0c, 0x58, 0xe2, 0x93, 0xb1, 0xed, 0xd1, + 0x40, 0xe4, 0x2d, 0xdc, 0xf3, 0xbf, 0x08, 0xb3, 0xec, 0x1c, 0xb0, 0xdc, 0x36, 0x3f, 0x03, 0xcb, + 0x62, 0xd5, 0xd6, 0x45, 0x13, 0x0e, 0x69, 0xe8, 0x12, 0x14, 0x2c, 0xbf, 0x2b, 0x3c, 0x43, 0xb9, + 0x51, 0x62, 0x21, 0xc8, 0x9a, 0xdf, 0xa5, 0x98, 0xb7, 0x32, 0x13, 0xa1, 0xb6, 0xef, 0x0c, 0xc6, + 0x72, 0xd1, 0x16, 0x6f, 0xc5, 0x92, 0x6a, 0xfe, 0x6c, 0x16, 0xe6, 0xd4, 0xec, 0xfa, 0x19, 0xc4, + 0x5c, 0xef, 0x43, 0x29, 0xcc, 0xd6, 0xe4, 0xaa, 0xad, 0x66, 0x98, 0x5a, 0x91, 0xbb, 0x61, 0x29, + 0xd8, 0x98, 0x63, 0xae, 0x23, 0xfc, 0x87, 0x23, 0x40, 0x44, 0x60, 0x51, 0x1e, 0xf4, 0xa4, 0xdd, + 0x38, 0xe4, 0x73, 0x2f, 0xcf, 0xe7, 0x4c, 0xf6, 0x75, 0xf6, 0x68, 0x54, 0x5b, 0xdc, 0x49, 0x00, + 0xe0, 0x31, 0x48, 0xb4, 0x06, 0x85, 0x8e, 0xef, 0xf5, 0xb9, 0x67, 0xca, 0x08, 0xcd, 0x57, 0xe8, + 0x96, 0xef, 0xf5, 0x31, 0x17, 0x45, 0xef, 0xc1, 0xcc, 0x2e, 0x4f, 0x4d, 0xa5, 0xaf, 0xca, 0x14, + 0x24, 0x26, 0x73, 0xd9, 0x06, 0xb0, 0x35, 0x15, 0xcd, 0x58, 0xe2, 0xa1, 0x55, 0xfd, 0x90, 0x9d, + 0xe1, 0x5b, 0x7f, 0xe1, 0xd8, 0x03, 0xf6, 0x0d, 0xc8, 0x13, 0xf7, 0xa0, 0x3a, 0xcb, 0x2d, 0xfd, + 0x62, 0xda, 0x70, 0x36, 0xdd, 0x83, 0x07, 0x96, 0xdf, 0xa8, 0xc8, 0xa5, 0xcd, 0x6f, 0xba, 0x07, + 0x98, 0xc9, 0xa0, 0x7d, 0xa8, 0x28, 0xd3, 0x53, 0x2d, 0x71, 0x88, 0x6b, 0x53, 0x86, 0x6d, 0x22, + 0x17, 0x8e, 0xf6, 0x8c, 0xb2, 0x02, 0x58, 0x45, 0x47, 0xdf, 0x37, 0xe0, 0x5c, 0xdb, 0xb3, 0xf7, + 0xd9, 0xf1, 0xed, 0x5b, 0x01, 0xe9, 0x1e, 0xca, 0xa3, 0x8b, 0x7b, 0xc2, 0xca, 0xd5, 0x9b, 0x19, + 0xf4, 0x6e, 0xa4, 0xc9, 0x37, 0x2e, 0x1c, 0x8d, 0x6a, 0xe7, 0x52, 0x49, 0x38, 0x5d, 0x23, 0xef, + 0x0b, 0xe5, 0xab, 0x90, 0xec, 0x0b, 0x64, 0xee, 0x4b, 0x2b, 0x4d, 0x5e, 0xf4, 0x25, 0x95, 0x84, + 0xd3, 0x35, 0x9a, 0xff, 0x58, 0x94, 0x8e, 0x55, 0x96, 0x38, 0x5e, 0xd7, 0xd2, 0xe0, 0x5a, 0x22, + 0x0d, 0x5e, 0x50, 0x58, 0x95, 0x1c, 0x38, 0xb6, 0xc8, 0xdc, 0x53, 0xb6, 0xc8, 0x3a, 0x80, 0x98, + 0xc3, 0x8e, 0xd3, 0x23, 0xa1, 0x47, 0x62, 0x0e, 0x62, 0x23, 0x6a, 0xc5, 0x0a, 0x07, 0x6a, 0x42, + 0xbe, 0x2b, 0x63, 0xdc, 0x6c, 0xde, 0xe1, 0xb6, 0x13, 0xa8, 0x7d, 0x98, 0x65, 0x16, 0x7a, 0xdb, + 0x09, 0x30, 0x83, 0x41, 0x0f, 0x60, 0x86, 0xfb, 0x5d, 0x5a, 0x2d, 0x66, 0xce, 0x5f, 0xf8, 0x36, + 0x97, 0x68, 0x91, 0xef, 0xe4, 0x8d, 0x14, 0x4b, 0x34, 0x16, 0x17, 0xb0, 0x48, 0x88, 0x7c, 0x1c, + 0x6c, 0x38, 0xbe, 0xac, 0x9b, 0x29, 0x61, 0x7d, 0x48, 0xc1, 0x0a, 0x17, 0xfa, 0x36, 0xcc, 0xc9, + 0x15, 0x14, 0xc7, 0xd6, 0xec, 0x94, 0xc7, 0x96, 0x08, 0x82, 0x14, 0x04, 0xac, 0xe1, 0xa1, 0xdf, + 0x84, 0x59, 0xca, 0x7f, 0xd1, 0x29, 0x76, 0xa2, 0x90, 0x55, 0x27, 0x30, 0xca, 0xd1, 0x05, 0x89, + 0xe2, 0x10, 0x15, 0xed, 0xf3, 0x41, 0x77, 0x9c, 0xee, 0x5d, 0x6b, 0xc0, 0x76, 0x1d, 0xd3, 0xf1, + 0x6b, 0x99, 0x52, 0x1f, 0x29, 0xa4, 0xaa, 0x51, 0x67, 0x4b, 0x42, 0x62, 0x05, 0xde, 0xfc, 0x45, + 0x18, 0x6a, 0xf3, 0x83, 0xd1, 0x4a, 0xa9, 0xba, 0x3d, 0xe5, 0xac, 0x2b, 0xe1, 0xcc, 0x72, 0x5f, + 0xa4, 0x33, 0x33, 0xff, 0x7d, 0x36, 0xdc, 0xb4, 0x22, 0x39, 0x5a, 0x85, 0xe2, 0x60, 0xcf, 0xa2, + 0xe1, 0xae, 0x0d, 0x33, 0x93, 0xe2, 0x36, 0x6b, 0x7c, 0x34, 0xaa, 0x81, 0x88, 0x16, 0xd8, 0x3f, + 0x2c, 0x38, 0x79, 0xc0, 0x6e, 0xb9, 0x36, 0xe9, 0xf5, 0x48, 0x5b, 0x86, 0xe0, 0x71, 0xc0, 0x1e, + 0x12, 0x70, 0xcc, 0x83, 0x6e, 0x44, 0x55, 0x1b, 0xb1, 0x0b, 0x97, 0xf5, 0xaa, 0xcd, 0x23, 0x66, + 0x5d, 0xa2, 0xdc, 0x30, 0xb1, 0x8a, 0x53, 0x38, 0xbe, 0x8a, 0x83, 0x3a, 0x30, 0x4f, 0x03, 0xcb, + 0x0f, 0xa2, 0xc8, 0xf8, 0x04, 0xc1, 0x38, 0x3a, 0x1a, 0xd5, 0xe6, 0x5b, 0x1a, 0x0a, 0x4e, 0xa0, + 0xa2, 0x21, 0x2c, 0xd9, 0x5e, 0x7f, 0xd0, 0x23, 0x61, 0x49, 0x4a, 0x28, 0x9b, 0xbe, 0xd2, 0x76, + 0x9e, 0xa5, 0x7f, 0xeb, 0xe3, 0x50, 0x38, 0x0d, 0x1f, 0xfd, 0x3a, 0x94, 0xda, 0x43, 0xdf, 0x62, + 0x8d, 0x32, 0xb0, 0x7f, 0x3e, 0x4c, 0x65, 0x36, 0x64, 0xfb, 0xa3, 0x51, 0xed, 0x34, 0xcb, 0x05, + 0xea, 0x61, 0x03, 0x8e, 0x44, 0xd0, 0x2e, 0x5c, 0xf4, 0x78, 0xf0, 0x2b, 0x5c, 0x9f, 0x08, 0x30, + 0xc2, 0xed, 0x2d, 0xab, 0xdc, 0x61, 0xd9, 0xf2, 0xe2, 0xfd, 0x89, 0x9c, 0xf8, 0x18, 0x14, 0x74, + 0x1b, 0x66, 0xc4, 0x26, 0x92, 0xa7, 0x62, 0xa6, 0xf8, 0x04, 0xc4, 0x4d, 0x05, 0x13, 0xc3, 0x52, + 0x1c, 0x3d, 0x84, 0x19, 0xa1, 0x46, 0x1e, 0x69, 0xd7, 0xa6, 0x2b, 0xdc, 0x8a, 0xee, 0xc7, 0xfe, + 0x53, 0xfc, 0xc7, 0x12, 0x13, 0xed, 0xf0, 0x32, 0x19, 0xf3, 0xcb, 0x15, 0xbe, 0xcf, 0xb2, 0x14, + 0x9a, 0x5b, 0x4c, 0x60, 0xcb, 0xed, 0x78, 0x5a, 0x79, 0x8c, 0x7b, 0x65, 0x81, 0xc5, 0xbc, 0x72, + 0xcf, 0xeb, 0xb6, 0x5c, 0x67, 0x30, 0x20, 0x41, 0x75, 0x4e, 0xf7, 0xca, 0xcd, 0x88, 0x82, 0x15, + 0x2e, 0x44, 0xb8, 0x53, 0x13, 0xa5, 0x5c, 0x5a, 0x3d, 0xcd, 0x7b, 0xb3, 0x3a, 0x45, 0x95, 0x4b, + 0x48, 0x6a, 0xee, 0x4c, 0x82, 0x61, 0x05, 0xd8, 0xb4, 0x65, 0x49, 0x44, 0x9d, 0x1d, 0x74, 0x4f, + 0xc9, 0x81, 0x6e, 0x9c, 0x64, 0x7e, 0x77, 0x3c, 0x35, 0x2d, 0x32, 0x9b, 0x32, 0xab, 0xd0, 0x59, + 0xd0, 0x75, 0x99, 0xd3, 0x6c, 0x38, 0x5d, 0x42, 0x03, 0xe9, 0x62, 0xf4, 0x24, 0x45, 0x90, 0xb0, + 0xca, 0x67, 0xfe, 0xb4, 0x00, 0xa7, 0x25, 0x9c, 0x88, 0x38, 0xd0, 0x75, 0x2d, 0xb4, 0x78, 0x3e, + 0x11, 0x5a, 0x9c, 0xd1, 0x98, 0x95, 0xe0, 0xc2, 0x87, 0x79, 0x3d, 0x8c, 0x92, 0x41, 0xc6, 0x8d, + 0xcc, 0x11, 0x9b, 0x86, 0x2c, 0x3c, 0x84, 0x1e, 0xaf, 0xe1, 0x84, 0x06, 0xa6, 0x53, 0x0f, 0x97, + 0x64, 0x2a, 0x70, 0x23, 0x73, 0x64, 0x96, 0xa2, 0x53, 0x8f, 0xcb, 0x70, 0x42, 0x03, 0xd3, 0x69, + 0x0f, 0x69, 0xe0, 0xf5, 0x23, 0x9d, 0x85, 0xcc, 0x3a, 0xd7, 0xb9, 0x60, 0x8a, 0xce, 0x75, 0x0d, + 0x11, 0x27, 0x34, 0xa0, 0x1f, 0x19, 0x70, 0xfe, 0x03, 0xe2, 0xee, 0x3b, 0x2e, 0xdd, 0x76, 0x06, + 0xa4, 0xe7, 0xb8, 0xf1, 0x88, 0x85, 0xef, 0xfd, 0x8d, 0x0c, 0xda, 0xef, 0xe8, 0x08, 0x7a, 0x37, + 0xbe, 0x72, 0x34, 0xaa, 0x9d, 0xbf, 0x93, 0xae, 0x03, 0x4f, 0x52, 0x6e, 0x7e, 0xaf, 0x28, 0x2d, + 0x5e, 0x3d, 0x19, 0xd5, 0xb3, 0xc4, 0x78, 0xcc, 0x59, 0xe2, 0xc3, 0x3c, 0xbf, 0x15, 0x76, 0x6c, + 0x79, 0x31, 0x36, 0x85, 0xd5, 0xdc, 0xd6, 0x04, 0xc5, 0xa1, 0xcc, 0x67, 0x53, 0x27, 0xe0, 0x84, + 0x06, 0xe4, 0xc2, 0x69, 0x01, 0x1e, 0xaa, 0xcc, 0x67, 0xbe, 0xdf, 0xbb, 0xed, 0x04, 0x6f, 0x47, + 0x72, 0x42, 0xe3, 0x99, 0xa3, 0x51, 0xed, 0xb4, 0xd6, 0x8e, 0x75, 0x78, 0x34, 0x84, 0x45, 0xa5, + 0xcc, 0xc8, 0xa7, 0x4b, 0xda, 0xcc, 0xeb, 0xd3, 0x15, 0x36, 0x85, 0x42, 0x9e, 0xc2, 0x6e, 0x25, + 0x00, 0xf1, 0x98, 0x0a, 0x39, 0xcc, 0x9e, 0x15, 0x0d, 0xb3, 0x38, 0xcd, 0x30, 0x9b, 0x56, 0xfa, + 0x30, 0xe3, 0x76, 0xac, 0xc3, 0xa3, 0xef, 0xc0, 0xe2, 0x6e, 0xe2, 0x32, 0x55, 0x9e, 0xd5, 0x37, + 0x33, 0xe5, 0x19, 0x29, 0xf7, 0xb0, 0x62, 0xac, 0x49, 0x12, 0x1e, 0xd3, 0x63, 0xfe, 0xa4, 0x00, + 0x68, 0xfc, 0x96, 0x00, 0x5d, 0xd3, 0x5c, 0xd9, 0xe5, 0x84, 0x2b, 0x5b, 0x54, 0x25, 0x14, 0x4f, + 0xf6, 0x10, 0x66, 0x44, 0x7f, 0xa7, 0xa8, 0x5e, 0xc8, 0x8e, 0x48, 0xb0, 0x34, 0xa3, 0x90, 0x98, + 0x2c, 0x80, 0x97, 0xf6, 0x28, 0xed, 0xee, 0x04, 0xf0, 0x69, 0x56, 0x1e, 0xa2, 0xa2, 0x3d, 0x79, + 0x10, 0x08, 0x5b, 0x90, 0x96, 0x76, 0xfd, 0x44, 0x25, 0x74, 0x51, 0x54, 0x50, 0xda, 0xb1, 0x0a, + 0x2d, 0x27, 0xaa, 0x67, 0xed, 0x4a, 0xd3, 0x7a, 0x82, 0x89, 0x52, 0xcc, 0x4a, 0x62, 0x22, 0x02, + 0xe5, 0x68, 0x9d, 0xa5, 0x21, 0x9d, 0x40, 0x41, 0xba, 0x05, 0xc5, 0xc8, 0xe6, 0xbf, 0x19, 0x32, + 0x48, 0x7f, 0xe0, 0xf5, 0x86, 0x7d, 0x82, 0x2e, 0x43, 0xc1, 0xb5, 0xfa, 0xa1, 0xcd, 0x44, 0xb7, + 0x7f, 0xfc, 0x51, 0x03, 0xa7, 0xf0, 0xdb, 0x3f, 0x7e, 0x26, 0x4c, 0x93, 0x46, 0xc7, 0x1a, 0x92, + 0x49, 0xa7, 0x2c, 0x7c, 0x49, 0x4c, 0xf4, 0x3e, 0xcc, 0xf4, 0xbd, 0xa1, 0x1b, 0x84, 0x65, 0xc9, + 0xd7, 0xa7, 0x43, 0xbf, 0xcb, 0x64, 0x63, 0x70, 0xfe, 0x97, 0x62, 0x09, 0x69, 0xbe, 0x03, 0x8b, + 0x49, 0x5e, 0xb4, 0x06, 0x0b, 0x6d, 0x42, 0x03, 0xc7, 0xe5, 0xf1, 0xeb, 0xb6, 0x15, 0xec, 0xc9, + 0xb1, 0x9f, 0x97, 0x20, 0x0b, 0x1b, 0x3a, 0x19, 0x27, 0xf9, 0xcd, 0xff, 0x0c, 0xef, 0x82, 0xd4, + 0x11, 0xa2, 0x37, 0xb4, 0xdd, 0xf7, 0x62, 0x62, 0xf7, 0x9d, 0x1b, 0x13, 0x50, 0xb6, 0xe0, 0x1d, + 0x98, 0xa1, 0x6a, 0xd9, 0xf7, 0xa5, 0xb4, 0x00, 0x57, 0xa4, 0xae, 0xda, 0xa4, 0xf2, 0x18, 0x57, + 0xe6, 0xcd, 0x12, 0x01, 0x3d, 0xe0, 0x77, 0x1e, 0x22, 0xe3, 0x94, 0x5b, 0xee, 0xe5, 0x34, 0xb8, + 0x28, 0x45, 0xd5, 0x10, 0x4f, 0xcb, 0xab, 0x11, 0x41, 0xc2, 0x31, 0x94, 0xf9, 0x7b, 0xb3, 0xa0, + 0x64, 0x99, 0xe8, 0xeb, 0x30, 0x4f, 0x89, 0x7f, 0xe0, 0xd8, 0x64, 0xcd, 0xb6, 0xd9, 0xc4, 0xca, + 0x71, 0x47, 0xd7, 0xfc, 0x2d, 0x8d, 0x8a, 0x13, 0xdc, 0xfc, 0x0d, 0x85, 0x6a, 0x55, 0xd9, 0xdf, + 0x50, 0x3c, 0xce, 0x9e, 0xe2, 0x6a, 0x6c, 0xfe, 0x69, 0x57, 0x63, 0xbf, 0x0d, 0x25, 0xaa, 0x87, + 0x41, 0x5f, 0xcb, 0x1e, 0xe1, 0xca, 0xc8, 0x23, 0xba, 0x28, 0x8a, 0xc2, 0x8d, 0x08, 0x93, 0x4d, + 0x8a, 0xcc, 0x4f, 0x8a, 0xd3, 0x4d, 0xca, 0x63, 0x32, 0x93, 0x6f, 0x42, 0xd9, 0x27, 0x62, 0x82, + 0xa8, 0xf4, 0x2d, 0xa9, 0x25, 0x1a, 0x2c, 0x99, 0x30, 0xf9, 0x70, 0xe8, 0xf8, 0xa4, 0x4f, 0xdc, + 0x80, 0xc6, 0x09, 0x78, 0x48, 0xa5, 0x38, 0x46, 0x43, 0x1f, 0x00, 0x0c, 0xa2, 0x7a, 0xbf, 0x2c, + 0xff, 0x64, 0x0e, 0xfb, 0xf5, 0x9b, 0x82, 0x38, 0xdf, 0x88, 0xdb, 0xb1, 0x82, 0x8e, 0xde, 0x87, + 0x0b, 0x71, 0x06, 0xbb, 0x41, 0xac, 0x36, 0x0f, 0xce, 0xe4, 0xa5, 0x9a, 0xb8, 0x66, 0xfa, 0xea, + 0xd1, 0xa8, 0x76, 0x61, 0x7d, 0x12, 0x13, 0x9e, 0x2c, 0x8f, 0xfa, 0x30, 0xe7, 0x7a, 0x6d, 0xd2, + 0x22, 0x3d, 0x62, 0x07, 0x9e, 0x2f, 0x53, 0xcd, 0x2c, 0xa5, 0x20, 0x51, 0xb4, 0xb4, 0x7a, 0xf7, + 0x14, 0x71, 0x51, 0xd8, 0x52, 0x5b, 0xb0, 0x06, 0x8f, 0xde, 0x84, 0x79, 0xee, 0xa4, 0x76, 0xfc, + 0x21, 0x0d, 0x48, 0x7b, 0x7d, 0x8d, 0xa7, 0xa4, 0x25, 0x71, 0xd6, 0xdd, 0xd5, 0x28, 0x38, 0xc1, + 0x69, 0xfe, 0xa1, 0x01, 0x29, 0xcf, 0xab, 0x34, 0xd3, 0x37, 0x9e, 0xb6, 0xe9, 0xbf, 0xa4, 0xb9, + 0x28, 0xf5, 0x02, 0x46, 0x73, 0x3f, 0xe6, 0x5f, 0x18, 0x70, 0x36, 0xad, 0x36, 0xc6, 0x6c, 0x30, + 0xf6, 0x4b, 0xc6, 0x94, 0x65, 0x42, 0xf5, 0xd6, 0x76, 0xcc, 0x35, 0x31, 0x5f, 0xa4, 0xb8, 0xe8, + 0x0d, 0xc7, 0x97, 0x7d, 0x8c, 0x7c, 0xd1, 0x86, 0x46, 0xc5, 0x09, 0x6e, 0xf3, 0x07, 0x05, 0x58, + 0x4a, 0xc9, 0x55, 0xd0, 0xa6, 0xbc, 0x15, 0x99, 0xe2, 0x42, 0x2f, 0x3a, 0x40, 0xb5, 0x9b, 0x11, + 0x18, 0x0c, 0x7b, 0xbd, 0x27, 0xbb, 0xd8, 0x0b, 0xe5, 0xb1, 0x82, 0x15, 0x5e, 0x73, 0xe4, 0x4f, + 0x70, 0xcd, 0x71, 0x07, 0x10, 0xf9, 0x78, 0xe0, 0x51, 0x22, 0x73, 0x4e, 0x8f, 0xc7, 0x1d, 0x05, + 0x6e, 0x83, 0xd1, 0xd3, 0xa9, 0xcd, 0x31, 0x0e, 0x9c, 0x22, 0x85, 0x56, 0xa0, 0xdc, 0xf1, 0x7c, + 0x9b, 0xb0, 0x5e, 0x72, 0xcf, 0xa5, 0x54, 0xed, 0x6e, 0x85, 0x04, 0x1c, 0xf3, 0xa0, 0xf7, 0xe2, + 0xaa, 0xee, 0x4c, 0xe6, 0xcb, 0x48, 0x31, 0x66, 0xee, 0x28, 0x26, 0x97, 0x73, 0xd7, 0x60, 0x81, + 0x0b, 0xac, 0x6d, 0x6f, 0x85, 0xf7, 0x45, 0xb3, 0xfa, 0xe9, 0xde, 0xd0, 0xc9, 0x38, 0xc9, 0x6f, + 0xfe, 0xb8, 0x08, 0x4b, 0x29, 0x19, 0x7a, 0x74, 0x47, 0x66, 0x3c, 0xc9, 0x1d, 0xd9, 0x17, 0x65, + 0x09, 0x2f, 0xc3, 0xac, 0xeb, 0xad, 0x5b, 0xf6, 0x1e, 0x91, 0xef, 0x11, 0xa2, 0x29, 0xba, 0x27, + 0x9a, 0x71, 0x48, 0x0f, 0x8d, 0xa6, 0x70, 0x02, 0xa3, 0x99, 0x7a, 0xa1, 0xbf, 0x1e, 0x56, 0x49, + 0x3a, 0x4e, 0x8f, 0xf0, 0x58, 0x6b, 0x26, 0xb1, 0x33, 0x35, 0x2a, 0x4e, 0x70, 0xa3, 0x6f, 0x40, + 0x59, 0x2c, 0x8f, 0xdf, 0xa5, 0x19, 0x6e, 0xf3, 0xa2, 0xce, 0x34, 0x42, 0x21, 0x1c, 0xcb, 0xa3, + 0x01, 0x9c, 0xe7, 0xe1, 0x3c, 0xf3, 0xd7, 0x7d, 0xe7, 0x3b, 0x22, 0x9e, 0x13, 0xcf, 0xa6, 0x44, + 0x9d, 0xf2, 0xc6, 0xd1, 0xa8, 0x76, 0x7e, 0x2b, 0x9d, 0xe5, 0xd1, 0x64, 0x12, 0x9e, 0x04, 0x8b, + 0xbe, 0x09, 0xb3, 0x07, 0x3c, 0xba, 0x0a, 0x6f, 0x16, 0xea, 0xd3, 0x45, 0xb7, 0xf1, 0x2a, 0x8a, + 0xff, 0x14, 0x87, 0x78, 0xe6, 0x0f, 0x0c, 0x48, 0xbf, 0xde, 0xd3, 0xe7, 0xcc, 0x78, 0xc2, 0x39, + 0x7b, 0x31, 0xb6, 0x2b, 0x51, 0x8e, 0xaf, 0xa4, 0xd9, 0x94, 0xf9, 0x47, 0x06, 0x2c, 0xa5, 0xd4, + 0x27, 0xbe, 0x1c, 0x47, 0xd2, 0x67, 0xb9, 0x64, 0xe7, 0x36, 0x0f, 0x88, 0x1b, 0x9c, 0xec, 0x52, + 0x71, 0x53, 0x5c, 0xe5, 0xe5, 0x64, 0x55, 0x3e, 0x53, 0x71, 0x81, 0xd7, 0x77, 0xf5, 0x3b, 0xbc, + 0x27, 0xf0, 0xdc, 0x93, 0xef, 0x8c, 0x0b, 0xcf, 0xfa, 0xce, 0xd8, 0xfc, 0x4b, 0x03, 0xe6, 0xf5, + 0xbb, 0x4a, 0xf4, 0x55, 0xc8, 0x0f, 0x7d, 0x47, 0x4e, 0x6a, 0xd4, 0xfb, 0x77, 0xf0, 0x16, 0x66, + 0xed, 0x8c, 0xec, 0x93, 0x8e, 0x5c, 0xb1, 0x88, 0x8c, 0x49, 0x07, 0xb3, 0x76, 0x44, 0xa0, 0x32, + 0xf0, 0xbd, 0x8f, 0x0f, 0xc5, 0x39, 0x3f, 0xc5, 0xfb, 0xea, 0xed, 0x58, 0x2a, 0x2e, 0x03, 0x2b, + 0x8d, 0x58, 0xc5, 0xe5, 0x11, 0xd4, 0x78, 0x71, 0xeb, 0xcb, 0x61, 0xae, 0x7f, 0x9b, 0x83, 0x59, + 0x69, 0x34, 0xe8, 0x43, 0x98, 0xef, 0x6a, 0xd3, 0x3b, 0x45, 0xb7, 0x12, 0x77, 0xc8, 0x91, 0xcb, + 0xd5, 0xdb, 0x71, 0x42, 0x01, 0xfa, 0x6d, 0x38, 0xd3, 0x75, 0x02, 0x7d, 0x4c, 0x53, 0x64, 0xfe, + 0xb7, 0x93, 0xb2, 0x8d, 0x0b, 0x52, 0xf1, 0x99, 0x31, 0x12, 0x1e, 0xd7, 0x84, 0xee, 0x43, 0xc1, + 0x27, 0x9d, 0x69, 0x1e, 0x29, 0xb1, 0x3d, 0x45, 0x3a, 0x7c, 0x8f, 0x45, 0xd1, 0x17, 0x26, 0x1d, + 0x8a, 0x39, 0x90, 0xf9, 0xbb, 0x62, 0xa9, 0x13, 0x05, 0xbe, 0xff, 0x89, 0x4f, 0x1e, 0xfe, 0xcb, + 0x00, 0x88, 0x3b, 0xfb, 0xff, 0x6f, 0x6d, 0xcd, 0x3f, 0xcf, 0xc1, 0x38, 0x23, 0xdb, 0x17, 0xb6, + 0xc8, 0x1e, 0x8d, 0xd4, 0xcf, 0x8c, 0x24, 0x15, 0x3d, 0x84, 0x19, 0x8b, 0x7f, 0xa7, 0x33, 0x45, + 0x8f, 0x85, 0xaa, 0x75, 0xcf, 0x0d, 0x7c, 0xaf, 0xf7, 0x0e, 0x25, 0xbe, 0xf2, 0x71, 0x0c, 0xc7, + 0xc2, 0x12, 0x13, 0x11, 0x96, 0x9e, 0xc8, 0x6f, 0x6d, 0xa6, 0x78, 0xe6, 0x3e, 0xae, 0x40, 0x49, + 0x55, 0x24, 0x1c, 0x8e, 0x91, 0xa7, 0xb8, 0x77, 0x36, 0xbf, 0x6f, 0xc0, 0x62, 0xb2, 0x1a, 0xce, + 0xe4, 0x79, 0xb0, 0xb1, 0xb5, 0x91, 0xbc, 0x6b, 0xd8, 0x12, 0xcd, 0x38, 0xa4, 0xa3, 0x3b, 0x30, + 0xcb, 0x82, 0x4e, 0x2c, 0xbd, 0x6d, 0xc6, 0x90, 0x95, 0x9f, 0xef, 0xb7, 0x84, 0x1c, 0x0e, 0x01, + 0xcc, 0xbf, 0x37, 0x00, 0x8d, 0xd7, 0x4b, 0xd1, 0x36, 0x9c, 0x15, 0x5f, 0x52, 0xc8, 0x47, 0x00, + 0x5b, 0x5a, 0xd7, 0x2e, 0xc9, 0xae, 0x9d, 0x6d, 0xa6, 0xf0, 0xe0, 0x54, 0xc9, 0x28, 0xc8, 0xce, + 0x9d, 0x3c, 0xc8, 0x7e, 0x09, 0x66, 0x06, 0x6c, 0xae, 0xda, 0x32, 0x12, 0x8e, 0x56, 0x7c, 0x9b, + 0xb7, 0x62, 0x49, 0x35, 0xff, 0x2a, 0x07, 0xd5, 0x49, 0xcf, 0xa8, 0xbf, 0x80, 0x91, 0x3d, 0xd4, + 0x46, 0xf6, 0x66, 0xe6, 0x37, 0x3b, 0x81, 0x4f, 0xac, 0xfe, 0x8e, 0xd5, 0x3d, 0x3e, 0xc7, 0xec, + 0xc3, 0x82, 0xa2, 0xf5, 0x84, 0x9f, 0xcc, 0x44, 0x39, 0x52, 0x53, 0x87, 0xc2, 0x49, 0x6c, 0xb3, + 0x05, 0x10, 0xbf, 0x03, 0xcd, 0x50, 0x43, 0x7e, 0x01, 0x8a, 0x07, 0x56, 0x6f, 0x18, 0x7e, 0x79, + 0x18, 0xbd, 0xe6, 0x7e, 0xc0, 0x1a, 0xb1, 0xa0, 0x99, 0x7f, 0x9c, 0x83, 0x8a, 0xf2, 0x4e, 0xe9, + 0x69, 0xa5, 0xdf, 0xcf, 0x41, 0xce, 0xa2, 0x3c, 0xdd, 0x29, 0x8b, 0x8b, 0xe5, 0x35, 0x8a, 0x73, + 0x16, 0x45, 0xef, 0x42, 0x71, 0x60, 0x05, 0x7b, 0xe1, 0x5b, 0xf4, 0xab, 0xd3, 0xbd, 0xa2, 0x62, + 0xe9, 0x49, 0x3c, 0x0e, 0xf6, 0x8f, 0x62, 0x81, 0x97, 0xc8, 0xf2, 0xf2, 0x4f, 0x2f, 0xcb, 0x33, + 0xbf, 0x67, 0xc0, 0x42, 0xa2, 0x0f, 0xe8, 0x2a, 0x00, 0x8d, 0xfe, 0xc9, 0x25, 0x88, 0x0a, 0x69, + 0x31, 0x1f, 0x56, 0xb8, 0x9e, 0xb8, 0x60, 0xd2, 0x83, 0xf3, 0x13, 0x8c, 0x93, 0xa5, 0x88, 0x6c, + 0xc5, 0xe9, 0xc0, 0xb2, 0x49, 0xf2, 0xc9, 0xfd, 0xbd, 0x90, 0x80, 0x63, 0x9e, 0xc8, 0x78, 0x72, + 0x93, 0x8c, 0xc7, 0xfc, 0x07, 0x03, 0x2e, 0x1d, 0x77, 0x99, 0xcb, 0x92, 0x7e, 0x79, 0x63, 0x1b, + 0xa5, 0x99, 0x89, 0x92, 0xfe, 0x1d, 0x9d, 0x8c, 0x93, 0xfc, 0xe8, 0x3a, 0x54, 0x94, 0x26, 0xd9, + 0x99, 0x28, 0x8e, 0x54, 0xc4, 0xb1, 0xca, 0xf7, 0x04, 0x61, 0xbc, 0xf9, 0x37, 0x06, 0x9c, 0x4d, + 0xab, 0x1c, 0xa2, 0x6e, 0xf8, 0x8d, 0x84, 0xc8, 0xdd, 0x1a, 0x27, 0xac, 0x40, 0xd6, 0xf9, 0x97, + 0x12, 0x9b, 0x6e, 0xe0, 0x1f, 0xa6, 0x7f, 0x3d, 0x71, 0xf1, 0x26, 0x40, 0xcc, 0x83, 0x16, 0x21, + 0xbf, 0x4f, 0x0e, 0xc5, 0xc4, 0x61, 0xf6, 0x13, 0x9d, 0xd5, 0x36, 0xad, 0xdc, 0xa5, 0x6f, 0xe6, + 0x6e, 0x1a, 0x6f, 0x96, 0xfe, 0xe0, 0x4f, 0x6a, 0xa7, 0xbe, 0xfb, 0xcb, 0xcb, 0xa7, 0xcc, 0x1f, + 0x1a, 0xa0, 0x46, 0xd9, 0xe8, 0x15, 0x28, 0xef, 0x05, 0xc1, 0x80, 0x37, 0xc9, 0x27, 0x59, 0xfc, + 0x4a, 0xe1, 0xed, 0x9d, 0x9d, 0x6d, 0xde, 0x88, 0x63, 0x3a, 0xaa, 0x03, 0xb0, 0x3f, 0x54, 0x70, + 0x17, 0xe2, 0x67, 0x94, 0x8c, 0xbb, 0x25, 0xd8, 0x15, 0x0e, 0x91, 0x8c, 0x0a, 0x66, 0xf1, 0xe9, + 0x9d, 0x4c, 0x46, 0x05, 0x67, 0x48, 0x33, 0xff, 0xcc, 0x80, 0x33, 0x63, 0x4f, 0x00, 0xd1, 0x76, + 0x14, 0x7e, 0x4f, 0x5b, 0x7c, 0x9c, 0x10, 0xa8, 0x3f, 0xf1, 0x2e, 0xba, 0x09, 0x67, 0x05, 0x22, + 0xd7, 0x1a, 0x6f, 0xa1, 0xc7, 0xba, 0x53, 0xf3, 0x4f, 0x0d, 0x80, 0xb8, 0x1c, 0x86, 0x76, 0x61, + 0x4e, 0x74, 0x49, 0x8b, 0x23, 0xb3, 0x0f, 0xf0, 0xac, 0x54, 0x31, 0xd7, 0x52, 0x50, 0xb0, 0x86, + 0xc9, 0xf6, 0x35, 0xaf, 0x42, 0xf3, 0xdd, 0x95, 0xd3, 0xf7, 0xf5, 0xdd, 0x90, 0x80, 0x63, 0x1e, + 0xf3, 0x17, 0x79, 0x58, 0x4a, 0x79, 0x74, 0xf2, 0x7f, 0xba, 0xa8, 0xfa, 0x32, 0xcc, 0x8a, 0xef, + 0x10, 0x68, 0x32, 0xba, 0x13, 0x9f, 0x29, 0x50, 0x1c, 0xd2, 0xd1, 0x2a, 0x54, 0x1c, 0xd7, 0x16, + 0x77, 0x2c, 0x56, 0x58, 0x4c, 0x13, 0xf7, 0xcf, 0x71, 0x33, 0x56, 0x79, 0xf4, 0xea, 0xdb, 0x4c, + 0x86, 0xea, 0xdb, 0x17, 0x58, 0x7e, 0xfa, 0x16, 0x9c, 0x19, 0x0b, 0x7d, 0xb3, 0xc5, 0x01, 0x84, + 0x7f, 0xfe, 0x9e, 0x88, 0x03, 0xc4, 0x57, 0xef, 0x82, 0x66, 0xfe, 0xc8, 0x80, 0xf9, 0x44, 0x8e, + 0x70, 0xa2, 0x52, 0xcd, 0x7d, 0xb5, 0x54, 0x73, 0xb2, 0xfc, 0x46, 0x2b, 0xda, 0x98, 0x77, 0x20, + 0xfd, 0x15, 0x7b, 0x72, 0x31, 0x8d, 0xc7, 0x2f, 0xa6, 0xf9, 0xd3, 0x1c, 0x94, 0xa3, 0xc7, 0x7f, + 0xe8, 0x35, 0x6d, 0xe6, 0x2e, 0xa8, 0x33, 0xf7, 0x68, 0x54, 0x13, 0x8c, 0xca, 0x34, 0xbe, 0x0f, + 0xe5, 0xe8, 0xf1, 0x68, 0x54, 0x8a, 0xca, 0x1e, 0xe7, 0x45, 0x56, 0x13, 0xbd, 0x48, 0xc5, 0x31, + 0x1e, 0x0b, 0x7d, 0xc3, 0xd7, 0x9d, 0x77, 0x9d, 0x5e, 0xcf, 0xa1, 0xf2, 0x82, 0x2d, 0xcf, 0x2f, + 0xd8, 0xa2, 0xd0, 0x77, 0x23, 0x85, 0x07, 0xa7, 0x4a, 0xa2, 0x6d, 0x28, 0xd2, 0x80, 0x0c, 0xa8, + 0xac, 0x39, 0xbf, 0x92, 0xe9, 0x5d, 0x24, 0x19, 0xf0, 0x94, 0x3e, 0x32, 0x11, 0xd6, 0x42, 0xb1, + 0x00, 0x32, 0xff, 0xd5, 0x80, 0x52, 0xc8, 0x82, 0x5e, 0xd5, 0x26, 0xaf, 0x9a, 0x98, 0x3c, 0xce, + 0xf7, 0xbf, 0x76, 0xee, 0xcc, 0x91, 0x01, 0xf3, 0xfa, 0x1b, 0x0f, 0xa5, 0x90, 0x64, 0x1c, 0x57, + 0x48, 0x42, 0xaf, 0x42, 0xc9, 0xea, 0xf5, 0xbc, 0x8f, 0x36, 0xdd, 0x03, 0x59, 0xbc, 0x8d, 0xee, + 0x9e, 0xd7, 0x64, 0x3b, 0x8e, 0x38, 0xd0, 0x01, 0x2c, 0x08, 0xb9, 0xf8, 0xf5, 0x6e, 0x3e, 0xf3, + 0x15, 0x68, 0xda, 0x39, 0xd6, 0x58, 0x62, 0x91, 0x57, 0x4b, 0xc7, 0xc4, 0x49, 0x25, 0x8d, 0x2b, + 0x9f, 0x7e, 0xbe, 0x7c, 0xea, 0xe7, 0x9f, 0x2f, 0x9f, 0xfa, 0xec, 0xf3, 0xe5, 0x53, 0xdf, 0x3d, + 0x5a, 0x36, 0x3e, 0x3d, 0x5a, 0x36, 0x7e, 0x7e, 0xb4, 0x6c, 0x7c, 0x76, 0xb4, 0x6c, 0xfc, 0xf3, + 0xd1, 0xb2, 0xf1, 0xfb, 0xff, 0xb2, 0x7c, 0xea, 0x5b, 0xb9, 0x83, 0xd5, 0xff, 0x0e, 0x00, 0x00, + 0xff, 0xff, 0x58, 0xc4, 0x75, 0x0c, 0x57, 0x46, 0x00, 0x00, } func (m *BinaryBuildRequestOptions) Marshal() (dAtA []byte, err error) { @@ -3405,6 +3533,138 @@ func (m *BuildTriggerPolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *BuildVolume) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BuildVolume) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BuildVolume) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Mounts) > 0 { + for iNdEx := len(m.Mounts) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Mounts[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + { + size, err := m.Source.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *BuildVolumeMount) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BuildVolumeMount) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BuildVolumeMount) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.DestinationPath) + copy(dAtA[i:], m.DestinationPath) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.DestinationPath))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *BuildVolumeSource) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BuildVolumeSource) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BuildVolumeSource) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ConfigMap != nil { + { + size, err := m.ConfigMap.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.Secret != nil { + { + size, err := m.Secret.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *CommonSpec) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -3714,6 +3974,20 @@ func (m *DockerBuildStrategy) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Volumes) > 0 { + for iNdEx := len(m.Volumes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Volumes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + } + } if m.ImageOptimizationPolicy != nil { i -= len(*m.ImageOptimizationPolicy) copy(dAtA[i:], *m.ImageOptimizationPolicy) @@ -4336,27 +4610,17 @@ func (m *ImageChangeTriggerStatus) MarshalToSizedBuffer(dAtA []byte) (int, error i = encodeVarintGenerated(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x22 - i-- - if m.Paused { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - if m.From != nil { - { - size, err := m.From.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) + dAtA[i] = 0x1a + { + size, err := m.From.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0x12 + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 i -= len(m.LastTriggeredImageID) copy(dAtA[i:], m.LastTriggeredImageID) i = encodeVarintGenerated(dAtA, i, uint64(len(m.LastTriggeredImageID))) @@ -4499,6 +4763,39 @@ func (m *ImageSourcePath) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ImageStreamTagReference) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ImageStreamTagReference) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ImageStreamTagReference) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0x12 + i -= len(m.Namespace) + copy(dAtA[i:], m.Namespace) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Namespace))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *JenkinsPipelineBuildStrategy) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -4761,6 +5058,20 @@ func (m *SourceBuildStrategy) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Volumes) > 0 { + for iNdEx := len(m.Volumes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Volumes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + } + } i-- if m.ForcePull { dAtA[i] = 1 @@ -5618,6 +5929,55 @@ func (m *BuildTriggerPolicy) Size() (n int) { return n } +func (m *BuildVolume) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = m.Source.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Mounts) > 0 { + for _, e := range m.Mounts { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *BuildVolumeMount) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.DestinationPath) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *BuildVolumeSource) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + if m.Secret != nil { + l = m.Secret.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.ConfigMap != nil { + l = m.ConfigMap.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *CommonSpec) Size() (n int) { if m == nil { return 0 @@ -5746,6 +6106,12 @@ func (m *DockerBuildStrategy) Size() (n int) { l = len(*m.ImageOptimizationPolicy) n += 1 + l + sovGenerated(uint64(l)) } + if len(m.Volumes) > 0 { + for _, e := range m.Volumes { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -5936,11 +6302,8 @@ func (m *ImageChangeTriggerStatus) Size() (n int) { _ = l l = len(m.LastTriggeredImageID) n += 1 + l + sovGenerated(uint64(l)) - if m.From != nil { - l = m.From.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - n += 2 + l = m.From.Size() + n += 1 + l + sovGenerated(uint64(l)) l = m.LastTriggerTime.Size() n += 1 + l + sovGenerated(uint64(l)) return n @@ -5999,6 +6362,19 @@ func (m *ImageSourcePath) Size() (n int) { return n } +func (m *ImageStreamTagReference) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Namespace) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *JenkinsPipelineBuildStrategy) Size() (n int) { if m == nil { return 0 @@ -6117,6 +6493,12 @@ func (m *SourceBuildStrategy) Size() (n int) { n += 2 } n += 2 + if len(m.Volumes) > 0 { + for _, e := range m.Volumes { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -6591,6 +6973,45 @@ func (this *BuildTriggerPolicy) String() string { }, "") return s } +func (this *BuildVolume) String() string { + if this == nil { + return "nil" + } + repeatedStringForMounts := "[]BuildVolumeMount{" + for _, f := range this.Mounts { + repeatedStringForMounts += strings.Replace(strings.Replace(f.String(), "BuildVolumeMount", "BuildVolumeMount", 1), `&`, ``, 1) + "," + } + repeatedStringForMounts += "}" + s := strings.Join([]string{`&BuildVolume{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Source:` + strings.Replace(strings.Replace(this.Source.String(), "BuildVolumeSource", "BuildVolumeSource", 1), `&`, ``, 1) + `,`, + `Mounts:` + repeatedStringForMounts + `,`, + `}`, + }, "") + return s +} +func (this *BuildVolumeMount) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&BuildVolumeMount{`, + `DestinationPath:` + fmt.Sprintf("%v", this.DestinationPath) + `,`, + `}`, + }, "") + return s +} +func (this *BuildVolumeSource) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&BuildVolumeSource{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Secret:` + strings.Replace(fmt.Sprintf("%v", this.Secret), "SecretVolumeSource", "v11.SecretVolumeSource", 1) + `,`, + `ConfigMap:` + strings.Replace(fmt.Sprintf("%v", this.ConfigMap), "ConfigMapVolumeSource", "v11.ConfigMapVolumeSource", 1) + `,`, + `}`, + }, "") + return s +} func (this *CommonSpec) String() string { if this == nil { return "nil" @@ -6672,6 +7093,11 @@ func (this *DockerBuildStrategy) String() string { repeatedStringForBuildArgs += fmt.Sprintf("%v", f) + "," } repeatedStringForBuildArgs += "}" + repeatedStringForVolumes := "[]BuildVolume{" + for _, f := range this.Volumes { + repeatedStringForVolumes += strings.Replace(strings.Replace(f.String(), "BuildVolume", "BuildVolume", 1), `&`, ``, 1) + "," + } + repeatedStringForVolumes += "}" s := strings.Join([]string{`&DockerBuildStrategy{`, `From:` + strings.Replace(fmt.Sprintf("%v", this.From), "ObjectReference", "v11.ObjectReference", 1) + `,`, `PullSecret:` + strings.Replace(fmt.Sprintf("%v", this.PullSecret), "LocalObjectReference", "v11.LocalObjectReference", 1) + `,`, @@ -6681,6 +7107,7 @@ func (this *DockerBuildStrategy) String() string { `DockerfilePath:` + fmt.Sprintf("%v", this.DockerfilePath) + `,`, `BuildArgs:` + repeatedStringForBuildArgs + `,`, `ImageOptimizationPolicy:` + valueToStringGenerated(this.ImageOptimizationPolicy) + `,`, + `Volumes:` + repeatedStringForVolumes + `,`, `}`, }, "") return s @@ -6833,8 +7260,7 @@ func (this *ImageChangeTriggerStatus) String() string { } s := strings.Join([]string{`&ImageChangeTriggerStatus{`, `LastTriggeredImageID:` + fmt.Sprintf("%v", this.LastTriggeredImageID) + `,`, - `From:` + strings.Replace(fmt.Sprintf("%v", this.From), "ObjectReference", "v11.ObjectReference", 1) + `,`, - `Paused:` + fmt.Sprintf("%v", this.Paused) + `,`, + `From:` + strings.Replace(strings.Replace(this.From.String(), "ImageStreamTagReference", "ImageStreamTagReference", 1), `&`, ``, 1) + `,`, `LastTriggerTime:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.LastTriggerTime), "Time", "v1.Time", 1), `&`, ``, 1) + `,`, `}`, }, "") @@ -6880,6 +7306,17 @@ func (this *ImageSourcePath) String() string { }, "") return s } +func (this *ImageStreamTagReference) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ImageStreamTagReference{`, + `Namespace:` + fmt.Sprintf("%v", this.Namespace) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `}`, + }, "") + return s +} func (this *JenkinsPipelineBuildStrategy) String() string { if this == nil { return "nil" @@ -6950,6 +7387,11 @@ func (this *SourceBuildStrategy) String() string { repeatedStringForEnv += fmt.Sprintf("%v", f) + "," } repeatedStringForEnv += "}" + repeatedStringForVolumes := "[]BuildVolume{" + for _, f := range this.Volumes { + repeatedStringForVolumes += strings.Replace(strings.Replace(f.String(), "BuildVolume", "BuildVolume", 1), `&`, ``, 1) + "," + } + repeatedStringForVolumes += "}" s := strings.Join([]string{`&SourceBuildStrategy{`, `From:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.From), "ObjectReference", "v11.ObjectReference", 1), `&`, ``, 1) + `,`, `PullSecret:` + strings.Replace(fmt.Sprintf("%v", this.PullSecret), "LocalObjectReference", "v11.LocalObjectReference", 1) + `,`, @@ -6957,6 +7399,7 @@ func (this *SourceBuildStrategy) String() string { `Scripts:` + fmt.Sprintf("%v", this.Scripts) + `,`, `Incremental:` + valueToStringGenerated(this.Incremental) + `,`, `ForcePull:` + fmt.Sprintf("%v", this.ForcePull) + `,`, + `Volumes:` + repeatedStringForVolumes + `,`, `}`, }, "") return s @@ -11331,21 +11774,410 @@ func (m *BuildTriggerPolicy) Unmarshal(dAtA []byte) error { if postIndex < 0 { return ErrInvalidLengthGenerated } - if postIndex > l { + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GenericWebHook == nil { + m.GenericWebHook = &WebHookTrigger{} + } + if err := m.GenericWebHook.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ImageChange", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ImageChange == nil { + m.ImageChange = &ImageChangeTrigger{} + } + if err := m.ImageChange.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GitLabWebHook", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.GitLabWebHook == nil { + m.GitLabWebHook = &WebHookTrigger{} + } + if err := m.GitLabWebHook.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BitbucketWebHook", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.BitbucketWebHook == nil { + m.BitbucketWebHook = &WebHookTrigger{} + } + if err := m.BitbucketWebHook.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BuildVolume) 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 ErrIntOverflowGenerated + } + 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: BuildVolume: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BuildVolume: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + 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 ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Source.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Mounts", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Mounts = append(m.Mounts, BuildVolumeMount{}) + if err := m.Mounts[len(m.Mounts)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BuildVolumeMount) 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 ErrIntOverflowGenerated + } + 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: BuildVolumeMount: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BuildVolumeMount: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DestinationPath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + 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 ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DestinationPath = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BuildVolumeSource) 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 ErrIntOverflowGenerated + } + if iNdEx >= l { return io.ErrUnexpectedEOF } - if m.GenericWebHook == nil { - m.GenericWebHook = &WebHookTrigger{} - } - if err := m.GenericWebHook.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break } - iNdEx = postIndex - case 4: + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BuildVolumeSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BuildVolumeSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ImageChange", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -11355,31 +12187,27 @@ func (m *BuildTriggerPolicy) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthGenerated } if postIndex > l { return io.ErrUnexpectedEOF } - if m.ImageChange == nil { - m.ImageChange = &ImageChangeTrigger{} - } - if err := m.ImageChange.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Type = BuildVolumeSourceType(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GitLabWebHook", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Secret", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -11406,16 +12234,16 @@ func (m *BuildTriggerPolicy) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.GitLabWebHook == nil { - m.GitLabWebHook = &WebHookTrigger{} + if m.Secret == nil { + m.Secret = &v11.SecretVolumeSource{} } - if err := m.GitLabWebHook.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Secret.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 6: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BitbucketWebHook", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConfigMap", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -11442,10 +12270,10 @@ func (m *BuildTriggerPolicy) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.BitbucketWebHook == nil { - m.BitbucketWebHook = &WebHookTrigger{} + if m.ConfigMap == nil { + m.ConfigMap = &v11.ConfigMapVolumeSource{} } - if err := m.BitbucketWebHook.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConfigMap.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -12596,6 +13424,40 @@ func (m *DockerBuildStrategy) Unmarshal(dAtA []byte) error { s := ImageOptimizationPolicy(dAtA[iNdEx:postIndex]) m.ImageOptimizationPolicy = &s iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Volumes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Volumes = append(m.Volumes, BuildVolume{}) + if err := m.Volumes[len(m.Volumes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -14168,34 +15030,11 @@ func (m *ImageChangeTriggerStatus) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.From == nil { - m.From = &v11.ObjectReference{} - } if err := m.From.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Paused", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Paused = bool(v != 0) - case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field LastTriggerTime", wireType) } @@ -14662,6 +15501,120 @@ func (m *ImageSourcePath) Unmarshal(dAtA []byte) error { } return nil } +func (m *ImageStreamTagReference) 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 ErrIntOverflowGenerated + } + 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: ImageStreamTagReference: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ImageStreamTagReference: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + 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 ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Namespace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + 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 ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *JenkinsPipelineBuildStrategy) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -15653,6 +16606,40 @@ func (m *SourceBuildStrategy) Unmarshal(dAtA []byte) error { } } m.ForcePull = bool(v != 0) + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Volumes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Volumes = append(m.Volumes, BuildVolume{}) + if err := m.Volumes[len(m.Volumes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/vendor/github.com/openshift/api/build/v1/generated.proto b/vendor/github.com/openshift/api/build/v1/generated.proto index 9b5bc9a21cb..7e7f95b85c7 100644 --- a/vendor/github.com/openshift/api/build/v1/generated.proto +++ b/vendor/github.com/openshift/api/build/v1/generated.proto @@ -145,8 +145,9 @@ message BuildConfigStatus { // lastVersion is used to inform about number of last triggered build. optional int64 lastVersion = 1; - // ImageChangeTriggers is used to capture the runtime state of any ImageChangeTrigger specified in the BuildConfigSpec, - // including reconciled values of the lastTriggeredImageID and paused fields. + // ImageChangeTriggers captures the runtime state of any ImageChangeTrigger specified in the BuildConfigSpec, + // including the value reconciled by the OpenShift APIServer for the lastTriggeredImageID. There is a single entry + // in this array for each image change trigger in spec. Each trigger status references the ImageStreamTag that acts as the source of the trigger. repeated ImageChangeTriggerStatus imageChangeTriggers = 2; } @@ -593,6 +594,53 @@ message BuildTriggerPolicy { optional WebHookTrigger bitbucket = 6; } +// BuildVolume describes a volume that is made available to build pods, +// such that it can be mounted into buildah's runtime environment. +// Only a subset of Kubernetes Volume sources are supported. +message BuildVolume { + // name is a unique identifier for this BuildVolume. + // It must conform to the Kubernetes DNS label standard and be unique within the pod. + // Names that collide with those added by the build controller will result in a + // failed build with an error message detailing which name caused the error. + // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + optional string name = 1; + + // source represents the location and type of the mounted volume. + optional BuildVolumeSource source = 2; + + // mounts represents the location of the volume in the image build container + repeated BuildVolumeMount mounts = 3; +} + +// BuildVolumeMount describes the mounting of a Volume within buildah's runtime environment. +message BuildVolumeMount { + // destinationPath is the path within the buildah runtime environment at which the volume should be mounted. + // The transient mount within the build image and the backing volume will both be mounted read only. + // Must be an absolute path, must not contain '..' or ':', and must not collide with a destination path generated + // by the builder process + // Paths that collide with those added by the build controller will result in a + // failed build with an error message detailing which path caused the error. + optional string destinationPath = 1; +} + +// BuildVolumeSource represents the source of a volume to mount +// Only one of its supported types may be specified at any given time. +message BuildVolumeSource { + // type is the BuildVolumeSourceType for the volume source. + // Type must match the populated volume source. + // Valid types are: Secret, ConfigMap + optional string type = 1; + + // secret represents a Secret that should populate this volume. + // More info: https://kubernetes.io/docs/concepts/storage/volumes#secret + // +optional + optional k8s.io.api.core.v1.SecretVolumeSource secret = 2; + + // configMap represents a ConfigMap that should populate this volume + // +optional + optional k8s.io.api.core.v1.ConfigMapVolumeSource configMap = 3; +} + // CommonSpec encapsulates all the inputs necessary to represent a build. message CommonSpec { // serviceAccount is the name of the ServiceAccount to use to run the pod @@ -732,6 +780,8 @@ message DockerBuildStrategy { // buildArgs contains build arguments that will be resolved in the Dockerfile. See // https://docs.docker.com/engine/reference/builder/#/arg for more details. + // NOTE: Only the 'name' and 'value' fields are supported. Any settings on the 'valueFrom' field + // are ignored. repeated k8s.io.api.core.v1.EnvVar buildArgs = 7; // imageOptimizationPolicy describes what optimizations the system can use when building images @@ -742,6 +792,13 @@ message DockerBuildStrategy { // policy. An additional experimental policy 'SkipLayersAndWarn' is the same as // 'SkipLayers' but simply warns if compatibility cannot be preserved. optional string imageOptimizationPolicy = 8; + + // volumes is a list of input volumes that can be mounted into the builds runtime environment. + // Only a subset of Kubernetes Volume sources are supported by builds. + // More info: https://kubernetes.io/docs/concepts/storage/volumes + // +patchMergeKey=name + // +patchStrategy=merge + repeated BuildVolume volumes = 9; } // DockerStrategyOptions contains extra strategy options for container image builds @@ -878,20 +935,16 @@ message ImageChangeTrigger { // ImageChangeTriggerStatus tracks the latest resolved status of the associated ImageChangeTrigger policy // specified in the BuildConfigSpec.Triggers struct. message ImageChangeTriggerStatus { - // lastTriggeredImageID is the sha/id of the imageref cited in the 'from' field the last time this BuildConfig was triggered. - // It is not necessarily the sha/id of the image change that triggered a build. - // This field is updated for all image change triggers when any of them triggers a build. + // lastTriggeredImageID represents the sha/id of the ImageStreamTag when a Build for this BuildConfig was started. + // The lastTriggeredImageID is updated each time a Build for this BuildConfig is started, even if this ImageStreamTag is not the reason the Build is started. optional string lastTriggeredImageID = 1; - // from is the ImageStreamTag that is used as the source of the trigger. - // This can come from an ImageStream tag referenced in this BuildConfig's triggers, or the From image in this BuildConfig's build strategy. - optional k8s.io.api.core.v1.ObjectReference from = 2; - - // paused is true if this trigger is temporarily disabled, and the setting on the spec has been reconciled. Optional. - optional bool paused = 3; + // from is the ImageStreamTag that is the source of the trigger. + optional ImageStreamTagReference from = 2; - // lastTriggerTime is the last time the BuildConfig was triggered by a change in the ImageStreamTag associated with this trigger. - optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastTriggerTime = 4; + // lastTriggerTime is the last time this particular ImageStreamTag triggered a Build to start. + // This field is only updated when this trigger specifically started a Build. + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastTriggerTime = 3; } // ImageLabel represents a label applied to the resulting image. @@ -947,6 +1000,15 @@ message ImageSourcePath { optional string destinationDir = 2; } +// ImageStreamTagReference references the ImageStreamTag in an image change trigger by namespace and name. +message ImageStreamTagReference { + // namespace is the namespace where the ImageStreamTag for an ImageChangeTrigger is located + optional string namespace = 1; + + // name is the name of the ImageStreamTag for an ImageChangeTrigger + optional string name = 2; +} + // JenkinsPipelineBuildStrategy holds parameters specific to a Jenkins Pipeline build. // Deprecated: use OpenShift Pipelines message JenkinsPipelineBuildStrategy { @@ -1039,6 +1101,13 @@ message SourceBuildStrategy { // forcePull describes if the builder should pull the images from registry prior to building. optional bool forcePull = 6; + + // volumes is a list of input volumes that can be mounted into the builds runtime environment. + // Only a subset of Kubernetes Volume sources are supported by builds. + // More info: https://kubernetes.io/docs/concepts/storage/volumes + // +patchMergeKey=name + // +patchStrategy=merge + repeated BuildVolume volumes = 9; } // SourceControlUser defines the identity of a user of source control diff --git a/vendor/github.com/openshift/api/build/v1/types.go b/vendor/github.com/openshift/api/build/v1/types.go index 580fb5c3a77..888774dc56a 100644 --- a/vendor/github.com/openshift/api/build/v1/types.go +++ b/vendor/github.com/openshift/api/build/v1/types.go @@ -730,6 +730,8 @@ type DockerBuildStrategy struct { // buildArgs contains build arguments that will be resolved in the Dockerfile. See // https://docs.docker.com/engine/reference/builder/#/arg for more details. + // NOTE: Only the 'name' and 'value' fields are supported. Any settings on the 'valueFrom' field + // are ignored. BuildArgs []corev1.EnvVar `json:"buildArgs,omitempty" protobuf:"bytes,7,rep,name=buildArgs"` // imageOptimizationPolicy describes what optimizations the system can use when building images @@ -740,6 +742,13 @@ type DockerBuildStrategy struct { // policy. An additional experimental policy 'SkipLayersAndWarn' is the same as // 'SkipLayers' but simply warns if compatibility cannot be preserved. ImageOptimizationPolicy *ImageOptimizationPolicy `json:"imageOptimizationPolicy,omitempty" protobuf:"bytes,8,opt,name=imageOptimizationPolicy,casttype=ImageOptimizationPolicy"` + + // volumes is a list of input volumes that can be mounted into the builds runtime environment. + // Only a subset of Kubernetes Volume sources are supported by builds. + // More info: https://kubernetes.io/docs/concepts/storage/volumes + // +patchMergeKey=name + // +patchStrategy=merge + Volumes []BuildVolume `json:"volumes,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,9,opt,name=volumes"` } // SourceBuildStrategy defines input parameters specific to an Source build. @@ -771,6 +780,12 @@ type SourceBuildStrategy struct { // deprecated json field, do not reuse: runtimeArtifacts // +k8s:protobuf-deprecated=runtimeArtifacts,8 + // volumes is a list of input volumes that can be mounted into the builds runtime environment. + // Only a subset of Kubernetes Volume sources are supported by builds. + // More info: https://kubernetes.io/docs/concepts/storage/volumes + // +patchMergeKey=name + // +patchStrategy=merge + Volumes []BuildVolume `json:"volumes,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,9,opt,name=volumes"` } // JenkinsPipelineBuildStrategy holds parameters specific to a Jenkins Pipeline build. @@ -976,8 +991,9 @@ type BuildConfigStatus struct { // lastVersion is used to inform about number of last triggered build. LastVersion int64 `json:"lastVersion" protobuf:"varint,1,opt,name=lastVersion"` - // ImageChangeTriggers is used to capture the runtime state of any ImageChangeTrigger specified in the BuildConfigSpec, - // including reconciled values of the lastTriggeredImageID and paused fields. + // ImageChangeTriggers captures the runtime state of any ImageChangeTrigger specified in the BuildConfigSpec, + // including the value reconciled by the OpenShift APIServer for the lastTriggeredImageID. There is a single entry + // in this array for each image change trigger in spec. Each trigger status references the ImageStreamTag that acts as the source of the trigger. ImageChangeTriggers []ImageChangeTriggerStatus `json:"imageChangeTriggers,omitempty" protobuf:"bytes,2,rep,name=imageChangeTriggers"` } @@ -1022,23 +1038,28 @@ type ImageChangeTrigger struct { Paused bool `json:"paused,omitempty" protobuf:"varint,3,opt,name=paused"` } +// ImageStreamTagReference references the ImageStreamTag in an image change trigger by namespace and name. +type ImageStreamTagReference struct { + // namespace is the namespace where the ImageStreamTag for an ImageChangeTrigger is located + Namespace string `json:"namespace,omitempty" protobuf:"bytes,1,opt,name=namespace"` + + // name is the name of the ImageStreamTag for an ImageChangeTrigger + Name string `json:"name,omitempty" protobuf:"bytes,2,opt,name=name"` +} + // ImageChangeTriggerStatus tracks the latest resolved status of the associated ImageChangeTrigger policy // specified in the BuildConfigSpec.Triggers struct. type ImageChangeTriggerStatus struct { - // lastTriggeredImageID is the sha/id of the imageref cited in the 'from' field the last time this BuildConfig was triggered. - // It is not necessarily the sha/id of the image change that triggered a build. - // This field is updated for all image change triggers when any of them triggers a build. + // lastTriggeredImageID represents the sha/id of the ImageStreamTag when a Build for this BuildConfig was started. + // The lastTriggeredImageID is updated each time a Build for this BuildConfig is started, even if this ImageStreamTag is not the reason the Build is started. LastTriggeredImageID string `json:"lastTriggeredImageID,omitempty" protobuf:"bytes,1,opt,name=lastTriggeredImageID"` - // from is the ImageStreamTag that is used as the source of the trigger. - // This can come from an ImageStream tag referenced in this BuildConfig's triggers, or the From image in this BuildConfig's build strategy. - From *corev1.ObjectReference `json:"from,omitempty" protobuf:"bytes,2,opt,name=from"` + // from is the ImageStreamTag that is the source of the trigger. + From ImageStreamTagReference `json:"from,omitempty" protobuf:"bytes,2,opt,name=from"` - // paused is true if this trigger is temporarily disabled, and the setting on the spec has been reconciled. Optional. - Paused bool `json:"paused,omitempty" protobuf:"varint,3,opt,name=paused"` - - // lastTriggerTime is the last time the BuildConfig was triggered by a change in the ImageStreamTag associated with this trigger. - LastTriggerTime metav1.Time `json:"lastTriggerTime,omitempty" protobuf:"bytes,4,opt,name=lastTriggerTime"` + // lastTriggerTime is the last time this particular ImageStreamTag triggered a Build to start. + // This field is only updated when this trigger specifically started a Build. + LastTriggerTime metav1.Time `json:"lastTriggerTime,omitempty" protobuf:"bytes,3,opt,name=lastTriggerTime"` } // BuildTriggerPolicy describes a policy for a single trigger that results in a new Build. @@ -1327,3 +1348,62 @@ type SecretSpec struct { // mountPath is the path at which to mount the secret MountPath string `json:"mountPath" protobuf:"bytes,2,opt,name=mountPath"` } + +// BuildVolume describes a volume that is made available to build pods, +// such that it can be mounted into buildah's runtime environment. +// Only a subset of Kubernetes Volume sources are supported. +type BuildVolume struct { + // name is a unique identifier for this BuildVolume. + // It must conform to the Kubernetes DNS label standard and be unique within the pod. + // Names that collide with those added by the build controller will result in a + // failed build with an error message detailing which name caused the error. + // More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + Name string `json:"name" protobuf:"bytes,1,opt,name=name"` + + // source represents the location and type of the mounted volume. + Source BuildVolumeSource `json:"source" protobuf:"bytes,2,opt,name=source"` + + // mounts represents the location of the volume in the image build container + Mounts []BuildVolumeMount `json:"mounts" protobuf:"bytes,3,opt,name=mounts"` +} + +// BuildVolumeSourceType represents a build volume source type +type BuildVolumeSourceType string + +const ( + // BuildVolumeSourceTypeSecret is the Secret build source volume type + BuildVolumeSourceTypeSecret BuildVolumeSourceType = "Secret" + + // BuildVolumeSourceTypeConfigmap is the ConfigMap build source volume type + BuildVolumeSourceTypeConfigMap BuildVolumeSourceType = "ConfigMap" +) + +// BuildVolumeSource represents the source of a volume to mount +// Only one of its supported types may be specified at any given time. +type BuildVolumeSource struct { + + // type is the BuildVolumeSourceType for the volume source. + // Type must match the populated volume source. + // Valid types are: Secret, ConfigMap + Type BuildVolumeSourceType `json:"type" protobuf:"bytes,1,opt,name=type,casttype=BuildVolumeSourceType"` + + // secret represents a Secret that should populate this volume. + // More info: https://kubernetes.io/docs/concepts/storage/volumes#secret + // +optional + Secret *corev1.SecretVolumeSource `json:"secret,omitempty" protobuf:"bytes,2,opt,name=secret"` + + // configMap represents a ConfigMap that should populate this volume + // +optional + ConfigMap *corev1.ConfigMapVolumeSource `json:"configMap,omitempty" protobuf:"bytes,3,opt,name=configMap"` +} + +// BuildVolumeMount describes the mounting of a Volume within buildah's runtime environment. +type BuildVolumeMount struct { + // destinationPath is the path within the buildah runtime environment at which the volume should be mounted. + // The transient mount within the build image and the backing volume will both be mounted read only. + // Must be an absolute path, must not contain '..' or ':', and must not collide with a destination path generated + // by the builder process + // Paths that collide with those added by the build controller will result in a + // failed build with an error message detailing which path caused the error. + DestinationPath string `json:"destinationPath" protobuf:"bytes,1,opt,name=destinationPath"` +} diff --git a/vendor/github.com/openshift/api/build/v1/zz_generated.deepcopy.go b/vendor/github.com/openshift/api/build/v1/zz_generated.deepcopy.go index 3d5bf33df10..2aa4644cd61 100644 --- a/vendor/github.com/openshift/api/build/v1/zz_generated.deepcopy.go +++ b/vendor/github.com/openshift/api/build/v1/zz_generated.deepcopy.go @@ -747,6 +747,70 @@ func (in *BuildTriggerPolicy) DeepCopy() *BuildTriggerPolicy { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BuildVolume) DeepCopyInto(out *BuildVolume) { + *out = *in + in.Source.DeepCopyInto(&out.Source) + if in.Mounts != nil { + in, out := &in.Mounts, &out.Mounts + *out = make([]BuildVolumeMount, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BuildVolume. +func (in *BuildVolume) DeepCopy() *BuildVolume { + if in == nil { + return nil + } + out := new(BuildVolume) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BuildVolumeMount) DeepCopyInto(out *BuildVolumeMount) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BuildVolumeMount. +func (in *BuildVolumeMount) DeepCopy() *BuildVolumeMount { + if in == nil { + return nil + } + out := new(BuildVolumeMount) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BuildVolumeSource) DeepCopyInto(out *BuildVolumeSource) { + *out = *in + if in.Secret != nil { + in, out := &in.Secret, &out.Secret + *out = new(corev1.SecretVolumeSource) + (*in).DeepCopyInto(*out) + } + if in.ConfigMap != nil { + in, out := &in.ConfigMap, &out.ConfigMap + *out = new(corev1.ConfigMapVolumeSource) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BuildVolumeSource. +func (in *BuildVolumeSource) DeepCopy() *BuildVolumeSource { + if in == nil { + return nil + } + out := new(BuildVolumeSource) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *CommonSpec) DeepCopyInto(out *CommonSpec) { *out = *in @@ -894,6 +958,13 @@ func (in *DockerBuildStrategy) DeepCopyInto(out *DockerBuildStrategy) { *out = new(ImageOptimizationPolicy) **out = **in } + if in.Volumes != nil { + in, out := &in.Volumes, &out.Volumes + *out = make([]BuildVolume, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } @@ -1150,11 +1221,7 @@ func (in *ImageChangeTrigger) DeepCopy() *ImageChangeTrigger { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ImageChangeTriggerStatus) DeepCopyInto(out *ImageChangeTriggerStatus) { *out = *in - if in.From != nil { - in, out := &in.From, &out.From - *out = new(corev1.ObjectReference) - **out = **in - } + out.From = in.From in.LastTriggerTime.DeepCopyInto(&out.LastTriggerTime) return } @@ -1233,6 +1300,22 @@ func (in *ImageSourcePath) DeepCopy() *ImageSourcePath { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageStreamTagReference) DeepCopyInto(out *ImageStreamTagReference) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageStreamTagReference. +func (in *ImageStreamTagReference) DeepCopy() *ImageStreamTagReference { + if in == nil { + return nil + } + out := new(ImageStreamTagReference) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *JenkinsPipelineBuildStrategy) DeepCopyInto(out *JenkinsPipelineBuildStrategy) { *out = *in @@ -1380,6 +1463,13 @@ func (in *SourceBuildStrategy) DeepCopyInto(out *SourceBuildStrategy) { *out = new(bool) **out = **in } + if in.Volumes != nil { + in, out := &in.Volumes, &out.Volumes + *out = make([]BuildVolume, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } diff --git a/vendor/github.com/openshift/api/build/v1/zz_generated.swagger_doc_generated.go b/vendor/github.com/openshift/api/build/v1/zz_generated.swagger_doc_generated.go index fb8677b7f81..4eec03eb176 100644 --- a/vendor/github.com/openshift/api/build/v1/zz_generated.swagger_doc_generated.go +++ b/vendor/github.com/openshift/api/build/v1/zz_generated.swagger_doc_generated.go @@ -101,7 +101,7 @@ func (BuildConfigSpec) SwaggerDoc() map[string]string { var map_BuildConfigStatus = map[string]string{ "": "BuildConfigStatus contains current state of the build config object.", "lastVersion": "lastVersion is used to inform about number of last triggered build.", - "imageChangeTriggers": "ImageChangeTriggers is used to capture the runtime state of any ImageChangeTrigger specified in the BuildConfigSpec, including reconciled values of the lastTriggeredImageID and paused fields.", + "imageChangeTriggers": "ImageChangeTriggers captures the runtime state of any ImageChangeTrigger specified in the BuildConfigSpec, including the value reconciled by the OpenShift APIServer for the lastTriggeredImageID. There is a single entry in this array for each image change trigger in spec. Each trigger status references the ImageStreamTag that acts as the source of the trigger.", } func (BuildConfigStatus) SwaggerDoc() map[string]string { @@ -289,6 +289,37 @@ func (BuildTriggerPolicy) SwaggerDoc() map[string]string { return map_BuildTriggerPolicy } +var map_BuildVolume = map[string]string{ + "": "BuildVolume describes a volume that is made available to build pods, such that it can be mounted into buildah's runtime environment. Only a subset of Kubernetes Volume sources are supported.", + "name": "name is a unique identifier for this BuildVolume. It must conform to the Kubernetes DNS label standard and be unique within the pod. Names that collide with those added by the build controller will result in a failed build with an error message detailing which name caused the error. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names", + "source": "source represents the location and type of the mounted volume.", + "mounts": "mounts represents the location of the volume in the image build container", +} + +func (BuildVolume) SwaggerDoc() map[string]string { + return map_BuildVolume +} + +var map_BuildVolumeMount = map[string]string{ + "": "BuildVolumeMount describes the mounting of a Volume within buildah's runtime environment.", + "destinationPath": "destinationPath is the path within the buildah runtime environment at which the volume should be mounted. The transient mount within the build image and the backing volume will both be mounted read only. Must be an absolute path, must not contain '..' or ':', and must not collide with a destination path generated by the builder process Paths that collide with those added by the build controller will result in a failed build with an error message detailing which path caused the error.", +} + +func (BuildVolumeMount) SwaggerDoc() map[string]string { + return map_BuildVolumeMount +} + +var map_BuildVolumeSource = map[string]string{ + "": "BuildVolumeSource represents the source of a volume to mount Only one of its supported types may be specified at any given time.", + "type": "type is the BuildVolumeSourceType for the volume source. Type must match the populated volume source. Valid types are: Secret, ConfigMap", + "secret": "secret represents a Secret that should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret", + "configMap": "configMap represents a ConfigMap that should populate this volume", +} + +func (BuildVolumeSource) SwaggerDoc() map[string]string { + return map_BuildVolumeSource +} + var map_CommonSpec = map[string]string{ "": "CommonSpec encapsulates all the inputs necessary to represent a build.", "serviceAccount": "serviceAccount is the name of the ServiceAccount to use to run the pod created by this build. The pod will be allowed to use secrets referenced by the ServiceAccount", @@ -350,8 +381,9 @@ var map_DockerBuildStrategy = map[string]string{ "env": "env contains additional environment variables you want to pass into a builder container.", "forcePull": "forcePull describes if the builder should pull the images from registry prior to building.", "dockerfilePath": "dockerfilePath is the path of the Dockerfile that will be used to build the container image, relative to the root of the context (contextDir). Defaults to `Dockerfile` if unset.", - "buildArgs": "buildArgs contains build arguments that will be resolved in the Dockerfile. See https://docs.docker.com/engine/reference/builder/#/arg for more details.", + "buildArgs": "buildArgs contains build arguments that will be resolved in the Dockerfile. See https://docs.docker.com/engine/reference/builder/#/arg for more details. NOTE: Only the 'name' and 'value' fields are supported. Any settings on the 'valueFrom' field are ignored.", "imageOptimizationPolicy": "imageOptimizationPolicy describes what optimizations the system can use when building images to reduce the final size or time spent building the image. The default policy is 'None' which means the final build image will be equivalent to an image created by the container image build API. The experimental policy 'SkipLayers' will avoid commiting new layers in between each image step, and will fail if the Dockerfile cannot provide compatibility with the 'None' policy. An additional experimental policy 'SkipLayersAndWarn' is the same as 'SkipLayers' but simply warns if compatibility cannot be preserved.", + "volumes": "volumes is a list of input volumes that can be mounted into the builds runtime environment. Only a subset of Kubernetes Volume sources are supported by builds. More info: https://kubernetes.io/docs/concepts/storage/volumes", } func (DockerBuildStrategy) SwaggerDoc() map[string]string { @@ -470,10 +502,9 @@ func (ImageChangeTrigger) SwaggerDoc() map[string]string { var map_ImageChangeTriggerStatus = map[string]string{ "": "ImageChangeTriggerStatus tracks the latest resolved status of the associated ImageChangeTrigger policy specified in the BuildConfigSpec.Triggers struct.", - "lastTriggeredImageID": "lastTriggeredImageID is the sha/id of the imageref cited in the 'from' field the last time this BuildConfig was triggered. It is not necessarily the sha/id of the image change that triggered a build. This field is updated for all image change triggers when any of them triggers a build.", - "from": "from is the ImageStreamTag that is used as the source of the trigger. This can come from an ImageStream tag referenced in this BuildConfig's triggers, or the From image in this BuildConfig's build strategy.", - "paused": "paused is true if this trigger is temporarily disabled, and the setting on the spec has been reconciled. Optional.", - "lastTriggerTime": "lastTriggerTime is the last time the BuildConfig was triggered by a change in the ImageStreamTag associated with this trigger.", + "lastTriggeredImageID": "lastTriggeredImageID represents the sha/id of the ImageStreamTag when a Build for this BuildConfig was started. The lastTriggeredImageID is updated each time a Build for this BuildConfig is started, even if this ImageStreamTag is not the reason the Build is started.", + "from": "from is the ImageStreamTag that is the source of the trigger.", + "lastTriggerTime": "lastTriggerTime is the last time this particular ImageStreamTag triggered a Build to start. This field is only updated when this trigger specifically started a Build.", } func (ImageChangeTriggerStatus) SwaggerDoc() map[string]string { @@ -512,6 +543,16 @@ func (ImageSourcePath) SwaggerDoc() map[string]string { return map_ImageSourcePath } +var map_ImageStreamTagReference = map[string]string{ + "": "ImageStreamTagReference references the ImageStreamTag in an image change trigger by namespace and name.", + "namespace": "namespace is the namespace where the ImageStreamTag for an ImageChangeTrigger is located", + "name": "name is the name of the ImageStreamTag for an ImageChangeTrigger", +} + +func (ImageStreamTagReference) SwaggerDoc() map[string]string { + return map_ImageStreamTagReference +} + var map_JenkinsPipelineBuildStrategy = map[string]string{ "": "JenkinsPipelineBuildStrategy holds parameters specific to a Jenkins Pipeline build. Deprecated: use OpenShift Pipelines", "jenkinsfilePath": "JenkinsfilePath is the optional path of the Jenkinsfile that will be used to configure the pipeline relative to the root of the context (contextDir). If both JenkinsfilePath & Jenkinsfile are both not specified, this defaults to Jenkinsfile in the root of the specified contextDir.", @@ -571,6 +612,7 @@ var map_SourceBuildStrategy = map[string]string{ "scripts": "scripts is the location of Source scripts", "incremental": "incremental flag forces the Source build to do incremental builds if true.", "forcePull": "forcePull describes if the builder should pull the images from registry prior to building.", + "volumes": "volumes is a list of input volumes that can be mounted into the builds runtime environment. Only a subset of Kubernetes Volume sources are supported by builds. More info: https://kubernetes.io/docs/concepts/storage/volumes", } func (SourceBuildStrategy) SwaggerDoc() map[string]string { diff --git a/vendor/github.com/openshift/library-go/pkg/build/buildutil/buildutil.go b/vendor/github.com/openshift/library-go/pkg/build/buildutil/buildutil.go new file mode 100644 index 00000000000..0ebc3d9a9d8 --- /dev/null +++ b/vendor/github.com/openshift/library-go/pkg/build/buildutil/buildutil.go @@ -0,0 +1,85 @@ +package buildutil + +import ( + corev1 "k8s.io/api/core/v1" + + buildv1 "github.com/openshift/api/build/v1" +) + +// GetInputReference returns the From ObjectReference associated with the +// BuildStrategy. +func GetInputReference(strategy buildv1.BuildStrategy) *corev1.ObjectReference { + switch { + case strategy.SourceStrategy != nil: + return &strategy.SourceStrategy.From + case strategy.DockerStrategy != nil: + return strategy.DockerStrategy.From + case strategy.CustomStrategy != nil: + return &strategy.CustomStrategy.From + default: + return nil + } +} + +// GetBuildEnv gets the build strategy environment +func GetBuildEnv(build *buildv1.Build) []corev1.EnvVar { + switch { + case build.Spec.Strategy.SourceStrategy != nil: + return build.Spec.Strategy.SourceStrategy.Env + case build.Spec.Strategy.DockerStrategy != nil: + return build.Spec.Strategy.DockerStrategy.Env + case build.Spec.Strategy.CustomStrategy != nil: + return build.Spec.Strategy.CustomStrategy.Env + case build.Spec.Strategy.JenkinsPipelineStrategy != nil: + return build.Spec.Strategy.JenkinsPipelineStrategy.Env + default: + return nil + } +} + +// SetBuildEnv replaces the current build environment +func SetBuildEnv(build *buildv1.Build, env []corev1.EnvVar) { + var oldEnv *[]corev1.EnvVar + + switch { + case build.Spec.Strategy.SourceStrategy != nil: + oldEnv = &build.Spec.Strategy.SourceStrategy.Env + case build.Spec.Strategy.DockerStrategy != nil: + oldEnv = &build.Spec.Strategy.DockerStrategy.Env + case build.Spec.Strategy.CustomStrategy != nil: + oldEnv = &build.Spec.Strategy.CustomStrategy.Env + case build.Spec.Strategy.JenkinsPipelineStrategy != nil: + oldEnv = &build.Spec.Strategy.JenkinsPipelineStrategy.Env + default: + return + } + *oldEnv = env +} + +// FindTriggerPolicy retrieves the BuildTrigger(s) of a given type from a build configuration. +// Returns nil if no matches are found. +func FindTriggerPolicy(triggerType buildv1.BuildTriggerType, config *buildv1.BuildConfig) (buildTriggers []buildv1.BuildTriggerPolicy) { + for _, specTrigger := range config.Spec.Triggers { + if specTrigger.Type == triggerType { + buildTriggers = append(buildTriggers, specTrigger) + } + } + return buildTriggers +} + +// ConfigNameForBuild returns the name of the build config from a +// build name. +func ConfigNameForBuild(build *buildv1.Build) string { + if build == nil { + return "" + } + if build.Annotations != nil { + if _, exists := build.Annotations[buildv1.BuildConfigAnnotation]; exists { + return build.Annotations[buildv1.BuildConfigAnnotation] + } + } + if _, exists := build.Labels[buildv1.BuildConfigLabel]; exists { + return build.Labels[buildv1.BuildConfigLabel] + } + return build.Labels[buildv1.BuildConfigLabelDeprecated] +} diff --git a/vendor/github.com/openshift/library-go/pkg/build/naming/namer.go b/vendor/github.com/openshift/library-go/pkg/build/naming/namer.go new file mode 100644 index 00000000000..1e06745b350 --- /dev/null +++ b/vendor/github.com/openshift/library-go/pkg/build/naming/namer.go @@ -0,0 +1,73 @@ +package naming + +import ( + "fmt" + "hash/fnv" + + kvalidation "k8s.io/apimachinery/pkg/util/validation" +) + +// GetName returns a name given a base ("deployment-5") and a suffix ("deploy") +// It will first attempt to join them with a dash. If the resulting name is longer +// than maxLength: if the suffix is too long, it will truncate the base name and add +// an 8-character hash of the [base]-[suffix] string. If the suffix is not too long, +// it will truncate the base, add the hash of the base and return [base]-[hash]-[suffix] +func GetName(base, suffix string, maxLength int) string { + if maxLength <= 0 { + return "" + } + name := fmt.Sprintf("%s-%s", base, suffix) + if len(name) <= maxLength { + return name + } + + baseLength := maxLength - 10 /*length of -hash-*/ - len(suffix) + + // if the suffix is too long, ignore it + if baseLength < 0 { + prefix := base[0:min(len(base), max(0, maxLength-9))] + // Calculate hash on initial base-suffix string + shortName := fmt.Sprintf("%s-%s", prefix, hash(name)) + return shortName[:min(maxLength, len(shortName))] + } + + prefix := base[0:baseLength] + // Calculate hash on initial base-suffix string + return fmt.Sprintf("%s-%s-%s", prefix, hash(base), suffix) +} + +// GetPodName calls GetName with the length restriction for pods +func GetPodName(base, suffix string) string { + return GetName(base, suffix, kvalidation.DNS1123SubdomainMaxLength) +} + +// GetConfigMapName calls GetName with the length restriction for ConfigMaps +func GetConfigMapName(base, suffix string) string { + return GetName(base, suffix, kvalidation.DNS1123SubdomainMaxLength) +} + +// max returns the greater of its 2 inputs +func max(a, b int) int { + if b > a { + return b + } + return a +} + +// min returns the lesser of its 2 inputs +func min(a, b int) int { + if b < a { + return b + } + return a +} + +// hash calculates the hexadecimal representation (8-chars) +// of the hash of the passed in string using the FNV-a algorithm +func hash(s string) string { + hash := fnv.New32a() + hash.Write([]byte(s)) + intHash := hash.Sum32() + result := fmt.Sprintf("%08x", intHash) + return result +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 70757379231..f1539f2d447 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -420,9 +420,9 @@ github.com/opencontainers/runtime-tools/validate github.com/opencontainers/selinux/go-selinux github.com/opencontainers/selinux/go-selinux/label github.com/opencontainers/selinux/pkg/pwalk -# github.com/openshift/api v0.0.0-20210331193751-3acddb19d360 +# github.com/openshift/api v0.0.0-20210621103532-064fc2f78417 github.com/openshift/api/build/v1 -# github.com/openshift/client-go v0.0.0-20210331195552-cf6c2669e01f +# github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 github.com/openshift/client-go/build/clientset/versioned github.com/openshift/client-go/build/clientset/versioned/fake github.com/openshift/client-go/build/clientset/versioned/scheme @@ -435,6 +435,8 @@ github.com/openshift/imagebuilder/dockerfile/parser github.com/openshift/imagebuilder/signal github.com/openshift/imagebuilder/strslice # github.com/openshift/library-go v0.0.0-20210430084706-e555322cb708 +github.com/openshift/library-go/pkg/build/buildutil +github.com/openshift/library-go/pkg/build/naming github.com/openshift/library-go/pkg/git github.com/openshift/library-go/pkg/image/internal/digest github.com/openshift/library-go/pkg/image/internal/reference @@ -709,7 +711,7 @@ gopkg.in/square/go-jose.v2/json gopkg.in/yaml.v2 # gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c gopkg.in/yaml.v3 -# k8s.io/api v0.21.0 => k8s.io/api v0.21.0 +# k8s.io/api v0.21.1 => k8s.io/api v0.21.0 k8s.io/api/admission/v1 k8s.io/api/admission/v1beta1 k8s.io/api/admissionregistration/v1 @@ -756,7 +758,7 @@ k8s.io/api/scheduling/v1beta1 k8s.io/api/storage/v1 k8s.io/api/storage/v1alpha1 k8s.io/api/storage/v1beta1 -# k8s.io/apimachinery v0.21.0 => k8s.io/apimachinery v0.21.0 +# k8s.io/apimachinery v0.21.1 => k8s.io/apimachinery v0.21.0 k8s.io/apimachinery/pkg/api/errors k8s.io/apimachinery/pkg/api/meta k8s.io/apimachinery/pkg/api/resource @@ -809,7 +811,7 @@ k8s.io/apimachinery/third_party/forked/golang/reflect k8s.io/cli-runtime/pkg/genericclioptions k8s.io/cli-runtime/pkg/printers k8s.io/cli-runtime/pkg/resource -# k8s.io/client-go v0.21.0 => k8s.io/client-go v0.21.0 +# k8s.io/client-go v0.21.1 => k8s.io/client-go v0.21.0 k8s.io/client-go/applyconfigurations/admissionregistration/v1 k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1 k8s.io/client-go/applyconfigurations/apiserverinternal/v1alpha1 @@ -936,7 +938,7 @@ k8s.io/client-go/util/homedir k8s.io/client-go/util/jsonpath k8s.io/client-go/util/keyutil k8s.io/client-go/util/workqueue -# k8s.io/component-base v0.21.0 => k8s.io/component-base v0.21.0 +# k8s.io/component-base v0.21.1 => k8s.io/component-base v0.21.0 k8s.io/component-base/logs k8s.io/component-base/logs/datapol k8s.io/component-base/logs/json From c2366f3494cf94d02f50c8aa5272bff832217a5d Mon Sep 17 00:00:00 2001 From: Corey Daley Date: Mon, 10 May 2021 12:40:42 -0400 Subject: [PATCH 2/2] Adding workflow to translate BuildVolumeMounts into buildah transient mounts https://issues.redhat.com/browse/BUILD-87 --- pkg/build/builder/cmd/builder.go | 14 +- pkg/build/builder/common.go | 4 + pkg/build/builder/daemonless.go | 150 ++++++++++---- pkg/build/builder/daemonless_test.go | 39 +++- pkg/build/builder/transient_mounts.go | 106 ++++++++++ pkg/build/builder/transient_mounts_test.go | 229 +++++++++++++++++++++ pkg/build/builder/util.go | 16 ++ pkg/build/builder/util/build.go | 36 ++++ pkg/build/builder/util_test.go | 79 +++++++ 9 files changed, 614 insertions(+), 59 deletions(-) create mode 100644 pkg/build/builder/transient_mounts.go create mode 100644 pkg/build/builder/transient_mounts_test.go create mode 100644 pkg/build/builder/util/build.go diff --git a/pkg/build/builder/cmd/builder.go b/pkg/build/builder/cmd/builder.go index 03b3767a6a0..a13f275bfdb 100644 --- a/pkg/build/builder/cmd/builder.go +++ b/pkg/build/builder/cmd/builder.go @@ -17,6 +17,7 @@ import ( restclient "k8s.io/client-go/rest" buildapiv1 "github.com/openshift/api/build/v1" + buildutil "github.com/openshift/builder/pkg/build/builder/util" buildscheme "github.com/openshift/client-go/build/clientset/versioned/scheme" buildclientv1 "github.com/openshift/client-go/build/clientset/versioned/typed/build/v1" "github.com/openshift/library-go/pkg/git" @@ -66,19 +67,12 @@ func newBuilderConfigFromEnvironment(out io.Writer, needsDocker bool) (*builderC cfg.out = out - buildStr := os.Getenv("BUILD") - cfg.build = &buildapiv1.Build{} - obj, _, err := buildJSONCodec.Decode([]byte(buildStr), nil, cfg.build) - if err != nil { - return nil, fmt.Errorf("unable to parse build string: %v", err) - } - ok := false - cfg.build, ok = obj.(*buildapiv1.Build) - if !ok { - return nil, fmt.Errorf("build string %s is not a build: %#v", buildStr, obj) + if err := buildutil.GetBuildFromEnv(cfg.build); err != nil { + return nil, err } + if log.Is(4) { redactedBuild := builderutil.SafeForLoggingBuild(cfg.build) bytes, err := runtime.Encode(buildJSONCodec, redactedBuild) diff --git a/pkg/build/builder/common.go b/pkg/build/builder/common.go index 20fbef91307..dcca860f2b9 100644 --- a/pkg/build/builder/common.go +++ b/pkg/build/builder/common.go @@ -56,6 +56,10 @@ const ( secretBuildSourceBaseMountPath = "/var/run/secrets/openshift.io/build" // BuildWorkDirMount is the working directory within the build pod, mounted as a volume. buildWorkDirMount = "/tmp/build" + // buildVolumeMountPath is where user defined BuildVolumes get mounted + buildVolumeMountPath = "/var/run/openshift.io/volumes" + // buildVolumeSuffix is a suffix for BuildVolume names + buildVolumeSuffix = "user-build-volume" ) var ( diff --git a/pkg/build/builder/daemonless.go b/pkg/build/builder/daemonless.go index 33e377417a8..bf5f36c7fbf 100644 --- a/pkg/build/builder/daemonless.go +++ b/pkg/build/builder/daemonless.go @@ -27,13 +27,16 @@ import ( "github.com/pkg/errors" "golang.org/x/sys/unix" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/kubernetes/pkg/credentialprovider" buildapiv1 "github.com/openshift/api/build/v1" + buildscheme "github.com/openshift/client-go/build/clientset/versioned/scheme" + s2ifs "github.com/openshift/source-to-image/pkg/util/fs" "github.com/openshift/builder/pkg/build/builder/cmd/dockercfg" - builderutil "github.com/openshift/builder/pkg/build/builder/util" - s2ifs "github.com/openshift/source-to-image/pkg/util/fs" + buildutil "github.com/openshift/builder/pkg/build/builder/util" ) const ( @@ -45,15 +48,22 @@ const ( var ( nodeCredentialsFile = "/var/lib/kubelet/config.json" + buildScheme = runtime.NewScheme() + buildCodecFactory = serializer.NewCodecFactory(buildscheme.Scheme) + buildJSONCodec runtime.Codec ) +func init() { + buildJSONCodec = buildCodecFactory.LegacyCodec(buildapiv1.SchemeGroupVersion) +} + // The build controller doesn't expect the CAP_ prefix to be used in the // entries in the list in the environment, but our runtime configuration // expects it to be provided, so massage the values into a suitabe list. func dropCapabilities() []string { var dropCapabilities []string - if dropCaps, ok := os.LookupEnv(builderutil.DropCapabilities); ok && dropCaps != "" { - dropCapabilities = strings.Split(os.Getenv(builderutil.DropCapabilities), ",") + if dropCaps, ok := os.LookupEnv(buildutil.DropCapabilities); ok && dropCaps != "" { + dropCapabilities = strings.Split(os.Getenv(buildutil.DropCapabilities), ",") for i := range dropCapabilities { dropCapabilities[i] = strings.ToUpper(dropCapabilities[i]) if !strings.HasPrefix(dropCapabilities[i], "CAP_") { @@ -272,7 +282,10 @@ func buildDaemonlessImage(sc types.SystemContext, store storage.Store, isolation } } - transientMounts := generateTransientMounts() + transientMounts, err := generateTransientMounts() + if err != nil { + return err + } // Use a profile provided in the image instead of the default provided // in runtime-tools's generator logic. @@ -311,31 +324,67 @@ func buildDaemonlessImage(sc types.SystemContext, store storage.Store, isolation PullPushRetryDelay: DefaultPushOrPullRetryDelay, } - _, _, err := imagebuildah.BuildDockerfiles(opts.Context, store, options, opts.Dockerfile) + _, _, err = imagebuildah.BuildDockerfiles(opts.Context, store, options, opts.Dockerfile) return err } -func generateTransientMounts() []string { - mounts := []string{} - mounts = appendRHSMMount(defaultMountStart, mounts) - mounts = appendETCPKIMount(defaultMountStart, mounts) - mounts = appendRHRepoMount(defaultMountStart, mounts) - mounts = appendCATrustMount(mounts) - return mounts +// appendBuildVolumeMounts appends the Build Volume Mounts to the Transient Mounts Map +func appendBuildVolumeMounts(mountsMap *TransientMounts) error { + build := &buildapiv1.Build{} + + if err := buildutil.GetBuildFromEnv(build); err != nil { + return err + } + + var buildVolumes []buildapiv1.BuildVolume + switch { + case build.Spec.Strategy.Type == buildapiv1.SourceBuildStrategyType: + buildVolumes = append(buildVolumes, build.Spec.Strategy.SourceStrategy.Volumes...) + case build.Spec.Strategy.Type == buildapiv1.DockerBuildStrategyType: + buildVolumes = append(buildVolumes, build.Spec.Strategy.DockerStrategy.Volumes...) + } + + for _, bv := range buildVolumes { + t := true + var sourcePath string + switch bv.Source.Type { + + case buildapiv1.BuildVolumeSourceTypeSecret: + sourcePath = PathForBuildVolume(bv.Source.Secret.SecretName) + case buildapiv1.BuildVolumeSourceTypeConfigMap: + sourcePath = PathForBuildVolume(bv.Source.ConfigMap.Name) + } + + for _, bvm := range bv.Mounts { + + if err := mountsMap.append(TransientMount{ + Destination: bvm.DestinationPath, + Source: sourcePath, + Options: TransientMountOptions{ + ReadOnly: &t, + }, + }); err != nil { + return err + } + } + + } + + return nil } -func appendRHRepoMount(pathStart string, mounts []string) []string { +func appendRHRepoMount(pathStart string, mountsMap *TransientMounts) error { path := filepath.Join(pathStart, repoFile) st, err := os.Stat(path) if err != nil { // since the presence of the repo file is not a given, we won't log this a V(0) log.V(4).Infof("Failed to stat %s, falling back to the Red Hat yum repository configuration in the build's base image. Error: %v", path, err) - return mounts + return nil } if !st.Mode().IsRegular() { // if the file is there, but an unexpected type, then always have log show up via V(0) log.V(0).Infof("Falling back to the Red Hat yum repository configuration in the build's base image: %s secrets location %s is a directory.", repoFile, path) - return mounts + return nil } // Add a bind of repo file, to pass along anything that the runtime mounted from the node @@ -343,30 +392,37 @@ func appendRHRepoMount(pathStart string, mounts []string) []string { tmpDir, err := ioutil.TempDir("/tmp", repoFile+"-copy") if err != nil { log.V(0).Infof("Falling back to the Red Hat yum repository configuration in the base image: failed to create tmpdir for %s secret: %v", repoFile, err) - return mounts + return nil } fs := s2ifs.NewFileSystem() err = fs.Copy(path, filepath.Join(tmpDir, repoFile), map[string]string{}) if err != nil { log.V(0).Infof("Falling back to the Red Hat yum repository configuration in the base image: failed to copy %s secret: %v", repoFile, err) - return mounts - } - mounts = append(mounts, fmt.Sprintf("%s:/run/secrets/%s:rw,nodev,noexec,nosuid", filepath.Join(tmpDir, repoFile), repoFile)) - return mounts + return nil + } + return mountsMap.append(TransientMount{ + Source: filepath.Join(tmpDir, repoFile), + Destination: filepath.Join("/run/secrets", repoFile), + Options: TransientMountOptions{ + NoDev: true, + NoExec: true, + NoSuid: true, + }, + }) } -func coreAppendSecretLinksToDirs(pathStart, pathEnd string, mounts []string) []string { +func coreAppendSecretLinksToDirs(pathStart, pathEnd string, mountsMap *TransientMounts) error { path := filepath.Join(pathStart, pathEnd) st, err := os.Stat(path) if err != nil { // since the presence of dir secret is not a given, we won't log this a V(0) log.V(4).Infof("Red Hat subscription content will not be available in this build: failed to stat directory %s: %v", path, err) - return mounts + return nil } if !st.IsDir() && (st.Mode()&os.ModeSymlink == 0) { // if the file is there, but an unexpected type, then always have log show up via V(0) log.V(0).Infof("Red Hat subscription content will not be available in this build: %s is not a directory", path) - return mounts + return nil } // Add a bind of dir secret, to pass along anything that the runtime mounted from the node @@ -374,55 +430,69 @@ func coreAppendSecretLinksToDirs(pathStart, pathEnd string, mounts []string) []s tmpDir, err := ioutil.TempDir("/tmp", pathEnd+"-copy") if err != nil { log.V(0).Infof("Red Hat subscription content will not be available in this build: failed to create tmpdir for %s secrets: %v", pathEnd, err) - return mounts + return nil } fs := s2ifs.NewFileSystem() err = fs.CopyContents(path, tmpDir, map[string]string{}) if err != nil { log.V(0).Infof("Red Hat subscription content will not be available in this build: failed to copy %s secrets: %v", pathEnd, err) - return mounts + return nil } - mounts = append(mounts, fmt.Sprintf("%s:/run/secrets/%s:rw,nodev,noexec,nosuid", tmpDir, pathEnd)) - return mounts + + return mountsMap.append(TransientMount{ + Destination: filepath.Join("/run/secrets", pathEnd), + Source: tmpDir, + Options: TransientMountOptions{ + NoDev: true, + NoExec: true, + NoSuid: true, + }, + }) } -func appendETCPKIMount(pathStart string, mounts []string) []string { - return coreAppendSecretLinksToDirs(pathStart, etcPkiEntitle, mounts) +func appendETCPKIMount(pathStart string, mountsMap *TransientMounts) error { + return coreAppendSecretLinksToDirs(pathStart, etcPkiEntitle, mountsMap) } -func appendRHSMMount(pathStart string, mounts []string) []string { - return coreAppendSecretLinksToDirs(pathStart, subMgrCertDir, mounts) +func appendRHSMMount(pathStart string, mountsMap *TransientMounts) error { + return coreAppendSecretLinksToDirs(pathStart, subMgrCertDir, mountsMap) } -func appendCATrustMount(mounts []string) []string { +func appendCATrustMount(mountsMap *TransientMounts) error { mountCAEnv, exists := os.LookupEnv("BUILD_MOUNT_ETC_PKI_CATRUST") if !exists { - return mounts + return nil } mountCA, err := strconv.ParseBool(mountCAEnv) if err != nil { log.V(0).Infof("custom PKI trust bundle will not be available in this build: failed to parse BUILD_MOUNT_ETC_PKI_CATRUST: %v", err) - return mounts + return nil } if !mountCA { - return mounts + return nil } st, err := os.Stat("/etc/pki/ca-trust") if err != nil { log.V(0).Infof("custom PKI trust bundle will not be available in this build: failed to stat /etc/pki/ca-trust: %v", err) - return mounts + return nil } if !st.IsDir() { log.V(0).Infof("custom PKI trust bundle will not be available in this build: /etc/pki/ca-trust is not a directory") - return mounts + return nil } log.V(0).Infof("Adding transient ro bind mount for /etc/pki/ca-trust") - mounts = append(mounts, "/etc/pki/ca-trust:/etc/pki/ca-trust:ro") - return mounts + t := true + return mountsMap.append(TransientMount{ + Destination: "/etc/pki/ca-trust", + Source: "/etc/pki/ca-trust", + Options: TransientMountOptions{ + ReadOnly: &t, + }, + }) } func tagDaemonlessImage(sc types.SystemContext, store storage.Store, buildTag, pushTag string) error { diff --git a/pkg/build/builder/daemonless_test.go b/pkg/build/builder/daemonless_test.go index fd987774a22..7a218b6c2e3 100644 --- a/pkg/build/builder/daemonless_test.go +++ b/pkg/build/builder/daemonless_test.go @@ -8,10 +8,9 @@ import ( "strings" "testing" - "k8s.io/kubernetes/pkg/credentialprovider" - docker "github.com/fsouza/go-dockerclient" builderutil "github.com/openshift/builder/pkg/build/builder/util" + "k8s.io/kubernetes/pkg/credentialprovider" ) func TestMergeNodeCredentials(t *testing.T) { @@ -226,7 +225,7 @@ func TestParseDropCapabilities(t *testing.T) { } } -type appendFunc func(string, []string) []string +type appendFunc func(string, *TransientMounts) error func coreTestSubscriptionDirMounts(t *testing.T, path string, fn appendFunc) { cases := []struct { @@ -307,7 +306,11 @@ func coreTestSubscriptionDirMounts(t *testing.T, path string, fn appendFunc) { t.Fatalf(err.Error()) } } - mounts := fn(tmpDir, []string{}) + mountsMap := make(TransientMounts) + if err := fn(tmpDir, &mountsMap); err != nil { + t.Errorf("%v", err) + } + mounts := mountsMap.asSlice() if tc.mode.IsRegular() && len(mounts) != 0 { t.Fatalf("bad mounts len %d for %s", len(mounts), tc.name) } @@ -345,7 +348,11 @@ func coreTestSubscriptionDirMounts(t *testing.T, path string, fn appendFunc) { t.Fatalf("bad mount string for %s: %s", tc.name, mounts[0]) } } else { - mounts := fn(filepath.Join(tmpDir, "does-not-exist"), []string{}) + mountsMap := make(TransientMounts) + if err := fn(filepath.Join(tmpDir, "does-not-exist"), &mountsMap); err != nil { + t.Errorf("%v", err) + } + mounts := mountsMap.asSlice() if len(mounts) != 0 { t.Fatalf("returned mount when it did not exist") } @@ -435,7 +442,13 @@ func TestRHRepoMount(t *testing.T) { t.Fatalf(err.Error()) } } - mounts := appendRHRepoMount(tmpDir, []string{}) + + mountsMap := make(TransientMounts) + if err := appendRHRepoMount(tmpDir, &mountsMap); err != nil { + t.Errorf("error occurred appending mount: %v", err) + } + mounts := mountsMap.asSlice() + if tc.mode.IsDir() && len(mounts) != 0 { t.Fatalf("bad mounts len %d for %s", len(mounts), tc.name) } @@ -458,7 +471,11 @@ func TestRHRepoMount(t *testing.T) { t.Fatalf("bad mount string for %s: %s", tc.name, mounts[0]) } } else { - mounts := appendRHRepoMount(filepath.Join(tmpDir, "does-not-exist"), []string{}) + mountsMap := make(TransientMounts) + if err := appendRHRepoMount(filepath.Join(tmpDir, "does-not-exist"), &mountsMap); err != nil { + t.Errorf("error occurred appending mount: %v", err) + } + mounts := mountsMap.asSlice() if len(mounts) != 0 { t.Fatalf("returned mount when it did not exist") } @@ -509,9 +526,13 @@ func TestAppendCATrustMount(t *testing.T) { if err != nil { tc.expectMount = false } - mounts := []string{} - mounts = appendCATrustMount(mounts) + mountsMap := make(TransientMounts) + if err = appendCATrustMount(&mountsMap); err != nil { + t.Errorf("error occurred appending mount: %v", err) + } + + mounts := mountsMap.asSlice() if tc.expectMount && len(mounts) == 0 { t.Fatal("expected mount for /etc/pki/ca-trust") } diff --git a/pkg/build/builder/transient_mounts.go b/pkg/build/builder/transient_mounts.go new file mode 100644 index 00000000000..1155211bbdf --- /dev/null +++ b/pkg/build/builder/transient_mounts.go @@ -0,0 +1,106 @@ +package builder + +import ( + "fmt" + "strings" +) + +// TransientMountOptions are options that change how a transient mount is setup +type TransientMountOptions struct { + NoDev bool + NoExec bool + NoSuid bool + ReadOnly *bool +} + +//TransientMount is a structure to hold the data needed to construct a transient mount +type TransientMount struct { + Source string + Destination string + Options TransientMountOptions +} + +// returns the string representation of a transient mount +// format: source:destiation:option1,option2,... +func (tm *TransientMount) String() string { + var options []string + + if tm.Options.NoDev { + options = append(options, "nodev") + } + if tm.Options.NoExec { + options = append(options, "noexec") + } + if tm.Options.NoSuid { + options = append(options, "nosuid") + } + if tm.Options.ReadOnly != nil { + if *tm.Options.ReadOnly { + options = append(options, "ro") + } else { + options = append(options, "rw") + } + } + + var mount = []string{tm.Source, tm.Destination} + if len(options) != 0 { + mount = append(mount, strings.Join(options, ",")) + } + + return strings.Join(mount, ":") + +} + +// TransientMounts is a map of transient mounts with the destination as the key +// so we can detect duplicates quickly as we append new ones +type TransientMounts map[string]TransientMount + +// appends a transient mount to the map and returns an error if a duplicate +// destination is detected +func (t TransientMounts) append(mount TransientMount) error { + // transient mounts can have multiple destinations for each source + // but duplicate destinations are not supported + if _, ok := t[mount.Destination]; ok { + return fmt.Errorf("duplicate transient mount destination detected, %q already exists", mount.String()) + } + + t[mount.Destination] = mount + + return nil +} + +// returns a slice of the string representation of the transient mounts in the map +func (t TransientMounts) asSlice() []string { + var mounts []string + for _, m := range t { + mounts = append(mounts, m.String()) + } + return mounts +} + +// generateTransientMounts generates all of the transient mounts and returns a slice +// of their string representations +func generateTransientMounts() ([]string, error) { + mountsMap := make(TransientMounts) + + if err := appendRHSMMount(defaultMountStart, &mountsMap); err != nil { + return []string{}, err + } + if err := appendETCPKIMount(defaultMountStart, &mountsMap); err != nil { + return []string{}, err + } + if err := appendRHRepoMount(defaultMountStart, &mountsMap); err != nil { + return []string{}, err + } + if err := appendCATrustMount(&mountsMap); err != nil { + return []string{}, err + } + // this should always be last in case there is a collision + if err := appendBuildVolumeMounts(&mountsMap); err != nil { + return []string{}, err + } + + log.V(5).Infof("transient mounts: %#v", mountsMap.asSlice()) + + return mountsMap.asSlice(), nil +} diff --git a/pkg/build/builder/transient_mounts_test.go b/pkg/build/builder/transient_mounts_test.go new file mode 100644 index 00000000000..426982bd70c --- /dev/null +++ b/pkg/build/builder/transient_mounts_test.go @@ -0,0 +1,229 @@ +package builder + +import ( + "reflect" + "testing" +) + +func TestTransientMountsMap_append(t *testing.T) { + tests := []struct { + name string + mounts []TransientMount + want TransientMounts + wantErr bool + wantErrMsg string + }{ + { + name: "should succeed", + mounts: []TransientMount{ + { + Source: "/volume/test1", + Destination: "/test1", + Options: TransientMountOptions{}, + }, + { + Source: "/volume/test2", + Destination: "/test2", + Options: TransientMountOptions{}, + }, + { + Source: "/volume/test3", + Destination: "/test3", + Options: TransientMountOptions{}, + }, + }, + want: TransientMounts{ + "/test1": { + Source: "/volume/test1", + Destination: "/test1", + Options: TransientMountOptions{}, + }, + "/test2": { + Source: "/volume/test2", + Destination: "/test2", + Options: TransientMountOptions{}, + }, + "/test3": { + Source: "/volume/test3", + Destination: "/test3", + Options: TransientMountOptions{}, + }, + }, + wantErr: false, + wantErrMsg: "", + }, + { + name: "duplicate mount should fail with error message", + mounts: []TransientMount{ + { + Source: "/volume/test1", + Destination: "/test1", + Options: TransientMountOptions{}, + }, + { + Source: "/volume/test2", + Destination: "/test1", + Options: TransientMountOptions{}, + }, + }, + want: TransientMounts{ + "/test1": { + Source: "/volume/test1", + Destination: "/test1", + Options: TransientMountOptions{}, + }, + }, + wantErr: true, + wantErrMsg: "duplicate transient mount destination detected, \"/volume/test2:/test1\" already exists", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mountsMap := make(TransientMounts) + + var err error + + for _, m := range tt.mounts { + err = mountsMap.append(m) + if err != nil { + break + } + + } + if !tt.wantErr && err != nil { + t.Errorf("should not have encountered an error but did anyways: %v", err) + } + if tt.wantErr && err == nil { + t.Errorf("should have produced an error but didn't") + } + if tt.wantErr && err != nil && tt.wantErrMsg != err.Error() { + t.Errorf("incorrect error message, wanted: %v, got %v", tt.wantErrMsg, err.Error()) + } + if !reflect.DeepEqual(tt.want, mountsMap) { + t.Errorf("appending mounts did not produce the correct result, wanted: %#v, got %#v", tt.want, mountsMap) + } + }) + } +} + +func TestTransientMountsMap_asSlice(t *testing.T) { + tests := []struct { + name string + mounts []TransientMount + want []string + }{ + { + name: "should succeed", + mounts: []TransientMount{ + { + Source: "/volume/test1", + Destination: "/test1", + Options: TransientMountOptions{}, + }, + { + Source: "/volume/test2", + Destination: "/test2", + Options: TransientMountOptions{ + NoDev: true, + NoExec: true, + }, + }, + { + Source: "/volume/test3", + Destination: "/test3", + Options: TransientMountOptions{ + NoDev: false, + NoExec: true, + }, + }, + }, + want: []string{ + "/volume/test1:/test1", + "/volume/test2:/test2:nodev,noexec", + "/volume/test3:/test3:noexec", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mountsMap := make(TransientMounts) + + var err error + + for _, m := range tt.mounts { + err = mountsMap.append(m) + if err != nil { + break + } + + } + gotMounts := mountsMap.asSlice() + + if !reflect.DeepEqual(tt.want, gotMounts) { + t.Errorf("TransientMountsMap.asSlice() did not output correct data, wanted: %#v, got %#v", tt.want, gotMounts) + } + }) + } +} + +func TestTransientMount_String(t *testing.T) { + type fields struct { + Source string + Destination string + Options TransientMountOptions + } + tests := []struct { + name string + fields fields + want string + }{ + { + name: "mount with all true options", + fields: fields{ + Source: "/volumes/test1", + Destination: "/test1", + Options: TransientMountOptions{ + NoDev: true, + NoExec: true, + NoSuid: true, + }, + }, + want: "/volumes/test1:/test1:nodev,noexec,nosuid", + }, + { + name: "mount with all false", + fields: fields{ + Source: "/volumes/test1", + Destination: "/test1", + Options: TransientMountOptions{ + NoDev: false, + NoExec: false, + NoSuid: false, + }, + }, + want: "/volumes/test1:/test1", + }, + { + name: "mount with no options specified", + fields: fields{ + Source: "/volumes/test1", + Destination: "/test1", + }, + want: "/volumes/test1:/test1", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tm := TransientMount{ + Source: tt.fields.Source, + Destination: tt.fields.Destination, + Options: tt.fields.Options, + } + if got := tm.String(); got != tt.want { + t.Errorf("TransientMount.String() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/pkg/build/builder/util.go b/pkg/build/builder/util.go index e86dcc7dd5d..1a6e934f00c 100644 --- a/pkg/build/builder/util.go +++ b/pkg/build/builder/util.go @@ -6,12 +6,16 @@ import ( "fmt" "net/url" "os" + "path/filepath" "regexp" "strings" docker "github.com/fsouza/go-dockerclient" + kvalidation "k8s.io/apimachinery/pkg/util/validation" + buildapiv1 "github.com/openshift/api/build/v1" + "github.com/openshift/library-go/pkg/build/naming" s2iapi "github.com/openshift/source-to-image/pkg/api" s2iutil "github.com/openshift/source-to-image/pkg/util" @@ -150,3 +154,15 @@ func ParseProxyURL(proxy string) (*url.URL, error) { return proxyURL, err } + +// NameForBuildVolume returns a valid pod volume name for the provided build volume name. +func NameForBuildVolume(objName string) string { + // Volume names must be a valid DNS Label - see https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#dns-label-names + return naming.GetName(strings.ToLower(objName), buildVolumeSuffix, kvalidation.DNS1123LabelMaxLength) +} + +// PathForBuildVolume returns the path in the builder container where the build volume is mounted. +// This should not be confused with the destination path for the volume inside buildah's runtime environment. +func PathForBuildVolume(objName string) string { + return filepath.Join(buildVolumeMountPath, NameForBuildVolume(objName)) +} diff --git a/pkg/build/builder/util/build.go b/pkg/build/builder/util/build.go new file mode 100644 index 00000000000..a3bcb9ed713 --- /dev/null +++ b/pkg/build/builder/util/build.go @@ -0,0 +1,36 @@ +package util + +import ( + "fmt" + "os" + + buildapiv1 "github.com/openshift/api/build/v1" + buildscheme "github.com/openshift/client-go/build/clientset/versioned/scheme" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" +) + +var ( + buildCodecFactory = serializer.NewCodecFactory(buildscheme.Scheme) + buildJSONCodec runtime.Codec +) + +func init() { + buildJSONCodec = buildCodecFactory.LegacyCodec(buildapiv1.SchemeGroupVersion) +} + +func GetBuildFromEnv(build *buildapiv1.Build) error { + buildStr := os.Getenv("BUILD") + + obj, _, err := buildJSONCodec.Decode([]byte(buildStr), nil, build) + if err != nil { + return fmt.Errorf("unable to parse build string: %v", err) + } + _, ok := obj.(*buildapiv1.Build) + if !ok { + return fmt.Errorf("build string %s is not a build: %#v", buildStr, obj) + } + + return nil +} diff --git a/pkg/build/builder/util_test.go b/pkg/build/builder/util_test.go index bc37abdc6d7..d5b6f7086d1 100644 --- a/pkg/build/builder/util_test.go +++ b/pkg/build/builder/util_test.go @@ -1,6 +1,8 @@ package builder import ( + "fmt" + "path/filepath" "strings" "testing" ) @@ -57,3 +59,80 @@ func TestMergeEnv(t *testing.T) { } } } +func TestNameForBuildVolume(t *testing.T) { + type args struct { + objName string + } + tests := []struct { + name string + args args + want string + }{ + { + name: "Secret One", + args: args{objName: "secret-one"}, + want: fmt.Sprintf("secret-one-%s", buildVolumeSuffix), + }, + { + name: "ConfigMap One", + args: args{objName: "configmap-one"}, + want: fmt.Sprintf("configmap-one-%s", buildVolumeSuffix), + }, + { + name: "Greater than 47 characters", + args: args{objName: "build-volume-larger-than-47-characters-but-less-than-63"}, + want: fmt.Sprintf("build-volume-larger-than-47-characte-8c2b6813-%s", buildVolumeSuffix), + }, + { + name: "Should convert to lowercase", + args: args{objName: "Secret-One"}, + want: fmt.Sprintf("secret-one-%s", buildVolumeSuffix), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := NameForBuildVolume(tt.args.objName); got != tt.want { + t.Errorf("NameForBuildVolume() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestPathForBuildVolume(t *testing.T) { + type args struct { + objName string + } + tests := []struct { + name string + args args + want string + }{ + { + name: "Secret One", + args: args{"secret-one"}, + want: filepath.Join(buildVolumeMountPath, fmt.Sprintf("secret-one-%s", buildVolumeSuffix)), + }, + { + name: "ConfigMap One", + args: args{"configmap-one"}, + want: filepath.Join(buildVolumeMountPath, fmt.Sprintf("configmap-one-%s", buildVolumeSuffix)), + }, + { + name: "Greater than 47 characters", + args: args{objName: "build-volume-larger-than-47-characters-but-less-than-63"}, + want: filepath.Join(buildVolumeMountPath, fmt.Sprintf("build-volume-larger-than-47-characte-8c2b6813-%s", buildVolumeSuffix)), + }, + { + name: "Should convert to lowercase", + args: args{"Secret-One"}, + want: filepath.Join(buildVolumeMountPath, fmt.Sprintf("secret-one-%s", buildVolumeSuffix)), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := PathForBuildVolume(tt.args.objName); got != tt.want { + t.Errorf("PathForBuildVolume() = %v, want %v", got, tt.want) + } + }) + } +}