ingress: add alternate resource backend

Signed-off-by: Christopher M. Luciano <cmluciano@us.ibm.com>
This commit is contained in:
Christopher M. Luciano 2020-02-24 14:15:55 -05:00
parent 8508875e4d
commit 912f05bafb
No known key found for this signature in database
GPG Key ID: 5148DBB31F2843F1
23 changed files with 1014 additions and 365 deletions

View File

@ -10861,6 +10861,10 @@
"io.k8s.api.extensions.v1beta1.IngressBackend": {
"description": "IngressBackend describes all endpoints for a given service and port.",
"properties": {
"resource": {
"$ref": "#/definitions/io.k8s.api.core.v1.TypedLocalObjectReference",
"description": "Resource is an ObjectRef to another Kubernetes resource in the namespace of the Ingress object. If resource is specified, serviceName and servicePort must not be specified."
},
"serviceName": {
"description": "Specifies the name of the referenced service.",
"type": "string"
@ -10870,10 +10874,6 @@
"description": "Specifies the port of the referenced service."
}
},
"required": [
"serviceName",
"servicePort"
],
"type": "object"
},
"io.k8s.api.extensions.v1beta1.IngressList": {
@ -11790,6 +11790,10 @@
"io.k8s.api.networking.v1beta1.IngressBackend": {
"description": "IngressBackend describes all endpoints for a given service and port.",
"properties": {
"resource": {
"$ref": "#/definitions/io.k8s.api.core.v1.TypedLocalObjectReference",
"description": "Resource is an ObjectRef to another Kubernetes resource in the namespace of the Ingress object. If resource is specified, serviceName and servicePort must not be specified."
},
"serviceName": {
"description": "Specifies the name of the referenced service.",
"type": "string"
@ -11799,10 +11803,6 @@
"description": "Specifies the port of the referenced service."
}
},
"required": [
"serviceName",
"servicePort"
],
"type": "object"
},
"io.k8s.api.networking.v1beta1.IngressClass": {

View File

@ -1298,6 +1298,7 @@ func Convert_networking_Ingress_To_v1beta1_Ingress(in *networking.Ingress, out *
func autoConvert_v1beta1_IngressBackend_To_networking_IngressBackend(in *v1beta1.IngressBackend, out *networking.IngressBackend, s conversion.Scope) error {
out.ServiceName = in.ServiceName
out.ServicePort = in.ServicePort
out.Resource = (*core.TypedLocalObjectReference)(unsafe.Pointer(in.Resource))
return nil
}
@ -1309,6 +1310,7 @@ func Convert_v1beta1_IngressBackend_To_networking_IngressBackend(in *v1beta1.Ing
func autoConvert_networking_IngressBackend_To_v1beta1_IngressBackend(in *networking.IngressBackend, out *v1beta1.IngressBackend, s conversion.Scope) error {
out.ServiceName = in.ServiceName
out.ServicePort = in.ServicePort
out.Resource = (*v1.TypedLocalObjectReference)(unsafe.Pointer(in.Resource))
return nil
}

View File

@ -464,8 +464,16 @@ type HTTPIngressPath struct {
// IngressBackend describes all endpoints for a given service and port.
type IngressBackend struct {
// Specifies the name of the referenced service.
// +optional
ServiceName string
// Specifies the port of the referenced service.
// +optional
ServicePort intstr.IntOrString
// Resource is an ObjectRef to another Kubernetes resource in the namespace
// of the Ingress object. If resource is specified, serviceName and servicePort
// must not be specified.
// +optional
Resource *api.TypedLocalObjectReference
}

View File

@ -255,6 +255,7 @@ func Convert_networking_Ingress_To_v1beta1_Ingress(in *networking.Ingress, out *
func autoConvert_v1beta1_IngressBackend_To_networking_IngressBackend(in *v1beta1.IngressBackend, out *networking.IngressBackend, s conversion.Scope) error {
out.ServiceName = in.ServiceName
out.ServicePort = in.ServicePort
out.Resource = (*core.TypedLocalObjectReference)(unsafe.Pointer(in.Resource))
return nil
}
@ -266,6 +267,7 @@ func Convert_v1beta1_IngressBackend_To_networking_IngressBackend(in *v1beta1.Ing
func autoConvert_networking_IngressBackend_To_v1beta1_IngressBackend(in *networking.IngressBackend, out *v1beta1.IngressBackend, s conversion.Scope) error {
out.ServiceName = in.ServiceName
out.ServicePort = in.ServicePort
out.Resource = (*v1.TypedLocalObjectReference)(unsafe.Pointer(in.Resource))
return nil
}

View File

@ -198,7 +198,8 @@ var ValidateIngressName = apimachineryvalidation.NameIsDNSSubdomain
// IngressValidationOptions cover beta to GA transitions for HTTP PathType
type IngressValidationOptions struct {
requireRegexPath bool
requireRegexPath bool
allowResourceBackend bool
}
// ValidateIngress validates Ingresses on create and update.
@ -215,6 +216,8 @@ func ValidateIngressCreate(ingress *networking.Ingress, requestGV schema.GroupVe
opts = IngressValidationOptions{
// TODO(robscott): Remove regex validation for 1.19.
requireRegexPath: true,
// TODO(cmluciano): Allow resource backend for 1.19.
allowResourceBackend: false,
}
allErrs = append(allErrs, validateIngress(ingress, opts, requestGV)...)
annotationVal, annotationIsSet := ingress.Annotations[annotationIngressClass]
@ -233,7 +236,8 @@ func ValidateIngressUpdate(ingress, oldIngress *networking.Ingress, requestGV sc
// TODO(robscott): Remove regex validation for 1.19.
// Only require regex path validation for this Ingress if the previous
// version of the Ingress also passed that validation.
requireRegexPath: allPathsPassRegexValidation(oldIngress),
requireRegexPath: allPathsPassRegexValidation(oldIngress),
allowResourceBackend: resourceBackendPresent(oldIngress),
}
allErrs = append(allErrs, validateIngress(ingress, opts, requestGV)...)
@ -269,7 +273,7 @@ func ValidateIngressSpec(spec *networking.IngressSpec, fldPath *field.Path, opts
allErrs = append(allErrs, field.Invalid(fldPath, spec.Rules, errMsg))
}
if spec.Backend != nil {
allErrs = append(allErrs, validateIngressBackend(spec.Backend, fldPath.Child("backend"))...)
allErrs = append(allErrs, validateIngressBackend(spec.Backend, fldPath.Child("backend"), opts)...)
}
if len(spec.Rules) > 0 {
allErrs = append(allErrs, validateIngressRules(spec.Rules, fldPath.Child("rules"), opts)...)
@ -381,22 +385,34 @@ func validateHTTPIngressPath(path *networking.HTTPIngressPath, fldPath *field.Pa
}
}
allErrs = append(allErrs, validateIngressBackend(&path.Backend, fldPath.Child("backend"))...)
allErrs = append(allErrs, validateIngressBackend(&path.Backend, fldPath.Child("backend"), opts)...)
return allErrs
}
// validateIngressBackend tests if a given backend is valid.
func validateIngressBackend(backend *networking.IngressBackend, fldPath *field.Path) field.ErrorList {
func validateIngressBackend(backend *networking.IngressBackend, fldPath *field.Path, opts IngressValidationOptions) field.ErrorList {
allErrs := field.ErrorList{}
// All backends must reference a single local service by name, and a single service port by name or number.
if len(backend.ServiceName) == 0 {
return append(allErrs, field.Required(fldPath.Child("serviceName"), ""))
hasResourceBackend := backend.Resource != nil
hasServiceBackend := len(backend.ServiceName) > 0 || backend.ServicePort.IntVal != 0 || len(backend.ServicePort.StrVal) > 0
switch {
case hasResourceBackend && hasServiceBackend:
return append(allErrs, field.Invalid(fldPath, "", "cannot set both resource and service backends"))
case hasResourceBackend && !opts.allowResourceBackend:
return append(allErrs, field.Forbidden(fldPath.Child("resource"), "not supported; only service backends are supported in this version"))
case hasResourceBackend:
allErrs = append(allErrs, validateIngressTypedLocalObjectReference(backend.Resource, fldPath.Child("resource"))...)
default:
if len(backend.ServiceName) == 0 {
return append(allErrs, field.Required(fldPath.Child("serviceName"), ""))
}
for _, msg := range apivalidation.ValidateServiceName(backend.ServiceName, false) {
allErrs = append(allErrs, field.Invalid(fldPath.Child("serviceName"), backend.ServiceName, msg))
}
allErrs = append(allErrs, apivalidation.ValidatePortNumOrName(backend.ServicePort, fldPath.Child("servicePort"))...)
}
for _, msg := range apivalidation.ValidateServiceName(backend.ServiceName, false) {
allErrs = append(allErrs, field.Invalid(fldPath.Child("serviceName"), backend.ServiceName, msg))
}
allErrs = append(allErrs, apivalidation.ValidatePortNumOrName(backend.ServicePort, fldPath.Child("servicePort"))...)
return allErrs
}
@ -426,7 +442,7 @@ func validateIngressClassSpec(spec *networking.IngressClassSpec, fldPath *field.
allErrs = append(allErrs, field.TooLong(fldPath.Child("controller"), spec.Controller, maxLenIngressClassController))
}
allErrs = append(allErrs, validation.IsDomainPrefixedPath(fldPath.Child("controller"), spec.Controller)...)
allErrs = append(allErrs, validateIngressClassParameters(spec.Parameters, fldPath.Child("parameters"))...)
allErrs = append(allErrs, validateIngressTypedLocalObjectReference(spec.Parameters, fldPath.Child("parameters"))...)
return allErrs
}
@ -436,8 +452,8 @@ func validateIngressClassSpecUpdate(newSpec, oldSpec *networking.IngressClassSpe
return apivalidation.ValidateImmutableField(newSpec.Controller, oldSpec.Controller, fldPath.Child("controller"))
}
// validateIngressClassParameters ensures that Parameters fields are valid.
func validateIngressClassParameters(params *api.TypedLocalObjectReference, fldPath *field.Path) field.ErrorList {
// validateIngressTypedLocalObjectReference ensures that Parameters fields are valid.
func validateIngressTypedLocalObjectReference(params *api.TypedLocalObjectReference, fldPath *field.Path) field.ErrorList {
allErrs := field.ErrorList{}
if params == nil {
@ -487,3 +503,20 @@ func allPathsPassRegexValidation(ingress *networking.Ingress) bool {
}
return true
}
func resourceBackendPresent(ingress *networking.Ingress) bool {
if ingress.Spec.Backend != nil && ingress.Spec.Backend.Resource != nil {
return true
}
for _, rule := range ingress.Spec.Rules {
if rule.HTTP == nil {
continue
}
for _, path := range rule.HTTP.Paths {
if path.Backend.Resource != nil {
return true
}
}
}
return false
}

View File

@ -1030,6 +1030,88 @@ func TestValidateIngress(t *testing.T) {
"spec.rules[0].host",
},
},
"path resource backend and service name are not allowed together": {
tweakIngress: func(ing *networking.Ingress) {
ing.Spec.Rules[0].IngressRuleValue = networking.IngressRuleValue{
HTTP: &networking.HTTPIngressRuleValue{
Paths: []networking.HTTPIngressPath{
{
Path: "/foo",
PathType: &pathTypeImplementationSpecific,
Backend: networking.IngressBackend{
ServiceName: "default-backend",
Resource: &api.TypedLocalObjectReference{
APIGroup: utilpointer.StringPtr("example.com"),
Kind: "foo",
Name: "bar",
},
},
},
},
},
}
},
expectErrsOnFields: []string{
"spec.rules[0].http.paths[0].backend",
},
},
"path resource backend and service port are not allowed together": {
tweakIngress: func(ing *networking.Ingress) {
ing.Spec.Rules[0].IngressRuleValue = networking.IngressRuleValue{
HTTP: &networking.HTTPIngressRuleValue{
Paths: []networking.HTTPIngressPath{
{
Path: "/foo",
PathType: &pathTypeImplementationSpecific,
Backend: networking.IngressBackend{
ServicePort: intstr.FromInt(80),
Resource: &api.TypedLocalObjectReference{
APIGroup: utilpointer.StringPtr("example.com"),
Kind: "foo",
Name: "bar",
},
},
},
},
},
}
},
expectErrsOnFields: []string{
"spec.rules[0].http.paths[0].backend",
},
},
"spec.backend resource and service name are not allowed together": {
groupVersion: &networkingv1beta1.SchemeGroupVersion,
tweakIngress: func(ing *networking.Ingress) {
ing.Spec.Backend = &networking.IngressBackend{
ServiceName: "default-backend",
Resource: &api.TypedLocalObjectReference{
APIGroup: utilpointer.StringPtr("example.com"),
Kind: "foo",
Name: "bar",
},
}
},
expectErrsOnFields: []string{
"spec.backend",
},
},
"spec.backend resource and service port are not allowed together": {
groupVersion: &networkingv1beta1.SchemeGroupVersion,
tweakIngress: func(ing *networking.Ingress) {
ing.Spec.Backend = &networking.IngressBackend{
ServicePort: intstr.FromInt(80),
Resource: &api.TypedLocalObjectReference{
APIGroup: utilpointer.StringPtr("example.com"),
Kind: "foo",
Name: "bar",
},
}
},
expectErrsOnFields: []string{
"spec.backend",
},
},
}
for name, testCase := range testCases {
@ -1181,6 +1263,11 @@ func TestValidateIngressCreate(t *testing.T) {
ServiceName: "default-backend",
ServicePort: intstr.FromInt(80),
}
resourceBackend := &api.TypedLocalObjectReference{
APIGroup: utilpointer.StringPtr("example.com"),
Kind: "foo",
Name: "bar",
}
baseIngress := networking.Ingress{
ObjectMeta: metav1.ObjectMeta{
Name: "test123",
@ -1250,6 +1337,31 @@ func TestValidateIngressCreate(t *testing.T) {
},
expectedErrs: field.ErrorList{field.Invalid(field.NewPath("spec.rules[0].http.paths[0].path"), "/([a-z0-9]*)[", "must be a valid regex")},
},
"Spec.Backend.Resource field not allowed on create": {
tweakIngress: func(ingress *networking.Ingress) {
ingress.Spec.Backend = &networking.IngressBackend{
Resource: resourceBackend}
},
expectedErrs: field.ErrorList{field.Forbidden(field.NewPath("spec.backend.resource"), "not supported; only service backends are supported in this version")},
},
"Paths.Backend.Resource field not allowed on create": {
tweakIngress: func(ingress *networking.Ingress) {
ingress.Spec.Rules = []networking.IngressRule{{
Host: "foo.bar.com",
IngressRuleValue: networking.IngressRuleValue{
HTTP: &networking.HTTPIngressRuleValue{
Paths: []networking.HTTPIngressPath{{
Path: "/([a-z0-9]*)",
PathType: &implementationPathType,
Backend: networking.IngressBackend{
Resource: resourceBackend},
}},
},
},
}}
},
expectedErrs: field.ErrorList{field.Forbidden(field.NewPath("spec.rules[0].http.paths[0].backend.resource"), "not supported; only service backends are supported in this version")},
},
}
for name, testCase := range testCases {
@ -1277,6 +1389,11 @@ func TestValidateIngressUpdate(t *testing.T) {
ServiceName: "default-backend",
ServicePort: intstr.FromInt(80),
}
resourceBackend := &api.TypedLocalObjectReference{
APIGroup: utilpointer.StringPtr("example.com"),
Kind: "foo",
Name: "bar",
}
baseIngress := networking.Ingress{
ObjectMeta: metav1.ObjectMeta{
Name: "test123",
@ -1427,6 +1544,151 @@ func TestValidateIngressUpdate(t *testing.T) {
},
expectedErrs: field.ErrorList{},
},
"new Backend.Resource not allowed on update": {
tweakIngresses: func(newIngress, oldIngress *networking.Ingress) {
oldIngress.Spec.Backend = &defaultBackend
newIngress.Spec.Backend = &networking.IngressBackend{
Resource: resourceBackend}
},
expectedErrs: field.ErrorList{field.Forbidden(field.NewPath("spec.backend.resource"), "not supported; only service backends are supported in this version")},
},
"old Backend.Resource allowed on update": {
tweakIngresses: func(newIngress, oldIngress *networking.Ingress) {
oldIngress.Spec.Backend = &networking.IngressBackend{
Resource: resourceBackend}
newIngress.Spec.Backend = &networking.IngressBackend{
Resource: resourceBackend}
},
expectedErrs: field.ErrorList{},
},
"changing spec.backend from resource -> no resource": {
tweakIngresses: func(newIngress, oldIngress *networking.Ingress) {
oldIngress.Spec.Backend = &networking.IngressBackend{
Resource: resourceBackend}
newIngress.Spec.Backend = &defaultBackend
},
expectedErrs: field.ErrorList{},
},
"changing path backend from resource -> no resource": {
tweakIngresses: func(newIngress, oldIngress *networking.Ingress) {
oldIngress.Spec.Rules = []networking.IngressRule{{
Host: "foo.bar.com",
IngressRuleValue: networking.IngressRuleValue{
HTTP: &networking.HTTPIngressRuleValue{
Paths: []networking.HTTPIngressPath{{
Path: "/foo[",
PathType: &implementationPathType,
Backend: networking.IngressBackend{
Resource: resourceBackend},
}},
},
},
}}
newIngress.Spec.Rules = []networking.IngressRule{{
Host: "foo.bar.com",
IngressRuleValue: networking.IngressRuleValue{
HTTP: &networking.HTTPIngressRuleValue{
Paths: []networking.HTTPIngressPath{{
Path: "/bar[",
PathType: &implementationPathType,
Backend: defaultBackend,
}},
},
},
}}
},
expectedErrs: field.ErrorList{},
},
"changing path backend from resource -> resource": {
tweakIngresses: func(newIngress, oldIngress *networking.Ingress) {
oldIngress.Spec.Rules = []networking.IngressRule{{
Host: "foo.bar.com",
IngressRuleValue: networking.IngressRuleValue{
HTTP: &networking.HTTPIngressRuleValue{
Paths: []networking.HTTPIngressPath{{
Path: "/foo[",
PathType: &implementationPathType,
Backend: networking.IngressBackend{
Resource: resourceBackend},
}},
},
},
}}
newIngress.Spec.Rules = []networking.IngressRule{{
Host: "foo.bar.com",
IngressRuleValue: networking.IngressRuleValue{
HTTP: &networking.HTTPIngressRuleValue{
Paths: []networking.HTTPIngressPath{{
Path: "/bar[",
PathType: &implementationPathType,
Backend: networking.IngressBackend{
Resource: resourceBackend},
}},
},
},
}}
},
expectedErrs: field.ErrorList{},
},
"changing path backend from non-resource -> non-resource": {
tweakIngresses: func(newIngress, oldIngress *networking.Ingress) {
oldIngress.Spec.Rules = []networking.IngressRule{{
Host: "foo.bar.com",
IngressRuleValue: networking.IngressRuleValue{
HTTP: &networking.HTTPIngressRuleValue{
Paths: []networking.HTTPIngressPath{{
Path: "/foo[",
PathType: &implementationPathType,
Backend: defaultBackend,
}},
},
},
}}
newIngress.Spec.Rules = []networking.IngressRule{{
Host: "foo.bar.com",
IngressRuleValue: networking.IngressRuleValue{
HTTP: &networking.HTTPIngressRuleValue{
Paths: []networking.HTTPIngressPath{{
Path: "/bar[",
PathType: &implementationPathType,
Backend: defaultBackend,
}},
},
},
}}
},
expectedErrs: field.ErrorList{},
},
"changing path backend from non-resource -> resource": {
tweakIngresses: func(newIngress, oldIngress *networking.Ingress) {
oldIngress.Spec.Rules = []networking.IngressRule{{
Host: "foo.bar.com",
IngressRuleValue: networking.IngressRuleValue{
HTTP: &networking.HTTPIngressRuleValue{
Paths: []networking.HTTPIngressPath{{
Path: "/foo[",
PathType: &implementationPathType,
Backend: defaultBackend,
}},
},
},
}}
newIngress.Spec.Rules = []networking.IngressRule{{
Host: "foo.bar.com",
IngressRuleValue: networking.IngressRuleValue{
HTTP: &networking.HTTPIngressRuleValue{
Paths: []networking.HTTPIngressPath{{
Path: "/bar[",
PathType: &implementationPathType,
Backend: networking.IngressBackend{
Resource: resourceBackend},
}},
},
},
}}
},
expectedErrs: field.ErrorList{field.Forbidden(field.NewPath("spec.rules[0].http.paths[0].backend.resource"), "not supported; only service backends are supported in this version")},
},
}
for name, testCase := range testCases {
@ -1816,3 +2078,151 @@ func TestValidateIngressStatusUpdate(t *testing.T) {
}
}
}
func TestValidateResourceBackendPresent(t *testing.T) {
implementationPathType := networking.PathTypeImplementationSpecific
defaultBackend := networking.IngressBackend{
ServiceName: "default-backend",
ServicePort: intstr.FromInt(80),
}
resourceBackend := &api.TypedLocalObjectReference{
APIGroup: utilpointer.StringPtr("example.com"),
Kind: "foo",
Name: "bar",
}
baseIngress := networking.Ingress{
ObjectMeta: metav1.ObjectMeta{
Name: "foo",
Namespace: metav1.NamespaceDefault,
},
Spec: networking.IngressSpec{
Backend: &networking.IngressBackend{
ServiceName: "default-backend",
ServicePort: intstr.FromInt(80),
},
Rules: []networking.IngressRule{
{
Host: "foo.bar.com",
IngressRuleValue: networking.IngressRuleValue{
HTTP: &networking.HTTPIngressRuleValue{
Paths: []networking.HTTPIngressPath{
{
Path: "/foo",
PathType: &implementationPathType,
Backend: defaultBackend,
},
},
},
},
},
},
},
Status: networking.IngressStatus{
LoadBalancer: api.LoadBalancerStatus{
Ingress: []api.LoadBalancerIngress{
{IP: "127.0.0.1"},
},
},
},
}
testCases := map[string]struct {
groupVersion *schema.GroupVersion
tweakIngress func(ing *networking.Ingress)
expectResourceBackend bool
}{
"nil spec.Backend and no paths": {
tweakIngress: func(ing *networking.Ingress) {
ing.Spec.Backend = nil
ing.Spec.Rules[0].IngressRuleValue.HTTP.Paths[0].Path = ""
},
expectResourceBackend: false,
},
"nil spec.Backend.Resource and no paths": {
tweakIngress: func(ing *networking.Ingress) {
ing.Spec.Backend = nil
ing.Spec.Rules[0].IngressRuleValue.HTTP.Paths = []networking.HTTPIngressPath{}
},
expectResourceBackend: false,
},
"non-nil spec.Backend.Resource and no paths": {
tweakIngress: func(ing *networking.Ingress) {
ing.Spec.Backend = &networking.IngressBackend{
Resource: resourceBackend,
}
ing.Spec.Rules[0].IngressRuleValue.HTTP.Paths[0].Path = ""
},
expectResourceBackend: true,
},
"nil spec.Backend, one rule with nil HTTP ": {
tweakIngress: func(ing *networking.Ingress) {
ing.Spec.Backend = nil
ing.Spec.Rules[0].IngressRuleValue.HTTP = nil
},
expectResourceBackend: false,
},
"nil spec.Backend, one rule with non-nil HTTP, no paths": {
tweakIngress: func(ing *networking.Ingress) {
ing.Spec.Backend = nil
ing.Spec.Rules[0].IngressRuleValue = networking.IngressRuleValue{
HTTP: &networking.HTTPIngressRuleValue{
Paths: []networking.HTTPIngressPath{},
},
}
},
expectResourceBackend: false,
},
"nil spec.Backend, one rule with non-nil HTTP, one path with nil Backend.Resource": {
tweakIngress: func(ing *networking.Ingress) {
ing.Spec.Backend = nil
ing.Spec.Rules[0].IngressRuleValue = networking.IngressRuleValue{
HTTP: &networking.HTTPIngressRuleValue{
Paths: []networking.HTTPIngressPath{
{
Path: "/foo",
PathType: &implementationPathType,
Backend: networking.IngressBackend{
Resource: nil,
},
},
},
},
}
},
expectResourceBackend: false,
},
"nil spec.Backend, one rule with non-nil HTTP, one path with non-nil Backend.Resource": {
tweakIngress: func(ing *networking.Ingress) {
ing.Spec.Backend = nil
ing.Spec.Rules[0].IngressRuleValue = networking.IngressRuleValue{
HTTP: &networking.HTTPIngressRuleValue{
Paths: []networking.HTTPIngressPath{
{
Path: "/foo",
PathType: &implementationPathType,
Backend: networking.IngressBackend{
Resource: resourceBackend,
},
},
},
},
}
},
expectResourceBackend: true,
},
}
for name, testCase := range testCases {
t.Run(name, func(t *testing.T) {
ingress := baseIngress.DeepCopy()
testCase.tweakIngress(ingress)
gv := testCase.groupVersion
if gv == nil {
gv = &networkingv1.SchemeGroupVersion
}
isBackendAllowed := resourceBackendPresent(ingress)
if isBackendAllowed != testCase.expectResourceBackend {
t.Errorf("Expected resourceBackendPresent to return: %v, got: %v", testCase.expectResourceBackend, isBackendAllowed)
}
})
}
}

View File

@ -35,7 +35,7 @@ func (in *HTTPIngressPath) DeepCopyInto(out *HTTPIngressPath) {
*out = new(PathType)
**out = **in
}
out.Backend = in.Backend
in.Backend.DeepCopyInto(&out.Backend)
return
}
@ -125,6 +125,11 @@ func (in *Ingress) DeepCopyObject() runtime.Object {
func (in *IngressBackend) DeepCopyInto(out *IngressBackend) {
*out = *in
out.ServicePort = in.ServicePort
if in.Resource != nil {
in, out := &in.Resource, &out.Resource
*out = new(core.TypedLocalObjectReference)
(*in).DeepCopyInto(*out)
}
return
}
@ -301,7 +306,7 @@ func (in *IngressSpec) DeepCopyInto(out *IngressSpec) {
if in.Backend != nil {
in, out := &in.Backend, &out.Backend
*out = new(IngressBackend)
**out = **in
(*in).DeepCopyInto(*out)
}
if in.TLS != nil {
in, out := &in.TLS, &out.TLS

View File

@ -1683,239 +1683,241 @@ func init() {
}
var fileDescriptor_cdc93917efc28165 = []byte{
// 3705 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0x4f, 0x6c, 0x1b, 0x47,
0x77, 0xf7, 0x92, 0x94, 0x48, 0x3d, 0xfd, 0x1f, 0xc9, 0x12, 0x3f, 0xfb, 0xb3, 0xe8, 0x6f, 0x03,
0xb8, 0x4e, 0x6a, 0x93, 0xb1, 0x63, 0xfb, 0x73, 0x6d, 0x34, 0x89, 0x28, 0x59, 0xb6, 0x52, 0xfd,
0x61, 0x86, 0x92, 0x1b, 0x04, 0x4d, 0x9a, 0x15, 0x39, 0xa2, 0xd6, 0x5a, 0xee, 0x6e, 0x76, 0x96,
0x8a, 0x08, 0xf4, 0xd0, 0x43, 0x51, 0xa0, 0x40, 0x81, 0xf6, 0x92, 0xb6, 0xc7, 0x06, 0x05, 0x7a,
0x6a, 0xd1, 0xde, 0xda, 0x43, 0x10, 0xb4, 0x68, 0x0a, 0x18, 0x45, 0x5a, 0xe4, 0xd6, 0x9c, 0x84,
0x46, 0x39, 0x15, 0x3d, 0xf5, 0x56, 0xf8, 0x54, 0xcc, 0xec, 0xec, 0xff, 0x5d, 0x71, 0xa5, 0xd8,
0x42, 0x03, 0xf4, 0x64, 0x71, 0xde, 0x7b, 0xbf, 0xf7, 0x66, 0xe6, 0xcd, 0x7b, 0x6f, 0x66, 0x9f,
0x61, 0x65, 0xff, 0x3e, 0xad, 0xaa, 0x46, 0x6d, 0xbf, 0xb7, 0x43, 0x2c, 0x9d, 0xd8, 0x84, 0xd6,
0x0e, 0x88, 0xde, 0x36, 0xac, 0x9a, 0x20, 0x28, 0xa6, 0x5a, 0x23, 0x87, 0x36, 0xd1, 0xa9, 0x6a,
0xe8, 0xb4, 0x76, 0x70, 0x6b, 0x87, 0xd8, 0xca, 0xad, 0x5a, 0x87, 0xe8, 0xc4, 0x52, 0x6c, 0xd2,
0xae, 0x9a, 0x96, 0x61, 0x1b, 0xe8, 0x8a, 0xc3, 0x5e, 0x55, 0x4c, 0xb5, 0xea, 0xb3, 0x57, 0x05,
0xfb, 0xa5, 0x9b, 0x1d, 0xd5, 0xde, 0xeb, 0xed, 0x54, 0x5b, 0x46, 0xb7, 0xd6, 0x31, 0x3a, 0x46,
0x8d, 0x4b, 0xed, 0xf4, 0x76, 0xf9, 0x2f, 0xfe, 0x83, 0xff, 0xe5, 0xa0, 0x5d, 0x92, 0x03, 0xca,
0x5b, 0x86, 0x45, 0x6a, 0x07, 0x31, 0x8d, 0x97, 0xee, 0xf8, 0x3c, 0x5d, 0xa5, 0xb5, 0xa7, 0xea,
0xc4, 0xea, 0xd7, 0xcc, 0xfd, 0x0e, 0x1b, 0xa0, 0xb5, 0x2e, 0xb1, 0x95, 0x24, 0xa9, 0x5a, 0x9a,
0x94, 0xd5, 0xd3, 0x6d, 0xb5, 0x4b, 0x62, 0x02, 0xf7, 0x06, 0x09, 0xd0, 0xd6, 0x1e, 0xe9, 0x2a,
0x31, 0xb9, 0xb7, 0xd2, 0xe4, 0x7a, 0xb6, 0xaa, 0xd5, 0x54, 0xdd, 0xa6, 0xb6, 0x15, 0x15, 0x92,
0xef, 0xc0, 0xd4, 0xa2, 0xa6, 0x19, 0x9f, 0x91, 0xf6, 0x52, 0x73, 0x75, 0xd9, 0x52, 0x0f, 0x88,
0x85, 0xae, 0x42, 0x41, 0x57, 0xba, 0xa4, 0x2c, 0x5d, 0x95, 0xae, 0x8f, 0xd4, 0xc7, 0x9e, 0x1f,
0x55, 0x2e, 0x1c, 0x1f, 0x55, 0x0a, 0x1b, 0x4a, 0x97, 0x60, 0x4e, 0x91, 0x1f, 0xc2, 0xb4, 0x90,
0x5a, 0xd1, 0xc8, 0xe1, 0x53, 0x43, 0xeb, 0x75, 0x09, 0xba, 0x06, 0xc3, 0x6d, 0x0e, 0x20, 0x04,
0x27, 0x84, 0xe0, 0xb0, 0x03, 0x8b, 0x05, 0x55, 0xa6, 0x30, 0x29, 0x84, 0x9f, 0x18, 0xd4, 0x6e,
0x28, 0xf6, 0x1e, 0xba, 0x0d, 0x60, 0x2a, 0xf6, 0x5e, 0xc3, 0x22, 0xbb, 0xea, 0xa1, 0x10, 0x47,
0x42, 0x1c, 0x1a, 0x1e, 0x05, 0x07, 0xb8, 0xd0, 0x0d, 0x28, 0x59, 0x44, 0x69, 0x6f, 0xea, 0x5a,
0xbf, 0x9c, 0xbb, 0x2a, 0x5d, 0x2f, 0xd5, 0xa7, 0x84, 0x44, 0x09, 0x8b, 0x71, 0xec, 0x71, 0xc8,
0x9f, 0xe7, 0x60, 0x64, 0x59, 0x21, 0x5d, 0x43, 0x6f, 0x12, 0x1b, 0x7d, 0x02, 0x25, 0xb6, 0x5d,
0x6d, 0xc5, 0x56, 0xb8, 0xb6, 0xd1, 0xdb, 0x6f, 0x56, 0x7d, 0x77, 0xf2, 0x56, 0xaf, 0x6a, 0xee,
0x77, 0xd8, 0x00, 0xad, 0x32, 0xee, 0xea, 0xc1, 0xad, 0xea, 0xe6, 0xce, 0x33, 0xd2, 0xb2, 0xd7,
0x89, 0xad, 0xf8, 0xf6, 0xf9, 0x63, 0xd8, 0x43, 0x45, 0x1b, 0x50, 0xa0, 0x26, 0x69, 0x71, 0xcb,
0x46, 0x6f, 0xdf, 0xa8, 0x9e, 0xe8, 0xac, 0x55, 0xcf, 0xb2, 0xa6, 0x49, 0x5a, 0xfe, 0x8a, 0xb3,
0x5f, 0x98, 0xe3, 0xa0, 0xa7, 0x30, 0x4c, 0x6d, 0xc5, 0xee, 0xd1, 0x72, 0x9e, 0x23, 0x56, 0x33,
0x23, 0x72, 0x29, 0x7f, 0x33, 0x9c, 0xdf, 0x58, 0xa0, 0xc9, 0xff, 0x99, 0x03, 0xe4, 0xf1, 0x2e,
0x19, 0x7a, 0x5b, 0xb5, 0x55, 0x43, 0x47, 0x0f, 0xa0, 0x60, 0xf7, 0x4d, 0xd7, 0x05, 0xae, 0xb9,
0x06, 0x6d, 0xf5, 0x4d, 0xf2, 0xe2, 0xa8, 0x32, 0x17, 0x97, 0x60, 0x14, 0xcc, 0x65, 0xd0, 0x9a,
0x67, 0x6a, 0x8e, 0x4b, 0xdf, 0x09, 0xab, 0x7e, 0x71, 0x54, 0x49, 0x38, 0x6c, 0x55, 0x0f, 0x29,
0x6c, 0x20, 0x3a, 0x00, 0xa4, 0x29, 0xd4, 0xde, 0xb2, 0x14, 0x9d, 0x3a, 0x9a, 0xd4, 0x2e, 0x11,
0x8b, 0xf0, 0x46, 0xb6, 0x4d, 0x63, 0x12, 0xf5, 0x4b, 0xc2, 0x0a, 0xb4, 0x16, 0x43, 0xc3, 0x09,
0x1a, 0x98, 0x37, 0x5b, 0x44, 0xa1, 0x86, 0x5e, 0x2e, 0x84, 0xbd, 0x19, 0xf3, 0x51, 0x2c, 0xa8,
0xe8, 0x75, 0x28, 0x76, 0x09, 0xa5, 0x4a, 0x87, 0x94, 0x87, 0x38, 0xe3, 0xa4, 0x60, 0x2c, 0xae,
0x3b, 0xc3, 0xd8, 0xa5, 0xcb, 0x5f, 0x4a, 0x30, 0xee, 0xad, 0xdc, 0x9a, 0x4a, 0x6d, 0xf4, 0x5b,
0x31, 0x3f, 0xac, 0x66, 0x9b, 0x12, 0x93, 0xe6, 0x5e, 0xe8, 0xf9, 0xbc, 0x3b, 0x12, 0xf0, 0xc1,
0x75, 0x18, 0x52, 0x6d, 0xd2, 0x65, 0xfb, 0x90, 0xbf, 0x3e, 0x7a, 0xfb, 0x7a, 0x56, 0x97, 0xa9,
0x8f, 0x0b, 0xd0, 0xa1, 0x55, 0x26, 0x8e, 0x1d, 0x14, 0xf9, 0x4f, 0x0a, 0x01, 0xf3, 0x99, 0x6b,
0xa2, 0x8f, 0xa0, 0x44, 0x89, 0x46, 0x5a, 0xb6, 0x61, 0x09, 0xf3, 0xdf, 0xca, 0x68, 0xbe, 0xb2,
0x43, 0xb4, 0xa6, 0x10, 0xad, 0x8f, 0x31, 0xfb, 0xdd, 0x5f, 0xd8, 0x83, 0x44, 0xef, 0x43, 0xc9,
0x26, 0x5d, 0x53, 0x53, 0x6c, 0x22, 0xce, 0xd1, 0x6b, 0xc1, 0x29, 0x30, 0xcf, 0x61, 0x60, 0x0d,
0xa3, 0xbd, 0x25, 0xd8, 0xf8, 0xf1, 0xf1, 0x96, 0xc4, 0x1d, 0xc5, 0x1e, 0x0c, 0x3a, 0x80, 0x89,
0x9e, 0xd9, 0x66, 0x9c, 0x36, 0x8b, 0x82, 0x9d, 0xbe, 0xf0, 0xa4, 0x7b, 0x59, 0xd7, 0x66, 0x3b,
0x24, 0x5d, 0x9f, 0x13, 0xba, 0x26, 0xc2, 0xe3, 0x38, 0xa2, 0x05, 0x2d, 0xc2, 0x64, 0x57, 0xd5,
0x59, 0x5c, 0xea, 0x37, 0x49, 0xcb, 0xd0, 0xdb, 0x94, 0xbb, 0xd5, 0x50, 0x7d, 0x5e, 0x00, 0x4c,
0xae, 0x87, 0xc9, 0x38, 0xca, 0x8f, 0xde, 0x03, 0xe4, 0x4e, 0xe3, 0xb1, 0x13, 0xc4, 0x55, 0x43,
0xe7, 0x3e, 0x97, 0xf7, 0x9d, 0x7b, 0x2b, 0xc6, 0x81, 0x13, 0xa4, 0xd0, 0x1a, 0xcc, 0x5a, 0xe4,
0x40, 0x65, 0x73, 0x7c, 0xa2, 0x52, 0xdb, 0xb0, 0xfa, 0x6b, 0x6a, 0x57, 0xb5, 0xcb, 0xc3, 0xdc,
0xa6, 0xf2, 0xf1, 0x51, 0x65, 0x16, 0x27, 0xd0, 0x71, 0xa2, 0x94, 0xfc, 0xa7, 0xc3, 0x30, 0x19,
0x89, 0x37, 0xe8, 0x29, 0xcc, 0xb5, 0x7a, 0x96, 0x45, 0x74, 0x7b, 0xa3, 0xd7, 0xdd, 0x21, 0x56,
0xb3, 0xb5, 0x47, 0xda, 0x3d, 0x8d, 0xb4, 0xb9, 0xa3, 0x0c, 0xd5, 0x17, 0x84, 0xc5, 0x73, 0x4b,
0x89, 0x5c, 0x38, 0x45, 0x9a, 0xad, 0x82, 0xce, 0x87, 0xd6, 0x55, 0x4a, 0x3d, 0xcc, 0x1c, 0xc7,
0xf4, 0x56, 0x61, 0x23, 0xc6, 0x81, 0x13, 0xa4, 0x98, 0x8d, 0x6d, 0x42, 0x55, 0x8b, 0xb4, 0xa3,
0x36, 0xe6, 0xc3, 0x36, 0x2e, 0x27, 0x72, 0xe1, 0x14, 0x69, 0x74, 0x17, 0x46, 0x1d, 0x6d, 0x7c,
0xff, 0xc4, 0x46, 0xcf, 0x08, 0xb0, 0xd1, 0x0d, 0x9f, 0x84, 0x83, 0x7c, 0x6c, 0x6a, 0xc6, 0x0e,
0x25, 0xd6, 0x01, 0x69, 0xa7, 0x6f, 0xf0, 0x66, 0x8c, 0x03, 0x27, 0x48, 0xb1, 0xa9, 0x39, 0x1e,
0x18, 0x9b, 0xda, 0x70, 0x78, 0x6a, 0xdb, 0x89, 0x5c, 0x38, 0x45, 0x9a, 0xf9, 0xb1, 0x63, 0xf2,
0xe2, 0x81, 0xa2, 0x6a, 0xca, 0x8e, 0x46, 0xca, 0xc5, 0xb0, 0x1f, 0x6f, 0x84, 0xc9, 0x38, 0xca,
0x8f, 0x1e, 0xc3, 0xb4, 0x33, 0xb4, 0xad, 0x2b, 0x1e, 0x48, 0x89, 0x83, 0xfc, 0x4c, 0x80, 0x4c,
0x6f, 0x44, 0x19, 0x70, 0x5c, 0x06, 0x3d, 0x80, 0x89, 0x96, 0xa1, 0x69, 0xdc, 0x1f, 0x97, 0x8c,
0x9e, 0x6e, 0x97, 0x47, 0x38, 0x0a, 0x62, 0xe7, 0x71, 0x29, 0x44, 0xc1, 0x11, 0x4e, 0x44, 0x00,
0x5a, 0x6e, 0xc2, 0xa1, 0x65, 0xe0, 0xf1, 0xf1, 0x56, 0xd6, 0x18, 0xe0, 0xa5, 0x2a, 0xbf, 0x06,
0xf0, 0x86, 0x28, 0x0e, 0x00, 0xcb, 0xff, 0x22, 0xc1, 0x7c, 0x4a, 0xe8, 0x40, 0xef, 0x84, 0x52,
0xec, 0xaf, 0x46, 0x52, 0xec, 0xe5, 0x14, 0xb1, 0x40, 0x9e, 0xd5, 0x61, 0xdc, 0x62, 0xb3, 0xd2,
0x3b, 0x0e, 0x8b, 0x88, 0x91, 0x77, 0x07, 0x4c, 0x03, 0x07, 0x65, 0xfc, 0x98, 0x3f, 0x7d, 0x7c,
0x54, 0x19, 0x0f, 0xd1, 0x70, 0x18, 0x5e, 0xfe, 0xb3, 0x1c, 0xc0, 0x32, 0x31, 0x35, 0xa3, 0xdf,
0x25, 0xfa, 0x79, 0xd4, 0x50, 0x9b, 0xa1, 0x1a, 0xea, 0xe6, 0xa0, 0xed, 0xf1, 0x4c, 0x4b, 0x2d,
0xa2, 0x7e, 0x33, 0x52, 0x44, 0xd5, 0xb2, 0x43, 0x9e, 0x5c, 0x45, 0xfd, 0x7b, 0x1e, 0x66, 0x7c,
0x66, 0xbf, 0x8c, 0x7a, 0x18, 0xda, 0xe3, 0x5f, 0x89, 0xec, 0xf1, 0x7c, 0x82, 0xc8, 0x2b, 0xab,
0xa3, 0x9e, 0xc1, 0x04, 0xab, 0x72, 0x9c, 0xbd, 0xe4, 0x35, 0xd4, 0xf0, 0xa9, 0x6b, 0x28, 0x2f,
0xdb, 0xad, 0x85, 0x90, 0x70, 0x04, 0x39, 0xa5, 0x66, 0x2b, 0xfe, 0x14, 0x6b, 0xb6, 0xaf, 0x24,
0x98, 0xf0, 0xb7, 0xe9, 0x1c, 0x8a, 0xb6, 0x8d, 0x70, 0xd1, 0xf6, 0x7a, 0x66, 0x17, 0x4d, 0xa9,
0xda, 0xfe, 0x87, 0x15, 0xf8, 0x1e, 0x13, 0x3b, 0xe0, 0x3b, 0x4a, 0x6b, 0x7f, 0xf0, 0x1d, 0x0f,
0x7d, 0x2e, 0x01, 0x12, 0x59, 0x60, 0x51, 0xd7, 0x0d, 0x5b, 0x71, 0x62, 0xa5, 0x63, 0xd6, 0x6a,
0x66, 0xb3, 0x5c, 0x8d, 0xd5, 0xed, 0x18, 0xd6, 0x23, 0xdd, 0xb6, 0xfa, 0xfe, 0x26, 0xc7, 0x19,
0x70, 0x82, 0x01, 0x48, 0x01, 0xb0, 0x04, 0xe6, 0x96, 0x21, 0x0e, 0xf2, 0xcd, 0x0c, 0x31, 0x8f,
0x09, 0x2c, 0x19, 0xfa, 0xae, 0xda, 0xf1, 0xc3, 0x0e, 0xf6, 0x80, 0x70, 0x00, 0xf4, 0xd2, 0x23,
0x98, 0x4f, 0xb1, 0x16, 0x4d, 0x41, 0x7e, 0x9f, 0xf4, 0x9d, 0x65, 0xc3, 0xec, 0x4f, 0x34, 0x0b,
0x43, 0x07, 0x8a, 0xd6, 0x73, 0xc2, 0xef, 0x08, 0x76, 0x7e, 0x3c, 0xc8, 0xdd, 0x97, 0xe4, 0x2f,
0x87, 0x82, 0xbe, 0xc3, 0x2b, 0xe6, 0xeb, 0xec, 0xd2, 0x6a, 0x6a, 0x6a, 0x4b, 0xa1, 0xa2, 0x10,
0x1a, 0x73, 0x2e, 0xac, 0xce, 0x18, 0xf6, 0xa8, 0xa1, 0xda, 0x3a, 0xf7, 0x6a, 0x6b, 0xeb, 0xfc,
0xcb, 0xa9, 0xad, 0x7f, 0x1b, 0x4a, 0xd4, 0xad, 0xaa, 0x0b, 0x1c, 0xf2, 0xd6, 0x29, 0xe2, 0xab,
0x28, 0xa8, 0x3d, 0x05, 0x5e, 0x29, 0xed, 0x81, 0x26, 0x15, 0xd1, 0x43, 0xa7, 0x2c, 0xa2, 0x5f,
0x6a, 0xe1, 0xcb, 0xe2, 0x8d, 0xa9, 0xf4, 0x28, 0x69, 0xf3, 0xd8, 0x56, 0xf2, 0xe3, 0x4d, 0x83,
0x8f, 0x62, 0x41, 0x45, 0x1f, 0x85, 0x5c, 0xb6, 0x74, 0x16, 0x97, 0x9d, 0x48, 0x77, 0x57, 0xb4,
0x0d, 0xf3, 0xa6, 0x65, 0x74, 0x2c, 0x42, 0xe9, 0x32, 0x51, 0xda, 0x9a, 0xaa, 0x13, 0x77, 0x7d,
0x9c, 0x8a, 0xe8, 0xf2, 0xf1, 0x51, 0x65, 0xbe, 0x91, 0xcc, 0x82, 0xd3, 0x64, 0xe5, 0xe7, 0x05,
0x98, 0x8a, 0x66, 0xc0, 0x94, 0x22, 0x55, 0x3a, 0x53, 0x91, 0x7a, 0x23, 0x70, 0x18, 0x9c, 0x0a,
0x3e, 0xf0, 0x82, 0x13, 0x3b, 0x10, 0x8b, 0x30, 0x29, 0xa2, 0x81, 0x4b, 0x14, 0x65, 0xba, 0xb7,
0xfb, 0xdb, 0x61, 0x32, 0x8e, 0xf2, 0xa3, 0x87, 0x30, 0x6e, 0xf1, 0xba, 0xdb, 0x05, 0x70, 0x6a,
0xd7, 0x8b, 0x02, 0x60, 0x1c, 0x07, 0x89, 0x38, 0xcc, 0xcb, 0xea, 0x56, 0xbf, 0x1c, 0x75, 0x01,
0x0a, 0xe1, 0xba, 0x75, 0x31, 0xca, 0x80, 0xe3, 0x32, 0x68, 0x1d, 0x66, 0x7a, 0x7a, 0x1c, 0xca,
0x71, 0xe5, 0xcb, 0x02, 0x6a, 0x66, 0x3b, 0xce, 0x82, 0x93, 0xe4, 0xd0, 0x6e, 0xa8, 0x94, 0x1d,
0xe6, 0xe1, 0xf9, 0x76, 0xe6, 0x83, 0x97, 0xb9, 0x96, 0x4d, 0x28, 0xb7, 0x4b, 0x59, 0xcb, 0x6d,
0xf9, 0x1f, 0xa5, 0x60, 0x12, 0xf2, 0x4a, 0xe0, 0x41, 0xaf, 0x4c, 0x31, 0x89, 0x40, 0x75, 0x64,
0x24, 0x57, 0xbf, 0xf7, 0x4e, 0x55, 0xfd, 0xfa, 0xc9, 0x73, 0x70, 0xf9, 0xfb, 0x85, 0x04, 0x73,
0x2b, 0xcd, 0xc7, 0x96, 0xd1, 0x33, 0x5d, 0x73, 0x36, 0x4d, 0x67, 0x69, 0x7e, 0x09, 0x05, 0xab,
0xa7, 0xb9, 0xf3, 0x78, 0xcd, 0x9d, 0x07, 0xee, 0x69, 0x6c, 0x1e, 0x33, 0x11, 0x29, 0x67, 0x12,
0x4c, 0x00, 0x6d, 0xc0, 0xb0, 0xa5, 0xe8, 0x1d, 0xe2, 0xa6, 0xd5, 0x6b, 0x03, 0xac, 0x5f, 0x5d,
0xc6, 0x8c, 0x3d, 0x50, 0xd8, 0x70, 0x69, 0x2c, 0x50, 0xe4, 0x7f, 0x92, 0x60, 0xf2, 0xc9, 0xd6,
0x56, 0x63, 0x55, 0xe7, 0x27, 0x9a, 0xbf, 0xad, 0x5e, 0x85, 0x82, 0xa9, 0xd8, 0x7b, 0xd1, 0x4c,
0xcf, 0x68, 0x98, 0x53, 0xd0, 0x1d, 0x28, 0xb1, 0x7f, 0x99, 0x5d, 0xfc, 0x48, 0x8d, 0xf0, 0x40,
0x58, 0x6a, 0x88, 0xb1, 0x17, 0x81, 0xbf, 0xb1, 0xc7, 0x89, 0x3e, 0x80, 0x22, 0x8b, 0x3f, 0x44,
0x6f, 0x67, 0x2c, 0xd0, 0x85, 0x51, 0x75, 0x47, 0xc8, 0xaf, 0xb9, 0xc4, 0x00, 0x76, 0xe1, 0xe4,
0x7d, 0x98, 0x0d, 0x4c, 0x82, 0xad, 0xe2, 0x53, 0x96, 0x53, 0x51, 0x13, 0x86, 0x98, 0x76, 0x96,
0x39, 0xf3, 0x19, 0x9e, 0x40, 0x23, 0x0b, 0xe1, 0xd7, 0x47, 0xec, 0x17, 0xc5, 0x0e, 0x96, 0xbc,
0x0e, 0xe3, 0xfc, 0x19, 0xda, 0xb0, 0x6c, 0xbe, 0x98, 0xe8, 0x0a, 0xe4, 0xbb, 0xaa, 0x2e, 0xb2,
0xf3, 0xa8, 0x90, 0xc9, 0xb3, 0xcc, 0xc2, 0xc6, 0x39, 0x59, 0x39, 0x14, 0xf1, 0xca, 0x27, 0x2b,
0x87, 0x98, 0x8d, 0xcb, 0x8f, 0xa1, 0x28, 0x36, 0x29, 0x08, 0x94, 0x3f, 0x19, 0x28, 0x9f, 0x00,
0xb4, 0x09, 0xc5, 0xd5, 0x46, 0x5d, 0x33, 0x9c, 0x5a, 0xad, 0xa5, 0xb6, 0xad, 0xe8, 0x0e, 0x2e,
0xad, 0x2e, 0x63, 0xcc, 0x29, 0x48, 0x86, 0x61, 0x72, 0xd8, 0x22, 0xa6, 0xcd, 0xfd, 0x68, 0xa4,
0x0e, 0xcc, 0x37, 0x1e, 0xf1, 0x11, 0x2c, 0x28, 0xf2, 0x1f, 0xe5, 0xa0, 0x28, 0x96, 0xe3, 0x1c,
0xee, 0x6e, 0x6b, 0xa1, 0xbb, 0xdb, 0x1b, 0xd9, 0x5c, 0x23, 0xf5, 0xe2, 0xb6, 0x15, 0xb9, 0xb8,
0xdd, 0xc8, 0x88, 0x77, 0xf2, 0xad, 0xed, 0x6f, 0x25, 0x98, 0x08, 0x3b, 0x25, 0xba, 0x0b, 0xa3,
0x2c, 0x4d, 0xa9, 0x2d, 0xb2, 0xe1, 0x57, 0xc7, 0xde, 0xd3, 0x4d, 0xd3, 0x27, 0xe1, 0x20, 0x1f,
0xea, 0x78, 0x62, 0xcc, 0x8f, 0xc4, 0xa4, 0xd3, 0x97, 0xb4, 0x67, 0xab, 0x5a, 0xd5, 0xf9, 0x20,
0x53, 0x5d, 0xd5, 0xed, 0x4d, 0xab, 0x69, 0x5b, 0xaa, 0xde, 0x89, 0x29, 0xe2, 0x4e, 0x19, 0x44,
0x96, 0xff, 0x5e, 0x82, 0x51, 0x61, 0xf2, 0x39, 0xdc, 0x45, 0x7e, 0x23, 0x7c, 0x17, 0xb9, 0x96,
0xf1, 0x80, 0x27, 0x5f, 0x44, 0xfe, 0xd2, 0x37, 0x9d, 0x1d, 0x69, 0xe6, 0xd5, 0x7b, 0x06, 0xb5,
0xa3, 0x5e, 0xcd, 0x0e, 0x23, 0xe6, 0x14, 0xd4, 0x83, 0x29, 0x35, 0x12, 0x03, 0xc4, 0xd2, 0xd6,
0xb2, 0x59, 0xe2, 0x89, 0xd5, 0xcb, 0x02, 0x7e, 0x2a, 0x4a, 0xc1, 0x31, 0x15, 0x32, 0x81, 0x18,
0x17, 0x7a, 0x1f, 0x0a, 0x7b, 0xb6, 0x6d, 0x26, 0xbc, 0x72, 0x0f, 0x88, 0x3c, 0xbe, 0x09, 0x25,
0x3e, 0xbb, 0xad, 0xad, 0x06, 0xe6, 0x50, 0xf2, 0x3f, 0xe4, 0xbc, 0xf5, 0xe0, 0x57, 0x83, 0x77,
0xbd, 0xd9, 0x2e, 0x69, 0x0a, 0xa5, 0xdc, 0xff, 0x9c, 0x6b, 0xec, 0x6c, 0xc0, 0x70, 0x8f, 0x86,
0x63, 0xdc, 0x68, 0xcb, 0x8f, 0xc8, 0xd2, 0x59, 0x22, 0xf2, 0x68, 0x52, 0x34, 0x46, 0x4f, 0x20,
0x6f, 0x6b, 0x59, 0xaf, 0xa3, 0x02, 0x71, 0x6b, 0xad, 0xe9, 0x87, 0xb4, 0xad, 0xb5, 0x26, 0x66,
0x10, 0x68, 0x13, 0x86, 0x58, 0xd6, 0x63, 0x87, 0x38, 0x9f, 0x3d, 0x28, 0xb0, 0x15, 0xf4, 0x5d,
0x8a, 0xfd, 0xa2, 0xd8, 0xc1, 0x91, 0x3f, 0x85, 0xf1, 0xd0, 0x49, 0x47, 0x9f, 0xc0, 0x98, 0x66,
0x28, 0xed, 0xba, 0xa2, 0x29, 0x7a, 0x8b, 0xb8, 0x1f, 0x25, 0xae, 0x25, 0xdd, 0x6c, 0xd6, 0x02,
0x7c, 0x22, 0x4e, 0xcc, 0x0a, 0x25, 0x63, 0x41, 0x1a, 0x0e, 0x21, 0xca, 0x0a, 0x80, 0x3f, 0x47,
0x54, 0x81, 0x21, 0xe6, 0xa9, 0x4e, 0x46, 0x1a, 0xa9, 0x8f, 0x30, 0x0b, 0x99, 0x03, 0x53, 0xec,
0x8c, 0xa3, 0xdb, 0x00, 0x94, 0xb4, 0x2c, 0x62, 0xf3, 0xed, 0xcc, 0x85, 0x3f, 0x6c, 0x36, 0x3d,
0x0a, 0x0e, 0x70, 0xc9, 0xff, 0x2c, 0xc1, 0xf8, 0x06, 0xb1, 0x3f, 0x33, 0xac, 0xfd, 0x86, 0xa1,
0xa9, 0xad, 0xfe, 0x39, 0x84, 0x6b, 0x1c, 0x0a, 0xd7, 0x6f, 0x0e, 0xd8, 0x99, 0x90, 0x75, 0x69,
0x41, 0x5b, 0xfe, 0x4a, 0x82, 0xf9, 0x10, 0xe7, 0x23, 0xff, 0xf0, 0x6f, 0xc3, 0x90, 0x69, 0x58,
0xb6, 0x9b, 0xca, 0x4f, 0xa5, 0x90, 0x05, 0xc2, 0x40, 0x32, 0x67, 0x30, 0xd8, 0x41, 0x43, 0x6b,
0x90, 0xb3, 0x0d, 0xe1, 0xaa, 0xa7, 0xc3, 0x24, 0xc4, 0xaa, 0x83, 0xc0, 0xcc, 0x6d, 0x19, 0x38,
0x67, 0x1b, 0x6c, 0x23, 0xca, 0x21, 0xae, 0x60, 0xf8, 0x7a, 0x45, 0x33, 0xc0, 0x50, 0xd8, 0xb5,
0x8c, 0xee, 0x99, 0xe7, 0xe0, 0x6d, 0xc4, 0x8a, 0x65, 0x74, 0x31, 0xc7, 0x92, 0xbf, 0x96, 0x60,
0x3a, 0xc4, 0x79, 0x0e, 0xa9, 0xe3, 0xfd, 0x70, 0xea, 0xb8, 0x71, 0x9a, 0x89, 0xa4, 0x24, 0x90,
0xaf, 0x73, 0x91, 0x69, 0xb0, 0x09, 0xa3, 0x5d, 0x18, 0x35, 0x8d, 0x76, 0xf3, 0x25, 0x7c, 0x86,
0x9c, 0x64, 0x99, 0xb7, 0xe1, 0x63, 0xe1, 0x20, 0x30, 0x3a, 0x84, 0x69, 0x5d, 0xe9, 0x12, 0x6a,
0x2a, 0x2d, 0xd2, 0x7c, 0x09, 0x0f, 0x33, 0x17, 0xf9, 0x77, 0x8e, 0x28, 0x22, 0x8e, 0x2b, 0x41,
0xeb, 0x50, 0x54, 0x4d, 0x5e, 0x09, 0x8a, 0xea, 0x67, 0x60, 0x1e, 0x76, 0xea, 0x46, 0x27, 0x9e,
0x8b, 0x1f, 0xd8, 0xc5, 0x90, 0xff, 0x2a, 0xea, 0x0d, 0xcc, 0xff, 0xd0, 0x63, 0x28, 0xf1, 0x86,
0x90, 0x96, 0xa1, 0xb9, 0x5f, 0x24, 0xf8, 0x1d, 0x40, 0x8c, 0xbd, 0x38, 0xaa, 0x5c, 0x4e, 0x78,
0x6c, 0x76, 0xc9, 0xd8, 0x13, 0x46, 0x1b, 0x50, 0x30, 0x7f, 0x4c, 0x0d, 0xc4, 0xd3, 0x24, 0x2f,
0x7c, 0x38, 0x8e, 0xfc, 0x7b, 0xf9, 0x88, 0xb9, 0x3c, 0x59, 0x3e, 0x7b, 0x69, 0xbb, 0xee, 0xd5,
0x5c, 0xa9, 0x3b, 0xbf, 0x03, 0x45, 0x91, 0x6a, 0x85, 0x33, 0xff, 0xf2, 0x34, 0xce, 0x1c, 0xcc,
0x62, 0xde, 0x95, 0xc7, 0x1d, 0x74, 0x81, 0xd1, 0xc7, 0x30, 0x4c, 0x1c, 0x15, 0x4e, 0x6e, 0xbc,
0x77, 0x1a, 0x15, 0x7e, 0x5c, 0xf5, 0x4b, 0x5d, 0x31, 0x26, 0x50, 0xd1, 0x3b, 0x6c, 0xbd, 0x18,
0x2f, 0xbb, 0xba, 0xd1, 0x72, 0x81, 0xa7, 0xab, 0x2b, 0xce, 0xb4, 0xbd, 0xe1, 0x17, 0x47, 0x15,
0xf0, 0x7f, 0xe2, 0xa0, 0x84, 0xfc, 0xaf, 0x12, 0x4c, 0xf3, 0x15, 0x6a, 0xf5, 0x2c, 0xd5, 0xee,
0x9f, 0x5b, 0x62, 0x7a, 0x1a, 0x4a, 0x4c, 0x77, 0x06, 0x2c, 0x4b, 0xcc, 0xc2, 0xd4, 0xe4, 0xf4,
0x8d, 0x04, 0x17, 0x63, 0xdc, 0xe7, 0x10, 0x17, 0xb7, 0xc3, 0x71, 0xf1, 0xcd, 0xd3, 0x4e, 0x28,
0x25, 0x36, 0xfe, 0xf7, 0x74, 0xc2, 0x74, 0xf8, 0x49, 0xb9, 0x0d, 0x60, 0x5a, 0xea, 0x81, 0xaa,
0x91, 0x8e, 0xf8, 0xf8, 0x5e, 0x0a, 0xb4, 0x56, 0x79, 0x14, 0x1c, 0xe0, 0x42, 0x14, 0xe6, 0xda,
0x64, 0x57, 0xe9, 0x69, 0xf6, 0x62, 0xbb, 0xbd, 0xa4, 0x98, 0xca, 0x8e, 0xaa, 0xa9, 0xb6, 0x2a,
0x9e, 0x29, 0x46, 0xea, 0x0f, 0x9d, 0x8f, 0xe2, 0x49, 0x1c, 0x2f, 0x8e, 0x2a, 0x57, 0x92, 0xbe,
0x4a, 0xb9, 0x2c, 0x7d, 0x9c, 0x02, 0x8d, 0xfa, 0x50, 0xb6, 0xc8, 0xa7, 0x3d, 0xd5, 0x22, 0xed,
0x65, 0xcb, 0x30, 0x43, 0x6a, 0xf3, 0x5c, 0xed, 0xaf, 0x1f, 0x1f, 0x55, 0xca, 0x38, 0x85, 0x67,
0xb0, 0xe2, 0x54, 0x78, 0xf4, 0x0c, 0x66, 0x14, 0xd1, 0x04, 0x17, 0xd4, 0xea, 0x9c, 0x92, 0xfb,
0xc7, 0x47, 0x95, 0x99, 0xc5, 0x38, 0x79, 0xb0, 0xc2, 0x24, 0x50, 0x54, 0x83, 0xe2, 0x01, 0xef,
0x97, 0xa3, 0xe5, 0x21, 0x8e, 0xcf, 0x12, 0x41, 0xd1, 0x69, 0xa1, 0x63, 0x98, 0xc3, 0x2b, 0x4d,
0x7e, 0xfa, 0x5c, 0x2e, 0x76, 0x25, 0x65, 0xb5, 0xa4, 0x38, 0xf1, 0xfc, 0xa5, 0xba, 0xe4, 0x47,
0xad, 0x27, 0x3e, 0x09, 0x07, 0xf9, 0xd0, 0x47, 0x30, 0xb2, 0x27, 0xde, 0x35, 0x68, 0xb9, 0x98,
0x29, 0x09, 0x87, 0xde, 0x41, 0xea, 0xd3, 0x42, 0xc5, 0x88, 0x3b, 0x4c, 0xb1, 0x8f, 0x88, 0x5e,
0x87, 0x22, 0xff, 0xb1, 0xba, 0xcc, 0x9f, 0x01, 0x4b, 0x7e, 0x6c, 0x7b, 0xe2, 0x0c, 0x63, 0x97,
0xee, 0xb2, 0xae, 0x36, 0x96, 0xf8, 0x73, 0x74, 0x84, 0x75, 0xb5, 0xb1, 0x84, 0x5d, 0x3a, 0xfa,
0x04, 0x8a, 0x94, 0xac, 0xa9, 0x7a, 0xef, 0xb0, 0x0c, 0x99, 0x3e, 0x66, 0x37, 0x1f, 0x71, 0xee,
0xc8, 0x83, 0x9c, 0xaf, 0x41, 0xd0, 0xb1, 0x0b, 0x8b, 0xf6, 0x60, 0xc4, 0xea, 0xe9, 0x8b, 0x74,
0x9b, 0x12, 0xab, 0x3c, 0xca, 0x75, 0x0c, 0x0a, 0xe7, 0xd8, 0xe5, 0x8f, 0x6a, 0xf1, 0x56, 0xc8,
0xe3, 0xc0, 0x3e, 0x38, 0xda, 0x03, 0xe0, 0x3f, 0xf8, 0xdb, 0x5f, 0x79, 0x8e, 0xab, 0xba, 0x9f,
0x45, 0x55, 0xd2, 0x13, 0xa3, 0x78, 0xff, 0xf7, 0xc8, 0x38, 0x80, 0x8d, 0xfe, 0x50, 0x02, 0x44,
0x7b, 0xa6, 0xa9, 0x91, 0x2e, 0xd1, 0x6d, 0x45, 0xe3, 0xa3, 0xb4, 0x3c, 0xc6, 0x55, 0xbe, 0x3b,
0x68, 0x05, 0x63, 0x82, 0x51, 0xd5, 0xde, 0xb3, 0x7e, 0x9c, 0x15, 0x27, 0xe8, 0x65, 0x9b, 0xb8,
0x2b, 0x66, 0x3d, 0x9e, 0x69, 0x13, 0x93, 0x5f, 0x55, 0xfd, 0x4d, 0x14, 0x74, 0xec, 0xc2, 0xa2,
0xa7, 0x30, 0xe7, 0x36, 0x76, 0x62, 0xc3, 0xb0, 0x57, 0x54, 0x8d, 0xd0, 0x3e, 0xb5, 0x49, 0xb7,
0x3c, 0xc1, 0x1d, 0xcc, 0xeb, 0x6e, 0xc1, 0x89, 0x5c, 0x38, 0x45, 0x1a, 0x75, 0xa1, 0xe2, 0x06,
0x27, 0x76, 0x72, 0xbd, 0xe8, 0xf8, 0x88, 0xb6, 0x14, 0xcd, 0xf9, 0xd2, 0x31, 0xc9, 0x15, 0xbc,
0x76, 0x7c, 0x54, 0xa9, 0x2c, 0x9f, 0xcc, 0x8a, 0x07, 0x61, 0xa1, 0x0f, 0xa0, 0xac, 0xa4, 0xe9,
0x99, 0xe2, 0x7a, 0x7e, 0xce, 0x22, 0x5e, 0xaa, 0x82, 0x54, 0x69, 0x64, 0xc3, 0x94, 0x12, 0x6e,
0xb1, 0xa5, 0xe5, 0xe9, 0x4c, 0x8f, 0xa6, 0x91, 0xce, 0x5c, 0xff, 0xe1, 0x24, 0x42, 0xa0, 0x38,
0xa6, 0x01, 0xfd, 0x0e, 0x20, 0x25, 0xda, 0x15, 0x4c, 0xcb, 0x28, 0x53, 0xa2, 0x8b, 0xb5, 0x13,
0xfb, 0x6e, 0x17, 0x23, 0x51, 0x9c, 0xa0, 0x87, 0x15, 0xe8, 0x4a, 0xa4, 0x93, 0x99, 0x96, 0xe7,
0xb9, 0xf2, 0x5a, 0x36, 0xe5, 0x9e, 0x5c, 0xe0, 0x83, 0x4e, 0x14, 0x11, 0xc7, 0x95, 0xa0, 0x35,
0x98, 0x15, 0x83, 0xdb, 0x3a, 0x55, 0x76, 0x49, 0xb3, 0x4f, 0x5b, 0xb6, 0x46, 0xcb, 0x33, 0x3c,
0xbe, 0xf3, 0x8f, 0x8a, 0x8b, 0x09, 0x74, 0x9c, 0x28, 0x85, 0xde, 0x85, 0xa9, 0x5d, 0xc3, 0xda,
0x51, 0xdb, 0x6d, 0xa2, 0xbb, 0x48, 0xb3, 0x1c, 0x89, 0xbf, 0x03, 0xad, 0x44, 0x68, 0x38, 0xc6,
0x8d, 0x28, 0x5c, 0x14, 0xc8, 0x0d, 0xcb, 0x68, 0xad, 0x1b, 0x3d, 0xdd, 0x76, 0xca, 0xbe, 0x8b,
0x5e, 0x1a, 0xbd, 0xb8, 0x98, 0xc4, 0xf0, 0xe2, 0xa8, 0x72, 0x35, 0xb9, 0xca, 0xf7, 0x99, 0x70,
0x32, 0x36, 0x32, 0x61, 0x4c, 0xf4, 0xa7, 0xf3, 0x07, 0xa9, 0x72, 0x99, 0x1f, 0xfd, 0x07, 0x83,
0x03, 0x9e, 0x27, 0x12, 0x3d, 0xff, 0x53, 0xc7, 0x47, 0x95, 0xb1, 0x20, 0x03, 0x0e, 0x69, 0xe0,
0xfd, 0x48, 0xe2, 0x2b, 0xd8, 0xf9, 0xf4, 0x74, 0x9f, 0xae, 0x1f, 0xc9, 0x37, 0xed, 0xa5, 0xf5,
0x23, 0x05, 0x20, 0x4f, 0x7e, 0xd9, 0xfe, 0xaf, 0x1c, 0xcc, 0xf8, 0xcc, 0x99, 0xfb, 0x91, 0x12,
0x44, 0xfe, 0xbf, 0xaf, 0x3b, 0x5b, 0x8f, 0x90, 0xbf, 0x74, 0xff, 0xf7, 0x7a, 0x84, 0x7c, 0xdb,
0x52, 0x6e, 0x0f, 0x7f, 0x93, 0x0b, 0x4e, 0xe0, 0x94, 0x8d, 0x2a, 0x2f, 0xa1, 0xb5, 0xf9, 0x27,
0xd7, 0xeb, 0x22, 0x7f, 0x93, 0x87, 0xa9, 0xe8, 0x69, 0x0c, 0xf5, 0x33, 0x48, 0x03, 0xfb, 0x19,
0x1a, 0x30, 0xbb, 0xdb, 0xd3, 0xb4, 0x3e, 0x9f, 0x43, 0xa0, 0xa9, 0xc1, 0xf9, 0xb2, 0xf8, 0x73,
0x21, 0x39, 0xbb, 0x92, 0xc0, 0x83, 0x13, 0x25, 0xe3, 0xed, 0x0d, 0x85, 0x1f, 0xdb, 0xde, 0x30,
0x74, 0x86, 0xf6, 0x86, 0xe4, 0x0e, 0x91, 0xfc, 0x99, 0x3a, 0x44, 0xce, 0xd2, 0xdb, 0x90, 0x10,
0xc4, 0x06, 0xf6, 0xe9, 0xbe, 0x0d, 0x13, 0xe1, 0x7e, 0x1b, 0x67, 0x2f, 0x9d, 0x96, 0x1f, 0xf1,
0x05, 0x37, 0xb0, 0x97, 0xce, 0x38, 0xf6, 0x38, 0xe4, 0xdf, 0x97, 0x60, 0x2e, 0xb9, 0xaf, 0x16,
0x69, 0x30, 0xd1, 0x55, 0x0e, 0x83, 0xbd, 0xce, 0xd2, 0x19, 0x5f, 0xc6, 0x78, 0xa3, 0xc5, 0x7a,
0x08, 0x0b, 0x47, 0xb0, 0xe5, 0x1f, 0x24, 0x98, 0x4f, 0x69, 0x71, 0x38, 0x5f, 0x4b, 0xd0, 0x87,
0x50, 0xea, 0x2a, 0x87, 0xcd, 0x9e, 0xd5, 0x21, 0x67, 0x7e, 0x0b, 0xe4, 0x07, 0x7a, 0x5d, 0xa0,
0x60, 0x0f, 0x4f, 0xfe, 0x0b, 0x09, 0x7e, 0x96, 0x7a, 0x55, 0x42, 0xf7, 0x42, 0xdd, 0x18, 0x72,
0xa4, 0x1b, 0x03, 0xc5, 0x05, 0x5f, 0x51, 0x33, 0xc6, 0x17, 0x12, 0x94, 0xd3, 0xee, 0x8e, 0xe8,
0x6e, 0xc8, 0xc8, 0x5f, 0x44, 0x8c, 0x9c, 0x8e, 0xc9, 0xbd, 0x22, 0x1b, 0xff, 0x4d, 0x82, 0xcb,
0x27, 0xd4, 0x60, 0xde, 0x15, 0x85, 0xb4, 0x83, 0x5c, 0xfc, 0xd9, 0x5a, 0x7c, 0xf3, 0xf2, 0xaf,
0x28, 0x09, 0x3c, 0x38, 0x55, 0x1a, 0x6d, 0xc3, 0xbc, 0xb8, 0x1f, 0x45, 0x69, 0xa2, 0xbc, 0xe0,
0x4d, 0x6b, 0xcb, 0xc9, 0x2c, 0x38, 0x4d, 0x56, 0xfe, 0x6b, 0x09, 0xe6, 0x92, 0x1f, 0x05, 0xd0,
0x5b, 0xa1, 0x25, 0xaf, 0x44, 0x96, 0x7c, 0x32, 0x22, 0x25, 0x16, 0xfc, 0x63, 0x98, 0x10, 0x4f,
0x07, 0x02, 0x46, 0x38, 0xb3, 0x9c, 0x94, 0x41, 0x04, 0x84, 0x5b, 0xc0, 0xf2, 0x63, 0x12, 0x1e,
0xc3, 0x11, 0x34, 0xf9, 0x0f, 0x72, 0x30, 0xd4, 0x6c, 0x29, 0x1a, 0x39, 0x87, 0xfa, 0xf5, 0xbd,
0x50, 0xfd, 0x3a, 0xe8, 0xbf, 0x83, 0x71, 0xab, 0x52, 0x4b, 0x57, 0x1c, 0x29, 0x5d, 0xdf, 0xc8,
0x84, 0x76, 0x72, 0xd5, 0xfa, 0x6b, 0x30, 0xe2, 0x29, 0x3d, 0x5d, 0x32, 0x95, 0xff, 0x3c, 0x07,
0xa3, 0x01, 0x15, 0xa7, 0x4c, 0xc5, 0xbb, 0xa1, 0xfa, 0x23, 0x9f, 0xe1, 0xa1, 0x26, 0xa0, 0xab,
0xea, 0x56, 0x1c, 0x4e, 0x3b, 0xb3, 0xdf, 0xc0, 0x1a, 0x2f, 0x44, 0xde, 0x86, 0x09, 0x5b, 0xb1,
0x3a, 0xc4, 0xf6, 0x3e, 0x5c, 0x38, 0xed, 0x56, 0x5e, 0x5f, 0xfd, 0x56, 0x88, 0x8a, 0x23, 0xdc,
0x97, 0x1e, 0xc2, 0x78, 0x48, 0xd9, 0xa9, 0xba, 0x91, 0xff, 0x4e, 0x82, 0x5f, 0x0c, 0x7c, 0xec,
0x41, 0xf5, 0xd0, 0x21, 0xa9, 0x46, 0x0e, 0xc9, 0x42, 0x3a, 0xc0, 0xab, 0xeb, 0x6a, 0xab, 0xdf,
0x7c, 0xfe, 0xfd, 0xc2, 0x85, 0x6f, 0xbf, 0x5f, 0xb8, 0xf0, 0xdd, 0xf7, 0x0b, 0x17, 0x7e, 0xf7,
0x78, 0x41, 0x7a, 0x7e, 0xbc, 0x20, 0x7d, 0x7b, 0xbc, 0x20, 0x7d, 0x77, 0xbc, 0x20, 0xfd, 0xc7,
0xf1, 0x82, 0xf4, 0xc7, 0x3f, 0x2c, 0x5c, 0xf8, 0xb0, 0x28, 0xe0, 0xfe, 0x37, 0x00, 0x00, 0xff,
0xff, 0xb6, 0xd9, 0x2e, 0xa8, 0x61, 0x3e, 0x00, 0x00,
// 3743 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0x4d, 0x6c, 0x1c, 0xc7,
0x72, 0xd6, 0xec, 0x2e, 0xb9, 0xcb, 0xe2, 0x7f, 0x93, 0x22, 0xf7, 0x49, 0x4f, 0x5c, 0xbd, 0x31,
0xa0, 0xc8, 0x8e, 0xb4, 0x6b, 0xc9, 0x92, 0x9e, 0x22, 0x21, 0xef, 0x99, 0x4b, 0x8a, 0x12, 0x5f,
0xf8, 0xb3, 0xee, 0x25, 0x65, 0xc3, 0x88, 0x1d, 0x0f, 0x77, 0x9b, 0xcb, 0x11, 0x67, 0x67, 0xc6,
0xd3, 0xb3, 0x34, 0x17, 0xc8, 0x21, 0x87, 0x20, 0x80, 0x81, 0x00, 0xc9, 0xc5, 0x49, 0x8e, 0x31,
0x02, 0xe4, 0x94, 0x20, 0xc7, 0xe4, 0x60, 0x18, 0x09, 0xe2, 0x00, 0x42, 0xe0, 0x04, 0xbe, 0xc5,
0x27, 0x22, 0xa6, 0x4f, 0x41, 0x4e, 0xb9, 0x05, 0x3a, 0x05, 0xdd, 0xd3, 0xf3, 0x3f, 0xc3, 0x1d,
0xd2, 0x12, 0x11, 0x03, 0xef, 0x24, 0x6e, 0x57, 0xd5, 0x57, 0xd5, 0xdd, 0xd5, 0x55, 0xd5, 0x3d,
0x25, 0x58, 0xd9, 0xbf, 0x4f, 0xab, 0xaa, 0x51, 0xdb, 0xef, 0xed, 0x10, 0x4b, 0x27, 0x36, 0xa1,
0xb5, 0x03, 0xa2, 0xb7, 0x0d, 0xab, 0x26, 0x08, 0x8a, 0xa9, 0xd6, 0xc8, 0xa1, 0x4d, 0x74, 0xaa,
0x1a, 0x3a, 0xad, 0x1d, 0xdc, 0xda, 0x21, 0xb6, 0x72, 0xab, 0xd6, 0x21, 0x3a, 0xb1, 0x14, 0x9b,
0xb4, 0xab, 0xa6, 0x65, 0xd8, 0x06, 0xba, 0xe2, 0xb0, 0x57, 0x15, 0x53, 0xad, 0xfa, 0xec, 0x55,
0xc1, 0x7e, 0xe9, 0x66, 0x47, 0xb5, 0xf7, 0x7a, 0x3b, 0xd5, 0x96, 0xd1, 0xad, 0x75, 0x8c, 0x8e,
0x51, 0xe3, 0x52, 0x3b, 0xbd, 0x5d, 0xfe, 0x8b, 0xff, 0xe0, 0x7f, 0x39, 0x68, 0x97, 0xe4, 0x80,
0xf2, 0x96, 0x61, 0x91, 0xda, 0x41, 0x4c, 0xe3, 0xa5, 0x3b, 0x3e, 0x4f, 0x57, 0x69, 0xed, 0xa9,
0x3a, 0xb1, 0xfa, 0x35, 0x73, 0xbf, 0xc3, 0x06, 0x68, 0xad, 0x4b, 0x6c, 0x25, 0x49, 0xaa, 0x96,
0x26, 0x65, 0xf5, 0x74, 0x5b, 0xed, 0x92, 0x98, 0xc0, 0xbd, 0x41, 0x02, 0xb4, 0xb5, 0x47, 0xba,
0x4a, 0x4c, 0xee, 0xad, 0x34, 0xb9, 0x9e, 0xad, 0x6a, 0x35, 0x55, 0xb7, 0xa9, 0x6d, 0x45, 0x85,
0xe4, 0x3b, 0x30, 0xb5, 0xa8, 0x69, 0xc6, 0x27, 0xa4, 0xbd, 0xd4, 0x5c, 0x5d, 0xb6, 0xd4, 0x03,
0x62, 0xa1, 0xab, 0x50, 0xd0, 0x95, 0x2e, 0x29, 0x4b, 0x57, 0xa5, 0xeb, 0x23, 0xf5, 0xb1, 0xe7,
0x47, 0x95, 0x0b, 0xc7, 0x47, 0x95, 0xc2, 0x86, 0xd2, 0x25, 0x98, 0x53, 0xe4, 0x87, 0x30, 0x2d,
0xa4, 0x56, 0x34, 0x72, 0xf8, 0xd4, 0xd0, 0x7a, 0x5d, 0x82, 0xae, 0xc1, 0x70, 0x9b, 0x03, 0x08,
0xc1, 0x09, 0x21, 0x38, 0xec, 0xc0, 0x62, 0x41, 0x95, 0x29, 0x4c, 0x0a, 0xe1, 0x27, 0x06, 0xb5,
0x1b, 0x8a, 0xbd, 0x87, 0x6e, 0x03, 0x98, 0x8a, 0xbd, 0xd7, 0xb0, 0xc8, 0xae, 0x7a, 0x28, 0xc4,
0x91, 0x10, 0x87, 0x86, 0x47, 0xc1, 0x01, 0x2e, 0x74, 0x03, 0x4a, 0x16, 0x51, 0xda, 0x9b, 0xba,
0xd6, 0x2f, 0xe7, 0xae, 0x4a, 0xd7, 0x4b, 0xf5, 0x29, 0x21, 0x51, 0xc2, 0x62, 0x1c, 0x7b, 0x1c,
0xf2, 0x67, 0x39, 0x18, 0x59, 0x56, 0x48, 0xd7, 0xd0, 0x9b, 0xc4, 0x46, 0x1f, 0x41, 0x89, 0x6d,
0x57, 0x5b, 0xb1, 0x15, 0xae, 0x6d, 0xf4, 0xf6, 0x9b, 0x55, 0xdf, 0x9d, 0xbc, 0xd5, 0xab, 0x9a,
0xfb, 0x1d, 0x36, 0x40, 0xab, 0x8c, 0xbb, 0x7a, 0x70, 0xab, 0xba, 0xb9, 0xf3, 0x8c, 0xb4, 0xec,
0x75, 0x62, 0x2b, 0xbe, 0x7d, 0xfe, 0x18, 0xf6, 0x50, 0xd1, 0x06, 0x14, 0xa8, 0x49, 0x5a, 0xdc,
0xb2, 0xd1, 0xdb, 0x37, 0xaa, 0x27, 0x3a, 0x6b, 0xd5, 0xb3, 0xac, 0x69, 0x92, 0x96, 0xbf, 0xe2,
0xec, 0x17, 0xe6, 0x38, 0xe8, 0x29, 0x0c, 0x53, 0x5b, 0xb1, 0x7b, 0xb4, 0x9c, 0xe7, 0x88, 0xd5,
0xcc, 0x88, 0x5c, 0xca, 0xdf, 0x0c, 0xe7, 0x37, 0x16, 0x68, 0xf2, 0x7f, 0xe5, 0x00, 0x79, 0xbc,
0x4b, 0x86, 0xde, 0x56, 0x6d, 0xd5, 0xd0, 0xd1, 0x03, 0x28, 0xd8, 0x7d, 0xd3, 0x75, 0x81, 0x6b,
0xae, 0x41, 0x5b, 0x7d, 0x93, 0xbc, 0x38, 0xaa, 0xcc, 0xc5, 0x25, 0x18, 0x05, 0x73, 0x19, 0xb4,
0xe6, 0x99, 0x9a, 0xe3, 0xd2, 0x77, 0xc2, 0xaa, 0x5f, 0x1c, 0x55, 0x12, 0x0e, 0x5b, 0xd5, 0x43,
0x0a, 0x1b, 0x88, 0x0e, 0x00, 0x69, 0x0a, 0xb5, 0xb7, 0x2c, 0x45, 0xa7, 0x8e, 0x26, 0xb5, 0x4b,
0xc4, 0x22, 0xbc, 0x91, 0x6d, 0xd3, 0x98, 0x44, 0xfd, 0x92, 0xb0, 0x02, 0xad, 0xc5, 0xd0, 0x70,
0x82, 0x06, 0xe6, 0xcd, 0x16, 0x51, 0xa8, 0xa1, 0x97, 0x0b, 0x61, 0x6f, 0xc6, 0x7c, 0x14, 0x0b,
0x2a, 0x7a, 0x1d, 0x8a, 0x5d, 0x42, 0xa9, 0xd2, 0x21, 0xe5, 0x21, 0xce, 0x38, 0x29, 0x18, 0x8b,
0xeb, 0xce, 0x30, 0x76, 0xe9, 0xf2, 0x17, 0x12, 0x8c, 0x7b, 0x2b, 0xb7, 0xa6, 0x52, 0x1b, 0xfd,
0x6e, 0xcc, 0x0f, 0xab, 0xd9, 0xa6, 0xc4, 0xa4, 0xb9, 0x17, 0x7a, 0x3e, 0xef, 0x8e, 0x04, 0x7c,
0x70, 0x1d, 0x86, 0x54, 0x9b, 0x74, 0xd9, 0x3e, 0xe4, 0xaf, 0x8f, 0xde, 0xbe, 0x9e, 0xd5, 0x65,
0xea, 0xe3, 0x02, 0x74, 0x68, 0x95, 0x89, 0x63, 0x07, 0x45, 0xfe, 0xb3, 0x42, 0xc0, 0x7c, 0xe6,
0x9a, 0xe8, 0x03, 0x28, 0x51, 0xa2, 0x91, 0x96, 0x6d, 0x58, 0xc2, 0xfc, 0xb7, 0x32, 0x9a, 0xaf,
0xec, 0x10, 0xad, 0x29, 0x44, 0xeb, 0x63, 0xcc, 0x7e, 0xf7, 0x17, 0xf6, 0x20, 0xd1, 0x3b, 0x50,
0xb2, 0x49, 0xd7, 0xd4, 0x14, 0x9b, 0x88, 0x73, 0xf4, 0x5a, 0x70, 0x0a, 0xcc, 0x73, 0x18, 0x58,
0xc3, 0x68, 0x6f, 0x09, 0x36, 0x7e, 0x7c, 0xbc, 0x25, 0x71, 0x47, 0xb1, 0x07, 0x83, 0x0e, 0x60,
0xa2, 0x67, 0xb6, 0x19, 0xa7, 0xcd, 0xa2, 0x60, 0xa7, 0x2f, 0x3c, 0xe9, 0x5e, 0xd6, 0xb5, 0xd9,
0x0e, 0x49, 0xd7, 0xe7, 0x84, 0xae, 0x89, 0xf0, 0x38, 0x8e, 0x68, 0x41, 0x8b, 0x30, 0xd9, 0x55,
0x75, 0x16, 0x97, 0xfa, 0x4d, 0xd2, 0x32, 0xf4, 0x36, 0xe5, 0x6e, 0x35, 0x54, 0x9f, 0x17, 0x00,
0x93, 0xeb, 0x61, 0x32, 0x8e, 0xf2, 0xa3, 0x5f, 0x01, 0x72, 0xa7, 0xf1, 0xd8, 0x09, 0xe2, 0xaa,
0xa1, 0x73, 0x9f, 0xcb, 0xfb, 0xce, 0xbd, 0x15, 0xe3, 0xc0, 0x09, 0x52, 0x68, 0x0d, 0x66, 0x2d,
0x72, 0xa0, 0xb2, 0x39, 0x3e, 0x51, 0xa9, 0x6d, 0x58, 0xfd, 0x35, 0xb5, 0xab, 0xda, 0xe5, 0x61,
0x6e, 0x53, 0xf9, 0xf8, 0xa8, 0x32, 0x8b, 0x13, 0xe8, 0x38, 0x51, 0x4a, 0xfe, 0xf3, 0x61, 0x98,
0x8c, 0xc4, 0x1b, 0xf4, 0x14, 0xe6, 0x5a, 0x3d, 0xcb, 0x22, 0xba, 0xbd, 0xd1, 0xeb, 0xee, 0x10,
0xab, 0xd9, 0xda, 0x23, 0xed, 0x9e, 0x46, 0xda, 0xdc, 0x51, 0x86, 0xea, 0x0b, 0xc2, 0xe2, 0xb9,
0xa5, 0x44, 0x2e, 0x9c, 0x22, 0xcd, 0x56, 0x41, 0xe7, 0x43, 0xeb, 0x2a, 0xa5, 0x1e, 0x66, 0x8e,
0x63, 0x7a, 0xab, 0xb0, 0x11, 0xe3, 0xc0, 0x09, 0x52, 0xcc, 0xc6, 0x36, 0xa1, 0xaa, 0x45, 0xda,
0x51, 0x1b, 0xf3, 0x61, 0x1b, 0x97, 0x13, 0xb9, 0x70, 0x8a, 0x34, 0xba, 0x0b, 0xa3, 0x8e, 0x36,
0xbe, 0x7f, 0x62, 0xa3, 0x67, 0x04, 0xd8, 0xe8, 0x86, 0x4f, 0xc2, 0x41, 0x3e, 0x36, 0x35, 0x63,
0x87, 0x12, 0xeb, 0x80, 0xb4, 0xd3, 0x37, 0x78, 0x33, 0xc6, 0x81, 0x13, 0xa4, 0xd8, 0xd4, 0x1c,
0x0f, 0x8c, 0x4d, 0x6d, 0x38, 0x3c, 0xb5, 0xed, 0x44, 0x2e, 0x9c, 0x22, 0xcd, 0xfc, 0xd8, 0x31,
0x79, 0xf1, 0x40, 0x51, 0x35, 0x65, 0x47, 0x23, 0xe5, 0x62, 0xd8, 0x8f, 0x37, 0xc2, 0x64, 0x1c,
0xe5, 0x47, 0x8f, 0x61, 0xda, 0x19, 0xda, 0xd6, 0x15, 0x0f, 0xa4, 0xc4, 0x41, 0x7e, 0x22, 0x40,
0xa6, 0x37, 0xa2, 0x0c, 0x38, 0x2e, 0x83, 0x1e, 0xc0, 0x44, 0xcb, 0xd0, 0x34, 0xee, 0x8f, 0x4b,
0x46, 0x4f, 0xb7, 0xcb, 0x23, 0x1c, 0x05, 0xb1, 0xf3, 0xb8, 0x14, 0xa2, 0xe0, 0x08, 0x27, 0x22,
0x00, 0x2d, 0x37, 0xe1, 0xd0, 0x32, 0xf0, 0xf8, 0x78, 0x2b, 0x6b, 0x0c, 0xf0, 0x52, 0x95, 0x5f,
0x03, 0x78, 0x43, 0x14, 0x07, 0x80, 0xe5, 0x7f, 0x95, 0x60, 0x3e, 0x25, 0x74, 0xa0, 0x5f, 0x86,
0x52, 0xec, 0x6f, 0x46, 0x52, 0xec, 0xe5, 0x14, 0xb1, 0x40, 0x9e, 0xd5, 0x61, 0xdc, 0x62, 0xb3,
0xd2, 0x3b, 0x0e, 0x8b, 0x88, 0x91, 0x77, 0x07, 0x4c, 0x03, 0x07, 0x65, 0xfc, 0x98, 0x3f, 0x7d,
0x7c, 0x54, 0x19, 0x0f, 0xd1, 0x70, 0x18, 0x5e, 0xfe, 0x8b, 0x1c, 0xc0, 0x32, 0x31, 0x35, 0xa3,
0xdf, 0x25, 0xfa, 0x79, 0xd4, 0x50, 0x9b, 0xa1, 0x1a, 0xea, 0xe6, 0xa0, 0xed, 0xf1, 0x4c, 0x4b,
0x2d, 0xa2, 0xde, 0x8d, 0x14, 0x51, 0xb5, 0xec, 0x90, 0x27, 0x57, 0x51, 0xff, 0x91, 0x87, 0x19,
0x9f, 0xd9, 0x2f, 0xa3, 0x1e, 0x86, 0xf6, 0xf8, 0x37, 0x22, 0x7b, 0x3c, 0x9f, 0x20, 0xf2, 0xca,
0xea, 0xa8, 0x67, 0x30, 0xc1, 0xaa, 0x1c, 0x67, 0x2f, 0x79, 0x0d, 0x35, 0x7c, 0xea, 0x1a, 0xca,
0xcb, 0x76, 0x6b, 0x21, 0x24, 0x1c, 0x41, 0x4e, 0xa9, 0xd9, 0x8a, 0x3f, 0xc6, 0x9a, 0xed, 0x4b,
0x09, 0x26, 0xfc, 0x6d, 0x3a, 0x87, 0xa2, 0x6d, 0x23, 0x5c, 0xb4, 0xbd, 0x9e, 0xd9, 0x45, 0x53,
0xaa, 0xb6, 0xff, 0x65, 0x05, 0xbe, 0xc7, 0xc4, 0x0e, 0xf8, 0x8e, 0xd2, 0xda, 0x1f, 0x7c, 0xc7,
0x43, 0x9f, 0x49, 0x80, 0x44, 0x16, 0x58, 0xd4, 0x75, 0xc3, 0x56, 0x9c, 0x58, 0xe9, 0x98, 0xb5,
0x9a, 0xd9, 0x2c, 0x57, 0x63, 0x75, 0x3b, 0x86, 0xf5, 0x48, 0xb7, 0xad, 0xbe, 0xbf, 0xc9, 0x71,
0x06, 0x9c, 0x60, 0x00, 0x52, 0x00, 0x2c, 0x81, 0xb9, 0x65, 0x88, 0x83, 0x7c, 0x33, 0x43, 0xcc,
0x63, 0x02, 0x4b, 0x86, 0xbe, 0xab, 0x76, 0xfc, 0xb0, 0x83, 0x3d, 0x20, 0x1c, 0x00, 0xbd, 0xf4,
0x08, 0xe6, 0x53, 0xac, 0x45, 0x53, 0x90, 0xdf, 0x27, 0x7d, 0x67, 0xd9, 0x30, 0xfb, 0x13, 0xcd,
0xc2, 0xd0, 0x81, 0xa2, 0xf5, 0x9c, 0xf0, 0x3b, 0x82, 0x9d, 0x1f, 0x0f, 0x72, 0xf7, 0x25, 0xf9,
0x8b, 0xa1, 0xa0, 0xef, 0xf0, 0x8a, 0xf9, 0x3a, 0xbb, 0xb4, 0x9a, 0x9a, 0xda, 0x52, 0xa8, 0x28,
0x84, 0xc6, 0x9c, 0x0b, 0xab, 0x33, 0x86, 0x3d, 0x6a, 0xa8, 0xb6, 0xce, 0xbd, 0xda, 0xda, 0x3a,
0xff, 0x72, 0x6a, 0xeb, 0xdf, 0x83, 0x12, 0x75, 0xab, 0xea, 0x02, 0x87, 0xbc, 0x75, 0x8a, 0xf8,
0x2a, 0x0a, 0x6a, 0x4f, 0x81, 0x57, 0x4a, 0x7b, 0xa0, 0x49, 0x45, 0xf4, 0xd0, 0x29, 0x8b, 0xe8,
0x97, 0x5a, 0xf8, 0xb2, 0x78, 0x63, 0x2a, 0x3d, 0x4a, 0xda, 0x3c, 0xb6, 0x95, 0xfc, 0x78, 0xd3,
0xe0, 0xa3, 0x58, 0x50, 0xd1, 0x07, 0x21, 0x97, 0x2d, 0x9d, 0xc5, 0x65, 0x27, 0xd2, 0xdd, 0x15,
0x6d, 0xc3, 0xbc, 0x69, 0x19, 0x1d, 0x8b, 0x50, 0xba, 0x4c, 0x94, 0xb6, 0xa6, 0xea, 0xc4, 0x5d,
0x1f, 0xa7, 0x22, 0xba, 0x7c, 0x7c, 0x54, 0x99, 0x6f, 0x24, 0xb3, 0xe0, 0x34, 0x59, 0xf9, 0x79,
0x01, 0xa6, 0xa2, 0x19, 0x30, 0xa5, 0x48, 0x95, 0xce, 0x54, 0xa4, 0xde, 0x08, 0x1c, 0x06, 0xa7,
0x82, 0x0f, 0xbc, 0xe0, 0xc4, 0x0e, 0xc4, 0x22, 0x4c, 0x8a, 0x68, 0xe0, 0x12, 0x45, 0x99, 0xee,
0xed, 0xfe, 0x76, 0x98, 0x8c, 0xa3, 0xfc, 0xe8, 0x21, 0x8c, 0x5b, 0xbc, 0xee, 0x76, 0x01, 0x9c,
0xda, 0xf5, 0xa2, 0x00, 0x18, 0xc7, 0x41, 0x22, 0x0e, 0xf3, 0xb2, 0xba, 0xd5, 0x2f, 0x47, 0x5d,
0x80, 0x42, 0xb8, 0x6e, 0x5d, 0x8c, 0x32, 0xe0, 0xb8, 0x0c, 0x5a, 0x87, 0x99, 0x9e, 0x1e, 0x87,
0x72, 0x5c, 0xf9, 0xb2, 0x80, 0x9a, 0xd9, 0x8e, 0xb3, 0xe0, 0x24, 0x39, 0xb4, 0x1b, 0x2a, 0x65,
0x87, 0x79, 0x78, 0xbe, 0x9d, 0xf9, 0xe0, 0x65, 0xae, 0x65, 0x13, 0xca, 0xed, 0x52, 0xd6, 0x72,
0x5b, 0xfe, 0x27, 0x29, 0x98, 0x84, 0xbc, 0x12, 0x78, 0xd0, 0x2b, 0x53, 0x4c, 0x22, 0x50, 0x1d,
0x19, 0xc9, 0xd5, 0xef, 0xbd, 0x53, 0x55, 0xbf, 0x7e, 0xf2, 0x1c, 0x5c, 0xfe, 0x7e, 0x2e, 0xc1,
0xdc, 0x4a, 0xf3, 0xb1, 0x65, 0xf4, 0x4c, 0xd7, 0x9c, 0x4d, 0xd3, 0x59, 0x9a, 0x9f, 0x43, 0xc1,
0xea, 0x69, 0xee, 0x3c, 0x5e, 0x73, 0xe7, 0x81, 0x7b, 0x1a, 0x9b, 0xc7, 0x4c, 0x44, 0xca, 0x99,
0x04, 0x13, 0x40, 0x1b, 0x30, 0x6c, 0x29, 0x7a, 0x87, 0xb8, 0x69, 0xf5, 0xda, 0x00, 0xeb, 0x57,
0x97, 0x31, 0x63, 0x0f, 0x14, 0x36, 0x5c, 0x1a, 0x0b, 0x14, 0xf9, 0x9f, 0x25, 0x98, 0x7c, 0xb2,
0xb5, 0xd5, 0x58, 0xd5, 0xf9, 0x89, 0xe6, 0x6f, 0xab, 0x57, 0xa1, 0x60, 0x2a, 0xf6, 0x5e, 0x34,
0xd3, 0x33, 0x1a, 0xe6, 0x14, 0x74, 0x07, 0x4a, 0xec, 0x5f, 0x66, 0x17, 0x3f, 0x52, 0x23, 0x3c,
0x10, 0x96, 0x1a, 0x62, 0xec, 0x45, 0xe0, 0x6f, 0xec, 0x71, 0xa2, 0xf7, 0xa0, 0xc8, 0xe2, 0x0f,
0xd1, 0xdb, 0x19, 0x0b, 0x74, 0x61, 0x54, 0xdd, 0x11, 0xf2, 0x6b, 0x2e, 0x31, 0x80, 0x5d, 0x38,
0x79, 0x1f, 0x66, 0x03, 0x93, 0x60, 0xab, 0xf8, 0x94, 0xe5, 0x54, 0xd4, 0x84, 0x21, 0xa6, 0x9d,
0x65, 0xce, 0x7c, 0x86, 0x27, 0xd0, 0xc8, 0x42, 0xf8, 0xf5, 0x11, 0xfb, 0x45, 0xb1, 0x83, 0x25,
0xaf, 0xc3, 0x38, 0x7f, 0x86, 0x36, 0x2c, 0x9b, 0x2f, 0x26, 0xba, 0x02, 0xf9, 0xae, 0xaa, 0x8b,
0xec, 0x3c, 0x2a, 0x64, 0xf2, 0x2c, 0xb3, 0xb0, 0x71, 0x4e, 0x56, 0x0e, 0x45, 0xbc, 0xf2, 0xc9,
0xca, 0x21, 0x66, 0xe3, 0xf2, 0x63, 0x28, 0x8a, 0x4d, 0x0a, 0x02, 0xe5, 0x4f, 0x06, 0xca, 0x27,
0x00, 0x6d, 0x42, 0x71, 0xb5, 0x51, 0xd7, 0x0c, 0xa7, 0x56, 0x6b, 0xa9, 0x6d, 0x2b, 0xba, 0x83,
0x4b, 0xab, 0xcb, 0x18, 0x73, 0x0a, 0x92, 0x61, 0x98, 0x1c, 0xb6, 0x88, 0x69, 0x73, 0x3f, 0x1a,
0xa9, 0x03, 0xf3, 0x8d, 0x47, 0x7c, 0x04, 0x0b, 0x8a, 0xfc, 0x27, 0x39, 0x28, 0x8a, 0xe5, 0x38,
0x87, 0xbb, 0xdb, 0x5a, 0xe8, 0xee, 0xf6, 0x46, 0x36, 0xd7, 0x48, 0xbd, 0xb8, 0x6d, 0x45, 0x2e,
0x6e, 0x37, 0x32, 0xe2, 0x9d, 0x7c, 0x6b, 0xfb, 0x34, 0x07, 0x13, 0x61, 0xa7, 0x44, 0x77, 0x61,
0x94, 0xa5, 0x29, 0xb5, 0x45, 0x36, 0xfc, 0xea, 0xd8, 0x7b, 0xba, 0x69, 0xfa, 0x24, 0x1c, 0xe4,
0x43, 0x1d, 0x4f, 0x8c, 0xf9, 0x91, 0x98, 0x74, 0xfa, 0x92, 0xf6, 0x6c, 0x55, 0xab, 0x3a, 0x1f,
0x64, 0xaa, 0xab, 0xba, 0xbd, 0x69, 0x35, 0x6d, 0x4b, 0xd5, 0x3b, 0x31, 0x45, 0xdc, 0x29, 0x83,
0xc8, 0xe8, 0x5d, 0x96, 0x32, 0xa9, 0xd1, 0xb3, 0x5a, 0x24, 0xa9, 0xf4, 0x75, 0xcb, 0x36, 0x76,
0x40, 0xdb, 0x6b, 0x46, 0x4b, 0xd1, 0x9c, 0xcd, 0xc1, 0x64, 0x97, 0x58, 0x44, 0x6f, 0x11, 0xb7,
0xdc, 0x74, 0x20, 0xb0, 0x07, 0x26, 0xff, 0x83, 0x04, 0xa3, 0x62, 0x2d, 0xce, 0xe1, 0x92, 0xf3,
0x3b, 0xe1, 0x4b, 0xce, 0xb5, 0x8c, 0x91, 0x23, 0xf9, 0x86, 0xf3, 0xd7, 0xbe, 0xe9, 0x2c, 0x56,
0xb0, 0xe3, 0xb2, 0x67, 0x50, 0x3b, 0x7a, 0x5c, 0xd8, 0x29, 0xc7, 0x9c, 0x82, 0x7a, 0x30, 0xa5,
0x46, 0x82, 0x8b, 0xd8, 0xb3, 0x5a, 0x36, 0x4b, 0x3c, 0xb1, 0x7a, 0x59, 0xc0, 0x4f, 0x45, 0x29,
0x38, 0xa6, 0x42, 0x26, 0x10, 0xe3, 0x42, 0xef, 0x40, 0x61, 0xcf, 0xb6, 0xcd, 0x84, 0xe7, 0xf3,
0x01, 0x21, 0xcd, 0x37, 0xa1, 0xc4, 0x67, 0xb7, 0xb5, 0xd5, 0xc0, 0x1c, 0x4a, 0xfe, 0xc7, 0x9c,
0xb7, 0x1e, 0xfc, 0xce, 0xf1, 0xb6, 0x37, 0xdb, 0x25, 0x4d, 0xa1, 0x94, 0x3b, 0xb6, 0x73, 0x3f,
0x9e, 0x0d, 0x18, 0xee, 0xd1, 0x70, 0x8c, 0x1b, 0x6d, 0xf9, 0xa1, 0x5e, 0x3a, 0x4b, 0xa8, 0x1f,
0x4d, 0x0a, 0xf3, 0xe8, 0x09, 0xe4, 0x6d, 0x2d, 0xeb, 0x3d, 0x57, 0x20, 0x6e, 0xad, 0x35, 0xfd,
0x58, 0xb9, 0xb5, 0xd6, 0xc4, 0x0c, 0x02, 0x6d, 0xc2, 0x10, 0x4b, 0xa7, 0x2c, 0x3a, 0xe4, 0xb3,
0x47, 0x1b, 0xb6, 0x82, 0xbe, 0x4b, 0xb1, 0x5f, 0x14, 0x3b, 0x38, 0xf2, 0xc7, 0x30, 0x1e, 0x0a,
0x21, 0xe8, 0x23, 0x18, 0xd3, 0x0c, 0xa5, 0x5d, 0x57, 0x34, 0x45, 0x6f, 0x11, 0xf7, 0x6b, 0xc7,
0xb5, 0xa4, 0xb3, 0xb7, 0x16, 0xe0, 0x13, 0x01, 0x68, 0x56, 0x28, 0x19, 0x0b, 0xd2, 0x70, 0x08,
0x51, 0x56, 0x00, 0xfc, 0x39, 0xa2, 0x0a, 0x0c, 0x31, 0x4f, 0x75, 0x52, 0xdd, 0x48, 0x7d, 0x84,
0x59, 0xc8, 0x1c, 0x98, 0x62, 0x67, 0x1c, 0xdd, 0x06, 0xa0, 0xa4, 0x65, 0x11, 0x9b, 0x6f, 0x67,
0x2e, 0xfc, 0xc5, 0xb4, 0xe9, 0x51, 0x70, 0x80, 0x4b, 0xfe, 0x17, 0x09, 0xc6, 0x37, 0x88, 0xfd,
0x89, 0x61, 0xed, 0x37, 0x0c, 0x4d, 0x6d, 0xf5, 0xcf, 0x21, 0x0f, 0xe0, 0x50, 0x1e, 0x78, 0x73,
0xc0, 0xce, 0x84, 0xac, 0x4b, 0xcb, 0x06, 0xf2, 0x97, 0x12, 0xcc, 0x87, 0x38, 0x1f, 0xf9, 0x87,
0x7f, 0x1b, 0x86, 0x4c, 0xc3, 0xb2, 0xdd, 0x1a, 0xe1, 0x54, 0x0a, 0x59, 0x84, 0x0d, 0x54, 0x09,
0x0c, 0x06, 0x3b, 0x68, 0x68, 0x0d, 0x72, 0xb6, 0x21, 0x5c, 0xf5, 0x74, 0x98, 0x84, 0x58, 0x75,
0x10, 0x98, 0xb9, 0x2d, 0x03, 0xe7, 0x6c, 0x83, 0x6d, 0x44, 0x39, 0xc4, 0x15, 0x0c, 0x5f, 0xaf,
0x68, 0x06, 0x18, 0x0a, 0xbb, 0x96, 0xd1, 0x3d, 0xf3, 0x1c, 0xbc, 0x8d, 0x58, 0xb1, 0x8c, 0x2e,
0xe6, 0x58, 0xf2, 0x57, 0x12, 0x4c, 0x87, 0x38, 0xcf, 0x21, 0x75, 0xbc, 0x13, 0x4e, 0x1d, 0x37,
0x4e, 0x33, 0x91, 0x94, 0x04, 0xf2, 0x55, 0x2e, 0x32, 0x0d, 0x36, 0x61, 0xb4, 0x0b, 0xa3, 0xa6,
0xd1, 0x6e, 0xbe, 0x84, 0xef, 0x9b, 0x93, 0x2c, 0xa5, 0x37, 0x7c, 0x2c, 0x1c, 0x04, 0x46, 0x87,
0x30, 0xad, 0x2b, 0x5d, 0x42, 0x4d, 0xa5, 0x45, 0x9a, 0x2f, 0xe1, 0xc5, 0xe7, 0x22, 0xff, 0x80,
0x12, 0x45, 0xc4, 0x71, 0x25, 0x68, 0x1d, 0x8a, 0xaa, 0xc9, 0x4b, 0x4c, 0x51, 0x4b, 0x0c, 0xcc,
0xc3, 0x4e, 0x41, 0xea, 0xc4, 0x73, 0xf1, 0x03, 0xbb, 0x18, 0xf2, 0xdf, 0x44, 0xbd, 0x81, 0x57,
0x2c, 0x8f, 0xa1, 0xc4, 0x3b, 0x4d, 0x5a, 0x86, 0xe6, 0x7e, 0xea, 0xe0, 0x97, 0x0b, 0x31, 0xf6,
0xe2, 0xa8, 0x72, 0x39, 0xe1, 0x15, 0xdb, 0x25, 0x63, 0x4f, 0x18, 0x6d, 0x40, 0xc1, 0xfc, 0x21,
0xc5, 0x15, 0x4f, 0x93, 0xbc, 0xa2, 0xe2, 0x38, 0xf2, 0x1f, 0xe6, 0x23, 0xe6, 0xf2, 0x64, 0xf9,
0xec, 0xa5, 0xed, 0xba, 0x57, 0xcc, 0xa5, 0xee, 0xfc, 0x0e, 0x14, 0x45, 0xaa, 0x15, 0xce, 0xfc,
0xf3, 0xd3, 0x38, 0x73, 0x30, 0x8b, 0x79, 0x77, 0x29, 0x77, 0xd0, 0x05, 0x46, 0x1f, 0xc2, 0x30,
0x71, 0x54, 0x38, 0xb9, 0xf1, 0xde, 0x69, 0x54, 0xf8, 0x71, 0xd5, 0xaf, 0xa1, 0xc5, 0x98, 0x40,
0x45, 0xbf, 0x64, 0xeb, 0xc5, 0x78, 0x59, 0xc9, 0x49, 0xcb, 0x05, 0x9e, 0xae, 0xae, 0x38, 0xd3,
0xf6, 0x86, 0x5f, 0x1c, 0x55, 0xc0, 0xff, 0x89, 0x83, 0x12, 0xf2, 0xbf, 0x49, 0x30, 0xcd, 0x57,
0xa8, 0xd5, 0xb3, 0x54, 0xbb, 0x7f, 0x6e, 0x89, 0xe9, 0x69, 0x28, 0x31, 0xdd, 0x19, 0xb0, 0x2c,
0x31, 0x0b, 0x53, 0x93, 0xd3, 0xd7, 0x12, 0x5c, 0x8c, 0x71, 0x9f, 0x43, 0x5c, 0xdc, 0x0e, 0xc7,
0xc5, 0x37, 0x4f, 0x3b, 0xa1, 0x94, 0xd8, 0xf8, 0x3f, 0xd3, 0x09, 0xd3, 0xe1, 0x27, 0xe5, 0x36,
0x80, 0x69, 0xa9, 0x07, 0xaa, 0x46, 0x3a, 0xe2, 0xab, 0x7e, 0x29, 0xd0, 0xb3, 0xe5, 0x51, 0x70,
0x80, 0x0b, 0x51, 0x98, 0x6b, 0x93, 0x5d, 0xa5, 0xa7, 0xd9, 0x8b, 0xed, 0xf6, 0x92, 0x62, 0x2a,
0x3b, 0xaa, 0xa6, 0xda, 0xaa, 0x78, 0xff, 0x18, 0xa9, 0x3f, 0x74, 0xbe, 0xb6, 0x27, 0x71, 0xbc,
0x38, 0xaa, 0x5c, 0x49, 0xfa, 0xdc, 0xe5, 0xb2, 0xf4, 0x71, 0x0a, 0x34, 0xea, 0x43, 0xd9, 0x22,
0x1f, 0xf7, 0x54, 0x8b, 0xb4, 0x97, 0x2d, 0xc3, 0x0c, 0xa9, 0xcd, 0x73, 0xb5, 0xbf, 0x7d, 0x7c,
0x54, 0x29, 0xe3, 0x14, 0x9e, 0xc1, 0x8a, 0x53, 0xe1, 0xd1, 0x33, 0x98, 0x51, 0x44, 0x77, 0x5d,
0x50, 0xab, 0x73, 0x4a, 0xee, 0x1f, 0x1f, 0x55, 0x66, 0x16, 0xe3, 0xe4, 0xc1, 0x0a, 0x93, 0x40,
0x51, 0x0d, 0x8a, 0x07, 0xbc, 0x11, 0x8f, 0x96, 0x87, 0x38, 0x3e, 0x4b, 0x04, 0x45, 0xa7, 0x37,
0x8f, 0x61, 0x0e, 0xaf, 0x34, 0xf9, 0xe9, 0x73, 0xb9, 0xd8, 0x5d, 0x97, 0xd5, 0x92, 0xe2, 0xc4,
0xf3, 0x27, 0xf0, 0x92, 0x1f, 0xb5, 0x9e, 0xf8, 0x24, 0x1c, 0xe4, 0x43, 0x1f, 0xc0, 0xc8, 0x9e,
0x78, 0x30, 0xa1, 0xe5, 0x62, 0xa6, 0x24, 0x1c, 0x7a, 0x60, 0xa9, 0x4f, 0x0b, 0x15, 0x23, 0xee,
0x30, 0xc5, 0x3e, 0x22, 0x7a, 0x1d, 0x8a, 0xfc, 0xc7, 0xea, 0x32, 0x7f, 0x5f, 0x2c, 0xf9, 0xb1,
0xed, 0x89, 0x33, 0x8c, 0x5d, 0xba, 0xcb, 0xba, 0xda, 0x58, 0xe2, 0xef, 0xdc, 0x11, 0xd6, 0xd5,
0xc6, 0x12, 0x76, 0xe9, 0xe8, 0x23, 0x28, 0x52, 0xb2, 0xa6, 0xea, 0xbd, 0xc3, 0x32, 0x64, 0xfa,
0x4a, 0xde, 0x7c, 0xc4, 0xb9, 0x23, 0x2f, 0x7d, 0xbe, 0x06, 0x41, 0xc7, 0x2e, 0x2c, 0xda, 0x83,
0x11, 0xab, 0xa7, 0x2f, 0xd2, 0x6d, 0x4a, 0xac, 0xf2, 0x28, 0xd7, 0x31, 0x28, 0x9c, 0x63, 0x97,
0x3f, 0xaa, 0xc5, 0x5b, 0x21, 0x8f, 0x03, 0xfb, 0xe0, 0x68, 0x0f, 0x80, 0xff, 0xe0, 0x8f, 0x8a,
0xe5, 0x39, 0xae, 0xea, 0x7e, 0x16, 0x55, 0x49, 0x6f, 0x97, 0xe2, 0xc3, 0x82, 0x47, 0xc6, 0x01,
0x6c, 0xf4, 0xc7, 0x12, 0x20, 0xda, 0x33, 0x4d, 0x8d, 0x74, 0x89, 0x6e, 0x2b, 0x1a, 0x1f, 0xa5,
0xe5, 0x31, 0xae, 0xf2, 0xed, 0x41, 0x2b, 0x18, 0x13, 0x8c, 0xaa, 0xf6, 0xbe, 0x17, 0xc4, 0x59,
0x71, 0x82, 0x5e, 0xb6, 0x89, 0xbb, 0x62, 0xd6, 0xe3, 0x99, 0x36, 0x31, 0xf9, 0xb9, 0xd6, 0xdf,
0x44, 0x41, 0xc7, 0x2e, 0x2c, 0x7a, 0x0a, 0x73, 0x6e, 0xc7, 0x28, 0x36, 0x0c, 0x7b, 0x45, 0xd5,
0x08, 0xed, 0x53, 0x9b, 0x74, 0xcb, 0x13, 0xdc, 0xc1, 0xbc, 0xb6, 0x19, 0x9c, 0xc8, 0x85, 0x53,
0xa4, 0x51, 0x17, 0x2a, 0x6e, 0x70, 0x62, 0x27, 0xd7, 0x8b, 0x8e, 0x8f, 0x68, 0x4b, 0xd1, 0x9c,
0x4f, 0x28, 0x93, 0x5c, 0xc1, 0x6b, 0xc7, 0x47, 0x95, 0xca, 0xf2, 0xc9, 0xac, 0x78, 0x10, 0x16,
0x7a, 0x0f, 0xca, 0x4a, 0x9a, 0x9e, 0x29, 0xae, 0xe7, 0xa7, 0x2c, 0xe2, 0xa5, 0x2a, 0x48, 0x95,
0x46, 0x36, 0x4c, 0x29, 0xe1, 0xde, 0x5d, 0x5a, 0x9e, 0xce, 0xf4, 0x1a, 0x1b, 0x69, 0xf9, 0xf5,
0x1f, 0x4e, 0x22, 0x04, 0x8a, 0x63, 0x1a, 0xd0, 0xef, 0x03, 0x52, 0xa2, 0xed, 0xc6, 0xb4, 0x8c,
0x32, 0x25, 0xba, 0x58, 0x9f, 0xb2, 0xef, 0x76, 0x31, 0x12, 0xc5, 0x09, 0x7a, 0x58, 0x81, 0xae,
0x44, 0x5a, 0xa4, 0x69, 0x79, 0x9e, 0x2b, 0xaf, 0x65, 0x53, 0xee, 0xc9, 0x05, 0xbe, 0x14, 0x45,
0x11, 0x71, 0x5c, 0x09, 0x5a, 0x83, 0x59, 0x31, 0xb8, 0xad, 0x53, 0x65, 0x97, 0x34, 0xfb, 0xb4,
0x65, 0x6b, 0xb4, 0x3c, 0xc3, 0xe3, 0x3b, 0xff, 0x5a, 0xb9, 0x98, 0x40, 0xc7, 0x89, 0x52, 0xe8,
0x6d, 0x98, 0xda, 0x35, 0xac, 0x1d, 0xb5, 0xdd, 0x26, 0xba, 0x8b, 0x34, 0xcb, 0x91, 0xf8, 0x3b,
0xd0, 0x4a, 0x84, 0x86, 0x63, 0xdc, 0x88, 0xc2, 0x45, 0x81, 0xdc, 0xb0, 0x8c, 0xd6, 0xba, 0xd1,
0xd3, 0x6d, 0xa7, 0xec, 0xbb, 0xe8, 0xa5, 0xd1, 0x8b, 0x8b, 0x49, 0x0c, 0x2f, 0x8e, 0x2a, 0x57,
0x93, 0xab, 0x7c, 0x9f, 0x09, 0x27, 0x63, 0x23, 0x13, 0xc6, 0x44, 0xe3, 0x3b, 0x7f, 0x90, 0x2a,
0x97, 0xf9, 0xd1, 0x7f, 0x30, 0x38, 0xe0, 0x79, 0x22, 0xd1, 0xf3, 0x3f, 0x75, 0x7c, 0x54, 0x19,
0x0b, 0x32, 0xe0, 0x90, 0x06, 0xde, 0xe8, 0x24, 0x3e, 0xaf, 0x9d, 0x4f, 0xb3, 0xf8, 0xe9, 0x1a,
0x9d, 0x7c, 0xd3, 0x5e, 0x5a, 0xa3, 0x53, 0x00, 0xf2, 0xe4, 0x27, 0xf3, 0xff, 0xce, 0xc1, 0x8c,
0xcf, 0x9c, 0xb9, 0xd1, 0x29, 0x41, 0xe4, 0xd7, 0x0d, 0xe3, 0xd9, 0x9a, 0x8f, 0xfc, 0xa5, 0xfb,
0xff, 0xd7, 0x7c, 0xe4, 0xdb, 0x96, 0x72, 0x7b, 0xf8, 0xbb, 0x5c, 0x70, 0x02, 0xa7, 0xec, 0x80,
0x79, 0x09, 0x3d, 0xd3, 0x3f, 0xba, 0x26, 0x1a, 0xf9, 0xeb, 0x3c, 0x4c, 0x45, 0x4f, 0x63, 0xa8,
0x51, 0x42, 0x1a, 0xd8, 0x28, 0xd1, 0x80, 0xd9, 0xdd, 0x9e, 0xa6, 0xf5, 0xf9, 0x1c, 0x02, 0xdd,
0x12, 0xce, 0x27, 0xcb, 0x9f, 0x0a, 0xc9, 0xd9, 0x95, 0x04, 0x1e, 0x9c, 0x28, 0x19, 0xef, 0x9b,
0x28, 0xfc, 0xd0, 0xbe, 0x89, 0xa1, 0x33, 0xf4, 0x4d, 0x24, 0xb7, 0x9e, 0xe4, 0xcf, 0xd4, 0x7a,
0x72, 0x96, 0xa6, 0x89, 0x84, 0x20, 0x36, 0xb0, 0x01, 0xf8, 0x17, 0x30, 0x11, 0x6e, 0xe4, 0x71,
0xf6, 0xd2, 0xe9, 0x25, 0x12, 0x9f, 0x86, 0x03, 0x7b, 0xe9, 0x8c, 0x63, 0x8f, 0x43, 0xfe, 0x23,
0x09, 0xe6, 0x92, 0x1b, 0x76, 0x91, 0x06, 0x13, 0x5d, 0xe5, 0x30, 0xd8, 0x44, 0x2d, 0x9d, 0xf1,
0x65, 0x8c, 0x77, 0x70, 0xac, 0x87, 0xb0, 0x70, 0x04, 0x5b, 0xfe, 0x5e, 0x82, 0xf9, 0x94, 0xde,
0x89, 0xf3, 0xb5, 0x04, 0xbd, 0x0f, 0xa5, 0xae, 0x72, 0xd8, 0xec, 0x59, 0x1d, 0x72, 0xe6, 0xb7,
0x40, 0x7e, 0xa0, 0xd7, 0x05, 0x0a, 0xf6, 0xf0, 0xe4, 0xbf, 0x92, 0xe0, 0x27, 0xa9, 0x57, 0x25,
0x74, 0x2f, 0xd4, 0xe6, 0x21, 0x47, 0xda, 0x3c, 0x50, 0x5c, 0xf0, 0x15, 0x75, 0x79, 0x7c, 0x2e,
0x41, 0x39, 0xed, 0xee, 0x88, 0xee, 0x86, 0x8c, 0xfc, 0x59, 0xc4, 0xc8, 0xe9, 0x98, 0xdc, 0x2b,
0xb2, 0xf1, 0xdf, 0x25, 0xb8, 0x7c, 0x42, 0x0d, 0xe6, 0x5d, 0x51, 0x48, 0x3b, 0xc8, 0xc5, 0x9f,
0xad, 0xc5, 0x37, 0x2f, 0xff, 0x8a, 0x92, 0xc0, 0x83, 0x53, 0xa5, 0xd1, 0x36, 0xcc, 0x8b, 0xfb,
0x51, 0x94, 0x26, 0xca, 0x0b, 0xde, 0x0d, 0xb7, 0x9c, 0xcc, 0x82, 0xd3, 0x64, 0xe5, 0xbf, 0x95,
0x60, 0x2e, 0xf9, 0x51, 0x00, 0xbd, 0x15, 0x5a, 0xf2, 0x4a, 0x64, 0xc9, 0x27, 0x23, 0x52, 0x62,
0xc1, 0x3f, 0x84, 0x09, 0xf1, 0x74, 0x20, 0x60, 0x84, 0x33, 0xcb, 0x49, 0x19, 0x44, 0x40, 0xb8,
0x05, 0x2c, 0x3f, 0x26, 0xe1, 0x31, 0x1c, 0x41, 0x93, 0x3f, 0xcd, 0xc1, 0x50, 0xb3, 0xa5, 0x68,
0xe4, 0x1c, 0xea, 0xd7, 0x5f, 0x85, 0xea, 0xd7, 0x41, 0xff, 0xcf, 0x8c, 0x5b, 0x95, 0x5a, 0xba,
0xe2, 0x48, 0xe9, 0xfa, 0x46, 0x26, 0xb4, 0x93, 0xab, 0xd6, 0xdf, 0x82, 0x11, 0x4f, 0xe9, 0xe9,
0x92, 0xa9, 0xfc, 0x97, 0x39, 0x18, 0x0d, 0xa8, 0x38, 0x65, 0x2a, 0xde, 0x0d, 0xd5, 0x1f, 0xf9,
0x0c, 0x0f, 0x35, 0x01, 0x5d, 0x55, 0xb7, 0xe2, 0x70, 0xfa, 0xa4, 0xfd, 0xce, 0xd8, 0x78, 0x21,
0xf2, 0x0b, 0x98, 0xb0, 0x15, 0xab, 0x43, 0x6c, 0xef, 0xc3, 0x85, 0xd3, 0xc7, 0xe5, 0x35, 0xec,
0x6f, 0x85, 0xa8, 0x38, 0xc2, 0x7d, 0xe9, 0x21, 0x8c, 0x87, 0x94, 0x9d, 0xaa, 0xcd, 0xf9, 0xef,
0x25, 0xf8, 0xd9, 0xc0, 0xc7, 0x1e, 0x54, 0x0f, 0x1d, 0x92, 0x6a, 0xe4, 0x90, 0x2c, 0xa4, 0x03,
0xbc, 0xba, 0x76, 0xb9, 0xfa, 0xcd, 0xe7, 0xdf, 0x2d, 0x5c, 0xf8, 0xe6, 0xbb, 0x85, 0x0b, 0xdf,
0x7e, 0xb7, 0x70, 0xe1, 0x0f, 0x8e, 0x17, 0xa4, 0xe7, 0xc7, 0x0b, 0xd2, 0x37, 0xc7, 0x0b, 0xd2,
0xb7, 0xc7, 0x0b, 0xd2, 0x7f, 0x1e, 0x2f, 0x48, 0x7f, 0xfa, 0xfd, 0xc2, 0x85, 0xf7, 0x8b, 0x02,
0xee, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x98, 0xf4, 0xad, 0x8a, 0xba, 0x3e, 0x00, 0x00,
}
func (m *AllowedCSIDriver) Marshal() (dAtA []byte, err error) {
@ -3045,6 +3047,18 @@ func (m *IngressBackend) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if m.Resource != nil {
{
size, err := m.Resource.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintGenerated(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x1a
}
{
size, err := m.ServicePort.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
@ -5182,6 +5196,10 @@ func (m *IngressBackend) Size() (n int) {
n += 1 + l + sovGenerated(uint64(l))
l = m.ServicePort.Size()
n += 1 + l + sovGenerated(uint64(l))
if m.Resource != nil {
l = m.Resource.Size()
n += 1 + l + sovGenerated(uint64(l))
}
return n
}
@ -6156,6 +6174,7 @@ func (this *IngressBackend) String() string {
s := strings.Join([]string{`&IngressBackend{`,
`ServiceName:` + fmt.Sprintf("%v", this.ServiceName) + `,`,
`ServicePort:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ServicePort), "IntOrString", "intstr.IntOrString", 1), `&`, ``, 1) + `,`,
`Resource:` + strings.Replace(fmt.Sprintf("%v", this.Resource), "TypedLocalObjectReference", "v11.TypedLocalObjectReference", 1) + `,`,
`}`,
}, "")
return s
@ -10316,6 +10335,42 @@ func (m *IngressBackend) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Resource", 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.Resource == nil {
m.Resource = &v11.TypedLocalObjectReference{}
}
if err := m.Resource.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:])

View File

@ -512,10 +512,18 @@ message Ingress {
// IngressBackend describes all endpoints for a given service and port.
message IngressBackend {
// Specifies the name of the referenced service.
// +optional
optional string serviceName = 1;
// Specifies the port of the referenced service.
// +optional
optional k8s.io.apimachinery.pkg.util.intstr.IntOrString servicePort = 2;
// Resource is an ObjectRef to another Kubernetes resource in the namespace
// of the Ingress object. If resource is specified, serviceName and servicePort
// must not be specified.
// +optional
optional k8s.io.api.core.v1.TypedLocalObjectReference resource = 3;
}
// IngressList is a collection of Ingress.

View File

@ -758,10 +758,18 @@ type HTTPIngressPath struct {
// IngressBackend describes all endpoints for a given service and port.
type IngressBackend struct {
// Specifies the name of the referenced service.
ServiceName string `json:"serviceName" protobuf:"bytes,1,opt,name=serviceName"`
// +optional
ServiceName string `json:"serviceName,omitempty" protobuf:"bytes,1,opt,name=serviceName"`
// Specifies the port of the referenced service.
ServicePort intstr.IntOrString `json:"servicePort" protobuf:"bytes,2,opt,name=servicePort"`
// +optional
ServicePort intstr.IntOrString `json:"servicePort,omitempty" protobuf:"bytes,2,opt,name=servicePort"`
// Resource is an ObjectRef to another Kubernetes resource in the namespace
// of the Ingress object. If resource is specified, serviceName and servicePort
// must not be specified.
// +optional
Resource *v1.TypedLocalObjectReference `json:"resource,omitempty" protobuf:"bytes,3,opt,name=resource"`
}
// +genclient

View File

@ -294,6 +294,7 @@ var map_IngressBackend = map[string]string{
"": "IngressBackend describes all endpoints for a given service and port.",
"serviceName": "Specifies the name of the referenced service.",
"servicePort": "Specifies the port of the referenced service.",
"resource": "Resource is an ObjectRef to another Kubernetes resource in the namespace of the Ingress object. If resource is specified, serviceName and servicePort must not be specified.",
}
func (IngressBackend) SwaggerDoc() map[string]string {

View File

@ -463,7 +463,7 @@ func (in *HTTPIngressPath) DeepCopyInto(out *HTTPIngressPath) {
*out = new(PathType)
**out = **in
}
out.Backend = in.Backend
in.Backend.DeepCopyInto(&out.Backend)
return
}
@ -585,6 +585,11 @@ func (in *Ingress) DeepCopyObject() runtime.Object {
func (in *IngressBackend) DeepCopyInto(out *IngressBackend) {
*out = *in
out.ServicePort = in.ServicePort
if in.Resource != nil {
in, out := &in.Resource, &out.Resource
*out = new(corev1.TypedLocalObjectReference)
(*in).DeepCopyInto(*out)
}
return
}
@ -680,7 +685,7 @@ func (in *IngressSpec) DeepCopyInto(out *IngressSpec) {
if in.Backend != nil {
in, out := &in.Backend, &out.Backend
*out = new(IngressBackend)
**out = **in
(*in).DeepCopyInto(*out)
}
if in.TLS != nil {
in, out := &in.TLS, &out.TLS

View File

@ -429,68 +429,69 @@ func init() {
}
var fileDescriptor_5bea11de0ceb8f53 = []byte{
// 965 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0x4f, 0x6f, 0xe3, 0x44,
0x14, 0x8f, 0x93, 0x66, 0x9b, 0x4e, 0xba, 0xdd, 0x6a, 0xe8, 0x21, 0xaa, 0x84, 0x5b, 0xf9, 0x80,
0xca, 0x9f, 0xda, 0x34, 0xbb, 0x20, 0x8e, 0xc8, 0x2b, 0xa1, 0x56, 0x04, 0x1a, 0x26, 0x16, 0x42,
0x08, 0xa4, 0x9d, 0x38, 0x6f, 0x1d, 0x13, 0xc7, 0x36, 0x33, 0xe3, 0xa0, 0xbd, 0xf1, 0x0d, 0xe0,
0x4b, 0xc0, 0x99, 0x23, 0x47, 0x04, 0x97, 0x1e, 0xf7, 0xb8, 0xa7, 0x8a, 0x86, 0x6f, 0xc1, 0x09,
0xcd, 0x78, 0x6a, 0x3b, 0x49, 0xcb, 0x66, 0xf7, 0xd0, 0x53, 0x32, 0xf3, 0x7e, 0xef, 0xf7, 0xde,
0xfb, 0xbd, 0xe7, 0x37, 0xe8, 0x93, 0xc9, 0x47, 0xdc, 0x0e, 0x13, 0x67, 0x92, 0x0d, 0x81, 0xc5,
0x20, 0x80, 0x3b, 0x33, 0x88, 0x47, 0x09, 0x73, 0xb4, 0x81, 0xa6, 0xa1, 0x13, 0x83, 0xf8, 0x21,
// 990 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4f, 0x6f, 0xe3, 0x44,
0x14, 0xaf, 0x93, 0x66, 0x9b, 0x4e, 0xb2, 0xdd, 0x6a, 0xe8, 0x21, 0xaa, 0x84, 0x5b, 0xf9, 0x80,
0xca, 0x9f, 0xda, 0x34, 0xbb, 0x20, 0x8e, 0xc8, 0x2b, 0xa1, 0x56, 0x04, 0x1a, 0x26, 0x16, 0x20,
0x04, 0xd2, 0x4e, 0x9c, 0xb7, 0x8e, 0x89, 0x63, 0x9b, 0x99, 0x71, 0xd0, 0xde, 0xb8, 0x72, 0x82,
0x2f, 0x01, 0x9f, 0x81, 0x23, 0x82, 0x4b, 0x8f, 0x7b, 0xdc, 0x53, 0x45, 0xc3, 0xb7, 0xe0, 0x84,
0x66, 0x3c, 0xb5, 0x9d, 0xa4, 0xa5, 0x59, 0x0e, 0x7b, 0x8a, 0x67, 0xde, 0x7b, 0xbf, 0x37, 0xef,
0xf7, 0x7e, 0x33, 0x2f, 0xe8, 0xa3, 0xc9, 0x07, 0xdc, 0x0e, 0x13, 0x67, 0x92, 0x0d, 0x81, 0xc5,
0x20, 0x80, 0x3b, 0x33, 0x88, 0x47, 0x09, 0x73, 0xb4, 0x81, 0xa6, 0xa1, 0x13, 0x83, 0xf8, 0x3e,
0x61, 0x93, 0x30, 0x0e, 0x9c, 0xd9, 0xc9, 0x10, 0x04, 0x3d, 0x71, 0x02, 0x88, 0x81, 0x51, 0x01,
0x23, 0x3b, 0x65, 0x89, 0x48, 0xf0, 0x9b, 0x39, 0xdc, 0xa6, 0x69, 0x68, 0x97, 0x70, 0x5b, 0xc3,
0xf7, 0x8f, 0x83, 0x50, 0x8c, 0xb3, 0xa1, 0xed, 0x27, 0x53, 0x27, 0x48, 0x82, 0xc4, 0x51, 0x5e,
0xc3, 0xec, 0xa9, 0x3a, 0xa9, 0x83, 0xfa, 0x97, 0xb3, 0xed, 0x5b, 0x95, 0xe0, 0x7e, 0xc2, 0xc0,
0x99, 0xad, 0x44, 0xdc, 0x7f, 0x54, 0x62, 0xa6, 0xd4, 0x1f, 0x87, 0x31, 0xb0, 0x67, 0x4e, 0x3a,
0x09, 0xe4, 0x05, 0x77, 0xa6, 0x20, 0xe8, 0x4d, 0x5e, 0xce, 0x6d, 0x5e, 0x2c, 0x8b, 0x45, 0x38,
0x85, 0x15, 0x87, 0x0f, 0x5f, 0xe6, 0xc0, 0xfd, 0x31, 0x4c, 0xe9, 0x8a, 0xdf, 0xc3, 0xdb, 0xfc,
0x32, 0x11, 0x46, 0x4e, 0x18, 0x0b, 0x2e, 0xd8, 0xb2, 0x93, 0xf5, 0x97, 0x81, 0x1e, 0x9c, 0x7a,
0x5e, 0xff, 0x2c, 0x0e, 0x18, 0x70, 0xde, 0xa7, 0x62, 0x8c, 0x0f, 0xd1, 0x46, 0x4a, 0xc5, 0xb8,
0x63, 0x1c, 0x1a, 0x47, 0x5b, 0xee, 0xf6, 0xc5, 0xe5, 0x41, 0x6d, 0x7e, 0x79, 0xb0, 0x21, 0x6d,
0x44, 0x59, 0xf0, 0x23, 0xd4, 0x92, 0xbf, 0xde, 0xb3, 0x14, 0x3a, 0x0d, 0x85, 0xea, 0xcc, 0x2f,
0x0f, 0x5a, 0x7d, 0x7d, 0xf7, 0x6f, 0xe5, 0x3f, 0x29, 0x90, 0xf8, 0x2b, 0xb4, 0x39, 0xa4, 0xfe,
0x04, 0xe2, 0x51, 0xa7, 0x7e, 0x68, 0x1c, 0xb5, 0xbb, 0xc7, 0xf6, 0xff, 0xf6, 0xd0, 0xd6, 0x49,
0xb9, 0xb9, 0x93, 0xfb, 0x40, 0x67, 0xb2, 0xa9, 0x2f, 0xc8, 0x35, 0x9d, 0x35, 0x41, 0x7b, 0x95,
0x22, 0x48, 0x16, 0xc1, 0x97, 0x34, 0xca, 0x00, 0x0f, 0x50, 0x53, 0x46, 0xe7, 0x1d, 0xe3, 0xb0,
0x71, 0xd4, 0xee, 0xda, 0x2f, 0x89, 0xb7, 0x24, 0x84, 0x7b, 0x5f, 0x07, 0x6c, 0xca, 0x13, 0x27,
0x39, 0x97, 0xf5, 0x53, 0x1d, 0x6d, 0x6a, 0x14, 0x7e, 0x82, 0x5a, 0xb2, 0xef, 0x23, 0x2a, 0xa8,
0x92, 0xab, 0xdd, 0x7d, 0xbf, 0x12, 0xa3, 0x68, 0x83, 0x9d, 0x4e, 0x02, 0x79, 0xc1, 0x6d, 0x89,
0xb6, 0x67, 0x27, 0xf6, 0xf9, 0xf0, 0x3b, 0xf0, 0xc5, 0x67, 0x20, 0xa8, 0x8b, 0x75, 0x14, 0x54,
0xde, 0x91, 0x82, 0x15, 0xf7, 0xd0, 0x06, 0x4f, 0xc1, 0xd7, 0x8a, 0xbd, 0xb3, 0x9e, 0x62, 0x83,
0x14, 0xfc, 0xb2, 0x71, 0xf2, 0x44, 0x14, 0x0b, 0xf6, 0xd0, 0x3d, 0x2e, 0xa8, 0xc8, 0xb8, 0x6a,
0x5b, 0xbb, 0xfb, 0xde, 0x9a, 0x7c, 0xca, 0xc7, 0xdd, 0xd1, 0x8c, 0xf7, 0xf2, 0x33, 0xd1, 0x5c,
0xd6, 0x6f, 0x06, 0xda, 0x59, 0xec, 0x15, 0xfe, 0x00, 0xb5, 0x39, 0xb0, 0x59, 0xe8, 0xc3, 0xe7,
0x74, 0x0a, 0x7a, 0x94, 0xde, 0xd0, 0xfe, 0xed, 0x41, 0x69, 0x22, 0x55, 0x1c, 0x0e, 0x0a, 0xb7,
0x7e, 0xc2, 0x84, 0x2e, 0xfa, 0x76, 0x49, 0xe5, 0x64, 0xdb, 0xf9, 0x64, 0xdb, 0x67, 0xb1, 0x38,
0x67, 0x03, 0xc1, 0xc2, 0x38, 0x58, 0x09, 0x24, 0xc9, 0x48, 0x95, 0x59, 0xce, 0xfd, 0xb6, 0x4e,
0xf9, 0x71, 0x44, 0xef, 0xa4, 0x93, 0x5f, 0x2c, 0x74, 0xd2, 0x59, 0x4f, 0x79, 0x95, 0xdc, 0x6d,
0xed, 0xb4, 0xfe, 0x34, 0xd0, 0x6e, 0x15, 0xd8, 0x0b, 0xb9, 0xc0, 0xdf, 0xac, 0x54, 0x62, 0xaf,
0x57, 0x89, 0xf4, 0x56, 0x75, 0xec, 0xea, 0x50, 0xad, 0xeb, 0x9b, 0x4a, 0x15, 0x7d, 0xd4, 0x0c,
0x05, 0x4c, 0x79, 0xa7, 0xae, 0x3e, 0xa9, 0x77, 0x5f, 0xa1, 0x8c, 0xf2, 0x7b, 0x3a, 0x93, 0x0c,
0x24, 0x27, 0xb2, 0x7e, 0x59, 0x2a, 0x42, 0xd6, 0x87, 0xbb, 0x08, 0xf9, 0x49, 0x2c, 0x58, 0x12,
0x45, 0xc0, 0xf4, 0xf8, 0x14, 0xf2, 0x3e, 0x2e, 0x2c, 0xa4, 0x82, 0xc2, 0xdf, 0x22, 0x94, 0x52,
0x46, 0xa7, 0x20, 0x80, 0xf1, 0x9b, 0x56, 0x8c, 0x5c, 0xec, 0xb2, 0x50, 0xb9, 0x8d, 0x46, 0xbd,
0xc4, 0xa7, 0x51, 0xde, 0x28, 0x02, 0x4f, 0x81, 0x41, 0xec, 0x83, 0xbb, 0x23, 0xe9, 0xfb, 0x05,
0x09, 0xa9, 0x10, 0x5a, 0xbf, 0x1b, 0xa8, 0xad, 0xf3, 0xbc, 0x03, 0x9d, 0x3f, 0x5d, 0xd4, 0xf9,
0xad, 0x35, 0x57, 0xe5, 0xcd, 0x12, 0xff, 0x5a, 0xa6, 0x2e, 0x97, 0xa3, 0xdc, 0xf0, 0xe3, 0x84,
0x8b, 0xe5, 0x0d, 0x7f, 0x9a, 0x70, 0x41, 0x94, 0x05, 0x67, 0x68, 0x37, 0x5c, 0xda, 0xa6, 0xaf,
0x36, 0xb8, 0x85, 0x9b, 0xdb, 0xd1, 0xf4, 0xbb, 0xcb, 0x16, 0xb2, 0x12, 0xc2, 0x02, 0xb4, 0x82,
0x92, 0xdf, 0xcd, 0x58, 0x88, 0x54, 0x6b, 0xfc, 0x70, 0xfd, 0x1d, 0x5e, 0xa6, 0xd0, 0x52, 0xd5,
0x79, 0x5e, 0x9f, 0x28, 0x2a, 0xeb, 0x8f, 0x7a, 0xa1, 0x87, 0x9a, 0xb6, 0x8f, 0x8b, 0x6a, 0xd5,
0x04, 0xaa, 0x95, 0xb5, 0xa1, 0xb4, 0xd9, 0xab, 0x24, 0x5e, 0xd8, 0xc8, 0x0a, 0x1a, 0x7b, 0xe5,
0xdb, 0x66, 0xbc, 0xce, 0xdb, 0xd6, 0xbe, 0xe9, 0x5d, 0xc3, 0xa7, 0xa8, 0x21, 0xa2, 0xeb, 0x11,
0x78, 0x7b, 0x3d, 0x46, 0xaf, 0x37, 0x70, 0xdb, 0x5a, 0xf2, 0x86, 0xd7, 0x1b, 0x10, 0x49, 0x81,
0xcf, 0x51, 0x93, 0x65, 0x11, 0xc8, 0xbd, 0xdf, 0x58, 0xff, 0x1d, 0x91, 0x0a, 0x96, 0x23, 0x25,
0x4f, 0x9c, 0xe4, 0x3c, 0xd6, 0xf7, 0xe8, 0xfe, 0xc2, 0xe3, 0x80, 0x9f, 0xa0, 0xed, 0x28, 0xa1,
0x23, 0x97, 0x46, 0x34, 0xf6, 0xf5, 0x37, 0xbb, 0x34, 0xb7, 0xd7, 0xdf, 0x5f, 0xaf, 0x82, 0xd3,
0x4f, 0xcb, 0x9e, 0x0e, 0xb2, 0x5d, 0xb5, 0x91, 0x05, 0x46, 0x8b, 0x22, 0x54, 0xd6, 0x88, 0x0f,
0x50, 0x53, 0x4e, 0x6a, 0xfe, 0xb6, 0x6f, 0xb9, 0x5b, 0x32, 0x43, 0x39, 0xc0, 0x9c, 0xe4, 0xf7,
0x72, 0x85, 0x70, 0xf0, 0x19, 0x08, 0xd5, 0xce, 0xfa, 0xe2, 0x0a, 0x19, 0x14, 0x16, 0x52, 0x41,
0xb9, 0xc7, 0x17, 0x57, 0x66, 0xed, 0xf9, 0x95, 0x59, 0x7b, 0x71, 0x65, 0xd6, 0x7e, 0x9c, 0x9b,
0xc6, 0xc5, 0xdc, 0x34, 0x9e, 0xcf, 0x4d, 0xe3, 0xc5, 0xdc, 0x34, 0xfe, 0x9e, 0x9b, 0xc6, 0xcf,
0xff, 0x98, 0xb5, 0xaf, 0x37, 0xb5, 0x4c, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x12, 0x75,
0x26, 0xcc, 0x0a, 0x00, 0x00,
0x23, 0x3b, 0x65, 0x89, 0x48, 0xf0, 0xeb, 0xb9, 0xbb, 0x4d, 0xd3, 0xd0, 0x2e, 0xdd, 0x6d, 0xed,
0xbe, 0x7f, 0x1c, 0x84, 0x62, 0x9c, 0x0d, 0x6d, 0x3f, 0x99, 0x3a, 0x41, 0x12, 0x24, 0x8e, 0x8a,
0x1a, 0x66, 0x4f, 0xd5, 0x4a, 0x2d, 0xd4, 0x57, 0x8e, 0xb6, 0x6f, 0x55, 0x92, 0xfb, 0x09, 0x03,
0x67, 0xb6, 0x92, 0x71, 0xff, 0x51, 0xe9, 0x33, 0xa5, 0xfe, 0x38, 0x8c, 0x81, 0x3d, 0x73, 0xd2,
0x49, 0x20, 0x37, 0xb8, 0x33, 0x05, 0x41, 0x6f, 0x8a, 0x72, 0x6e, 0x8b, 0x62, 0x59, 0x2c, 0xc2,
0x29, 0xac, 0x04, 0xbc, 0x7f, 0x57, 0x00, 0xf7, 0xc7, 0x30, 0xa5, 0x2b, 0x71, 0x0f, 0x6f, 0x8b,
0xcb, 0x44, 0x18, 0x39, 0x61, 0x2c, 0xb8, 0x60, 0xcb, 0x41, 0xd6, 0x9f, 0x06, 0x7a, 0x70, 0xea,
0x79, 0xfd, 0xb3, 0x38, 0x60, 0xc0, 0x79, 0x9f, 0x8a, 0x31, 0x3e, 0x44, 0x9b, 0x29, 0x15, 0xe3,
0x8e, 0x71, 0x68, 0x1c, 0x6d, 0xbb, 0xed, 0x8b, 0xcb, 0x83, 0x8d, 0xf9, 0xe5, 0xc1, 0xa6, 0xb4,
0x11, 0x65, 0xc1, 0x8f, 0x50, 0x53, 0xfe, 0x7a, 0xcf, 0x52, 0xe8, 0xd4, 0x95, 0x57, 0x67, 0x7e,
0x79, 0xd0, 0xec, 0xeb, 0xbd, 0x7f, 0x2a, 0xdf, 0xa4, 0xf0, 0xc4, 0x5f, 0xa2, 0xad, 0x21, 0xf5,
0x27, 0x10, 0x8f, 0x3a, 0xb5, 0x43, 0xe3, 0xa8, 0xd5, 0x3d, 0xb6, 0xff, 0xb3, 0x87, 0xb6, 0x3e,
0x94, 0x9b, 0x07, 0xb9, 0x0f, 0xf4, 0x49, 0xb6, 0xf4, 0x06, 0xb9, 0x86, 0xb3, 0x26, 0x68, 0xaf,
0x52, 0x04, 0xc9, 0x22, 0xf8, 0x9c, 0x46, 0x19, 0xe0, 0x01, 0x6a, 0xc8, 0xec, 0xbc, 0x63, 0x1c,
0xd6, 0x8f, 0x5a, 0x5d, 0xfb, 0x8e, 0x7c, 0x4b, 0x44, 0xb8, 0xf7, 0x75, 0xc2, 0x86, 0x5c, 0x71,
0x92, 0x63, 0x59, 0x3f, 0xd5, 0xd0, 0x96, 0xf6, 0xc2, 0x4f, 0x50, 0x53, 0xf6, 0x7d, 0x44, 0x05,
0x55, 0x74, 0xb5, 0xba, 0xef, 0x56, 0x72, 0x14, 0x6d, 0xb0, 0xd3, 0x49, 0x20, 0x37, 0xb8, 0x2d,
0xbd, 0xed, 0xd9, 0x89, 0x7d, 0x3e, 0xfc, 0x16, 0x7c, 0xf1, 0x09, 0x08, 0xea, 0x62, 0x9d, 0x05,
0x95, 0x7b, 0xa4, 0x40, 0xc5, 0x3d, 0xb4, 0xc9, 0x53, 0xf0, 0x35, 0x63, 0x6f, 0xad, 0xc7, 0xd8,
0x20, 0x05, 0xbf, 0x6c, 0x9c, 0x5c, 0x11, 0x85, 0x82, 0x3d, 0x74, 0x8f, 0x0b, 0x2a, 0x32, 0xae,
0xda, 0xd6, 0xea, 0xbe, 0xb3, 0x26, 0x9e, 0x8a, 0x71, 0x77, 0x34, 0xe2, 0xbd, 0x7c, 0x4d, 0x34,
0x96, 0xf5, 0x63, 0x0d, 0xed, 0x2c, 0xf6, 0x0a, 0xbf, 0x87, 0x5a, 0x1c, 0xd8, 0x2c, 0xf4, 0xe1,
0x53, 0x3a, 0x05, 0x2d, 0xa5, 0xd7, 0x74, 0x7c, 0x6b, 0x50, 0x9a, 0x48, 0xd5, 0x0f, 0x07, 0x45,
0x58, 0x3f, 0x61, 0x42, 0x17, 0x7d, 0x3b, 0xa5, 0x52, 0xd9, 0x76, 0xae, 0x6c, 0xfb, 0x2c, 0x16,
0xe7, 0x6c, 0x20, 0x58, 0x18, 0x07, 0x2b, 0x89, 0x24, 0x18, 0xa9, 0x22, 0xe3, 0x2f, 0x50, 0x93,
0x01, 0x4f, 0x32, 0xe6, 0x83, 0xa6, 0x62, 0x41, 0x8c, 0xf2, 0x09, 0x90, 0x6d, 0x92, 0xba, 0x1d,
0xf5, 0x12, 0x9f, 0x46, 0x79, 0x73, 0x08, 0x3c, 0x05, 0x06, 0xb1, 0x0f, 0x6e, 0x5b, 0x0a, 0x9e,
0x68, 0x08, 0x52, 0x80, 0xc9, 0x0b, 0xd5, 0xd6, 0x5c, 0x3c, 0x8e, 0xe8, 0x2b, 0x91, 0xc8, 0x67,
0x0b, 0x12, 0x71, 0xd6, 0x6b, 0xa9, 0x3a, 0xdc, 0x6d, 0x3a, 0xb1, 0xfe, 0x30, 0xd0, 0x6e, 0xd5,
0xb1, 0x17, 0x72, 0x81, 0xbf, 0x5e, 0xa9, 0xc4, 0x5e, 0xaf, 0x12, 0x19, 0xad, 0xea, 0xd8, 0xd5,
0xa9, 0x9a, 0xd7, 0x3b, 0x95, 0x2a, 0xfa, 0xa8, 0x11, 0x0a, 0x98, 0xf2, 0x4e, 0x4d, 0xdd, 0xd5,
0xb7, 0x5f, 0xa2, 0x8c, 0xf2, 0xa2, 0x9e, 0x49, 0x04, 0x92, 0x03, 0x59, 0xbf, 0x2c, 0x15, 0x21,
0xeb, 0xc3, 0x5d, 0x84, 0xfc, 0x24, 0x16, 0x2c, 0x89, 0x22, 0x60, 0x5a, 0x97, 0x05, 0xbd, 0x8f,
0x0b, 0x0b, 0xa9, 0x78, 0xe1, 0x6f, 0x10, 0x4a, 0x29, 0xa3, 0x53, 0x10, 0xc0, 0xf8, 0x4d, 0x6f,
0xd7, 0xdd, 0x72, 0xd9, 0x91, 0xf0, 0xfd, 0x02, 0x84, 0x54, 0x00, 0xad, 0xdf, 0x0c, 0xd4, 0xd2,
0xe7, 0x7c, 0x05, 0x3c, 0x7f, 0xbc, 0xc8, 0xf3, 0x1b, 0x6b, 0xbe, 0xc1, 0x37, 0x53, 0xfc, 0x6b,
0x79, 0x74, 0xf9, 0xea, 0xca, 0xd1, 0x31, 0x4e, 0xb8, 0x58, 0x1e, 0x1d, 0xa7, 0x09, 0x17, 0x44,
0x59, 0x70, 0x86, 0x76, 0xc3, 0xa5, 0x67, 0xfa, 0xe5, 0x84, 0x5b, 0x84, 0xb9, 0x1d, 0x0d, 0xbf,
0xbb, 0x6c, 0x21, 0x2b, 0x29, 0x2c, 0x40, 0x2b, 0x5e, 0xf2, 0xde, 0x8c, 0x85, 0x48, 0x35, 0xc7,
0x0f, 0xd7, 0x1f, 0x0e, 0xe5, 0x11, 0x9a, 0xaa, 0x3a, 0xcf, 0xeb, 0x13, 0x05, 0x65, 0xfd, 0x5e,
0x2b, 0xf8, 0x50, 0x6a, 0xfb, 0xb0, 0xa8, 0x56, 0x29, 0x50, 0xbd, 0x85, 0x9b, 0x8a, 0x9b, 0xbd,
0xca, 0xc1, 0x0b, 0x1b, 0x59, 0xf1, 0xc6, 0x5e, 0x39, 0x34, 0x8d, 0xff, 0x33, 0x34, 0x5b, 0x37,
0x0d, 0x4c, 0x7c, 0x8a, 0xea, 0x22, 0xba, 0x96, 0xc0, 0x9b, 0xeb, 0x21, 0x7a, 0xbd, 0x81, 0xdb,
0xd2, 0x94, 0xd7, 0xbd, 0xde, 0x80, 0x48, 0x08, 0x7c, 0x8e, 0x1a, 0x2c, 0x8b, 0x40, 0x0e, 0x94,
0xfa, 0xfa, 0x03, 0x4a, 0x32, 0x58, 0x4a, 0x4a, 0xae, 0x38, 0xc9, 0x71, 0xac, 0xef, 0xd0, 0xfd,
0x85, 0xa9, 0x83, 0x9f, 0xa0, 0x76, 0x94, 0xd0, 0x91, 0x4b, 0x23, 0x1a, 0xfb, 0xfa, 0xce, 0x2e,
0xe9, 0xf6, 0xfa, 0xfe, 0xf5, 0x2a, 0x7e, 0x7a, 0x66, 0xed, 0xe9, 0x24, 0xed, 0xaa, 0x8d, 0x2c,
0x20, 0x5a, 0x14, 0xa1, 0xb2, 0x46, 0x7c, 0x80, 0x1a, 0x52, 0xa9, 0xf9, 0x9f, 0x86, 0x6d, 0x77,
0x5b, 0x9e, 0x50, 0x0a, 0x98, 0x93, 0x7c, 0x5f, 0x3e, 0x21, 0x1c, 0x7c, 0x06, 0x42, 0xb5, 0xb3,
0xb6, 0xf8, 0x84, 0x0c, 0x0a, 0x0b, 0xa9, 0x78, 0xb9, 0xc7, 0x17, 0x57, 0xe6, 0xc6, 0xf3, 0x2b,
0x73, 0xe3, 0xc5, 0x95, 0xb9, 0xf1, 0xc3, 0xdc, 0x34, 0x2e, 0xe6, 0xa6, 0xf1, 0x7c, 0x6e, 0x1a,
0x2f, 0xe6, 0xa6, 0xf1, 0xd7, 0xdc, 0x34, 0x7e, 0xfe, 0xdb, 0xdc, 0xf8, 0x6a, 0x4b, 0xd3, 0xf4,
0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6e, 0x54, 0x4d, 0x9d, 0x25, 0x0b, 0x00, 0x00,
}
func (m *HTTPIngressPath) Marshal() (dAtA []byte, err error) {
@ -648,6 +649,18 @@ func (m *IngressBackend) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if m.Resource != nil {
{
size, err := m.Resource.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintGenerated(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x1a
}
{
size, err := m.ServicePort.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
@ -1124,6 +1137,10 @@ func (m *IngressBackend) Size() (n int) {
n += 1 + l + sovGenerated(uint64(l))
l = m.ServicePort.Size()
n += 1 + l + sovGenerated(uint64(l))
if m.Resource != nil {
l = m.Resource.Size()
n += 1 + l + sovGenerated(uint64(l))
}
return n
}
@ -1324,6 +1341,7 @@ func (this *IngressBackend) String() string {
s := strings.Join([]string{`&IngressBackend{`,
`ServiceName:` + fmt.Sprintf("%v", this.ServiceName) + `,`,
`ServicePort:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ServicePort), "IntOrString", "intstr.IntOrString", 1), `&`, ``, 1) + `,`,
`Resource:` + strings.Replace(fmt.Sprintf("%v", this.Resource), "TypedLocalObjectReference", "v11.TypedLocalObjectReference", 1) + `,`,
`}`,
}, "")
return s
@ -1939,6 +1957,42 @@ func (m *IngressBackend) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Resource", 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.Resource == nil {
m.Resource = &v11.TypedLocalObjectReference{}
}
if err := m.Resource.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:])

View File

@ -96,10 +96,18 @@ message Ingress {
// IngressBackend describes all endpoints for a given service and port.
message IngressBackend {
// Specifies the name of the referenced service.
// +optional
optional string serviceName = 1;
// Specifies the port of the referenced service.
// +optional
optional k8s.io.apimachinery.pkg.util.intstr.IntOrString servicePort = 2;
// Resource is an ObjectRef to another Kubernetes resource in the namespace
// of the Ingress object. If resource is specified, serviceName and servicePort
// must not be specified.
// +optional
optional k8s.io.api.core.v1.TypedLocalObjectReference resource = 3;
}
// IngressClass represents the class of the Ingress, referenced by the Ingress

View File

@ -252,10 +252,18 @@ type HTTPIngressPath struct {
// IngressBackend describes all endpoints for a given service and port.
type IngressBackend struct {
// Specifies the name of the referenced service.
ServiceName string `json:"serviceName" protobuf:"bytes,1,opt,name=serviceName"`
// +optional
ServiceName string `json:"serviceName,omitempty" protobuf:"bytes,1,opt,name=serviceName"`
// Specifies the port of the referenced service.
ServicePort intstr.IntOrString `json:"servicePort" protobuf:"bytes,2,opt,name=servicePort"`
// +optional
ServicePort intstr.IntOrString `json:"servicePort,omitempty" protobuf:"bytes,2,opt,name=servicePort"`
// Resource is an ObjectRef to another Kubernetes resource in the namespace
// of the Ingress object. If resource is specified, serviceName and servicePort
// must not be specified.
// +optional
Resource *v1.TypedLocalObjectReference `json:"resource,omitempty" protobuf:"bytes,3,opt,name=resource"`
}
// +genclient

View File

@ -62,6 +62,7 @@ var map_IngressBackend = map[string]string{
"": "IngressBackend describes all endpoints for a given service and port.",
"serviceName": "Specifies the name of the referenced service.",
"servicePort": "Specifies the port of the referenced service.",
"resource": "Resource is an ObjectRef to another Kubernetes resource in the namespace of the Ingress object. If resource is specified, serviceName and servicePort must not be specified.",
}
func (IngressBackend) SwaggerDoc() map[string]string {

View File

@ -33,7 +33,7 @@ func (in *HTTPIngressPath) DeepCopyInto(out *HTTPIngressPath) {
*out = new(PathType)
**out = **in
}
out.Backend = in.Backend
in.Backend.DeepCopyInto(&out.Backend)
return
}
@ -102,6 +102,11 @@ func (in *Ingress) DeepCopyObject() runtime.Object {
func (in *IngressBackend) DeepCopyInto(out *IngressBackend) {
*out = *in
out.ServicePort = in.ServicePort
if in.Resource != nil {
in, out := &in.Resource, &out.Resource
*out = new(v1.TypedLocalObjectReference)
(*in).DeepCopyInto(*out)
}
return
}
@ -278,7 +283,7 @@ func (in *IngressSpec) DeepCopyInto(out *IngressSpec) {
if in.Backend != nil {
in, out := &in.Backend, &out.Backend
*out = new(IngressBackend)
**out = **in
(*in).DeepCopyInto(*out)
}
if in.TLS != nil {
in, out := &in.TLS, &out.TLS

View File

@ -44,27 +44,37 @@
"ingressClassName": "19",
"backend": {
"serviceName": "20",
"servicePort": "21"
"servicePort": "21",
"resource": {
"apiGroup": "22",
"kind": "23",
"name": "24"
}
},
"tls": [
{
"hosts": [
"22"
"25"
],
"secretName": "23"
"secretName": "26"
}
],
"rules": [
{
"host": "24",
"host": "27",
"http": {
"paths": [
{
"path": "25",
"pathType": "",
"path": "28",
"pathType": ")晿\u003co,c鮽ort昍řČ",
"backend": {
"serviceName": "26",
"servicePort": -783752440
"serviceName": "29",
"servicePort": 1973774989,
"resource": {
"apiGroup": "30",
"kind": "31",
"name": "32"
}
}
}
]
@ -76,8 +86,8 @@
"loadBalancer": {
"ingress": [
{
"ip": "27",
"hostname": "28"
"ip": "33",
"hostname": "34"
}
]
}

View File

@ -31,24 +31,32 @@ metadata:
uid: "7"
spec:
backend:
resource:
apiGroup: "22"
kind: "23"
name: "24"
serviceName: "20"
servicePort: "21"
ingressClassName: "19"
rules:
- host: "24"
- host: "27"
http:
paths:
- backend:
serviceName: "26"
servicePort: -783752440
path: "25"
pathType: ""
resource:
apiGroup: "30"
kind: "31"
name: "32"
serviceName: "29"
servicePort: 1973774989
path: "28"
pathType: )晿<o,c鮽ort昍řČ
tls:
- hosts:
- "22"
secretName: "23"
- "25"
secretName: "26"
status:
loadBalancer:
ingress:
- hostname: "28"
ip: "27"
- hostname: "34"
ip: "33"

View File

@ -44,27 +44,37 @@
"ingressClassName": "19",
"backend": {
"serviceName": "20",
"servicePort": "21"
"servicePort": "21",
"resource": {
"apiGroup": "22",
"kind": "23",
"name": "24"
}
},
"tls": [
{
"hosts": [
"22"
"25"
],
"secretName": "23"
"secretName": "26"
}
],
"rules": [
{
"host": "24",
"host": "27",
"http": {
"paths": [
{
"path": "25",
"pathType": "",
"path": "28",
"pathType": ")晿\u003co,c鮽ort昍řČ",
"backend": {
"serviceName": "26",
"servicePort": -783752440
"serviceName": "29",
"servicePort": 1973774989,
"resource": {
"apiGroup": "30",
"kind": "31",
"name": "32"
}
}
}
]
@ -76,8 +86,8 @@
"loadBalancer": {
"ingress": [
{
"ip": "27",
"hostname": "28"
"ip": "33",
"hostname": "34"
}
]
}

View File

@ -31,24 +31,32 @@ metadata:
uid: "7"
spec:
backend:
resource:
apiGroup: "22"
kind: "23"
name: "24"
serviceName: "20"
servicePort: "21"
ingressClassName: "19"
rules:
- host: "24"
- host: "27"
http:
paths:
- backend:
serviceName: "26"
servicePort: -783752440
path: "25"
pathType: ""
resource:
apiGroup: "30"
kind: "31"
name: "32"
serviceName: "29"
servicePort: 1973774989
path: "28"
pathType: )晿<o,c鮽ort昍řČ
tls:
- hosts:
- "22"
secretName: "23"
- "25"
secretName: "26"
status:
loadBalancer:
ingress:
- hostname: "28"
ip: "27"
- hostname: "34"
ip: "33"